VBA에서 이모티콘 💖

유니 코드의 화려한 이모티콘을 사용하고 싶습니다.



매년 6월의 연례 릴리스가 되고 있는 Unicode입니다만, 2017년 시점의 최신판은 10.0입니다. 6.0 이후는 완전히 이모티콘이 주요 테마가 되고 있는 인상. 어지럽게 추가되므로 따라갈 수 없습니다.

오늘은 VBA에서 최신 이모티콘을 사용합시다! 라는 테마입니다.

여러분이 잘 알고 있듯이 VBA의 개발 환경은 아직 유니코드 기반이 아니므로 에디터 내에서 유니코드 문자열 리터럴을 처리할 수 없으며 디버거에서 이모티콘을 표시할 수도 없습니다.
하지만 셀이나 텍스트 상자에 이모티콘을 입력하여 표시할 수 있습니다.

Windows의 경우, Segoe UI Emoji라는 전용의 폰트가 있어, 컬러 글리프도 가지고 있습니다만, 불행히도 현행 Excel(2016)에서는 컬러 글리프는 표시할 수 없습니다.
동일한 Office 2016 응용 프로그램에서 Word 2016은 색상 글리프를 지원합니다.

← Word 2016에서는 컬러 표시

← Excel 2016에서는 흑백 표시

위에는 자연스럽게 표시했지만, 유니 코드 이모티콘은 복잡한 사양을 가지고 있으며 왼쪽 이모티콘은 UCS4에서 u + 1f600이라는 코드의 한 문자 (UTF-16에서 2 단어, UTF-8에서는 4 아르바이트)로 나타내고, 오른쪽의 가족(엄마 두 사람과 소년 2명)은 UCS4에서 u+1f469, u+1f469, u+1f466, u+1f466의 4문자를 zwj로 접속한 합자(UTF-16에서 7워드, UTF-8에서는 25바이트)라고 하는, 대단한 문자가 되어 있습니다.

이런 이모티콘에서도 Windows 10이나 Mac OS X을 비롯하여 iOS 8 이상이나 Android 7.0 이상에서는 제대로 표시됩니다! 😀👩‍👩‍👦‍👦 ← 자, 볼 수 있겠지요! ?

Excel에서 이모티콘을 입력하려면



이제 이러한 문자를 입력하기 위해 Excel에서는 삽입 탭의 기호 및 특수 문자에서 입력할 수 있습니다. 이모티콘의 경우에도 Segoe UI Emoji 글꼴을 선택하고 목록에서 입력할 수 있습니다.



하지만 여기에서 선택하는 것은 굉장히 번거로운 게다가, 일람에는 합자에 의한 이모티콘은 나오지 않습니다.

VBA에서 이모티콘 사용



앞두기가 길어졌지만 거기서 유니 코드 테이블에서 직접 이모티콘 문자열을 생성하는 VBA 코드를 만들었습니다.

emoji.xlsm
' 可変引数で16進文字コードの文字列を渡す
' 例: UCS4String("1f600", "1f469", "200d", "1f469", "200d", "1f466", "200d", "1f466")
Function UCS4String(ParamArray codes() As Variant) As String
    Dim i As Integer
    UCS4String = ""
    For i = LBound(codes) To UBound(codes)
        Dim c As Long
        If TypeName(codes(i)) = "String" Then
            c = "&H" & codes(i)
        Else
            c = CLng(codes(i))
        End If
        If c > 65535 Then
            c = c - &H10000
            UCS4String = UCS4String & ChrW(&HD800 + Int(c / &H400)) & ChrW(&HDC00 + CInt(c And &H3FF))
        Else
            UCS4String = UCS4String & ChrW(c)
        End If
    Next
End Function

유니코드 이모티콘 코드 표 에 있는 숫자를 직접 건네주면 사용할 수 있습니다.

셀의 16진수 코드를 이모티콘으로 변환



단순히 셀의 내용에 이모티콘을 넣고 싶은 경우에도 사용합시다! 그래서 선택 범위를 변환하는 코드도 써 둡니다.

emoji2.xlsm
' 選択されているセルに書かれた文字コードをUnicode文字に変換する
' セルの中身は16進数を空白で区切ったもの
' Unicodeの絵文字コード表(http://unicode.org/emoji/charts/full-emoji-list.html)
' からコピペしてもOK
' 例: U+1F468 U+1F3FB U+200D U+2708 U+FE0F
Sub ConvertUCS4()
    For i = 1 To Selection.Areas.Count
        Dim r As Range
        Set r = Selection.Areas(i)
        For j = 1 To r.Rows.Count
            For k = 1 To r.Columns.Count
                Dim els() As String, str As String
                With r.Cells(j, k)
                    els = Split(.Value, " ")
                    str = ""
                    For l = LBound(els) To UBound(els)
                        If Len(els(l)) > 1 Then ' 実質中身がない空白部はスキップ
                            ' u+xxxx形式の場合はu+部分を削除
                            If LCase(Left(els(l), 2)) = "u+" Then els(l) = Mid(els(l), 3)
                            str = str & UCS4String(els(l))
                        End If
                    Next
                    .Value = str
                End With
            Next
        Next
    Next
End Sub

좋은 웹페이지 즐겨찾기