Excel VBAの「Char関数」について解説します。
Chr関数とは
Excel VBA の Chr関数とは、指定した文字コード(charcode)と関連付けられている文字を含む String を返す関数です。
Chr 関数(Visual Basic for Applications リファレンス)
構文(引数と戻り値)
Excel VBAの関数を使いこなすには、関数の構文を理解しておくことが重要です。
構文
Chr(charcode)
ChrB(charcode)
ChrW(charcode)
※ (charcode) は (文字コード) のことです。
引数と戻り値
引数:(charcode) は文字を特定するための値を指定します。省略不可です。
- charcode に指定する値は、長整数型 (Long) の数値 または 数値式を指定します。
戻り値:charcode の値によって 各関数が返す値は次のとおりです。
関数名 | charcode | 返す値(型) |
---|---|---|
Chr | Shift_JIS 文字コード | 文字コードに対応した文字列型の値を返します。 |
ChrB | 1バイトのコード (範囲 0~255) | 文字ではなく 1 バイト データを返します。 |
ChrW | Unicode(UTF-16) 文字コード | Unicodeを使用したシステムでは、 文字コードに対応した文字列型の値を返します。 |
解説
文字コードを文字に変換する関数は「Chr」「ChrB」「ChrW」の3種類あります。それぞれについて解説していきます。
Chr関数
Shift_JIS の文字コードを文字に変換する関数です。
引数の「文字コード」が 0 ~ 255 は半角文字です。それ以外のときは全角文字です。
文字コード(ASCIIコードと同じ) 0 ~ 31 の範囲は制御文字ですので表示されませんし、印刷もできません。しかし、InputBox や MsgBox などに表示する文字列内に制御文字を指定することでタブや改行などの表現を加えることができます。
※ 文字列から文字コードを取得するには「Asc関数」を使用します。
制御文字を使う場合
次の表は、制御文字のChr関数とvb定数(制御文字)の対比表です。VBAコード内で制御文字を使う場合は、どちらを使っても同じ結果を得られます。
Chr(文字コード) | vb定数 | 説明 |
---|---|---|
Chr(0) | vbNullChar | Null 文字、データーベースの NULL とは違う |
Chr(8) | vbBack | バックスペース |
Chr(9) | vbTab | タブ |
Chr(10) | vbLf | ラインフィード |
Chr(11) | vbVerticalTab | 垂直タブ |
Chr(12) | vbFormFeed | フォームフィード、印刷の改ページ |
Chr(13) | vbCr | キャリッジリターン |
Chr(13) & Chr(10) | vbCrLf | 改行、vbCr と vbLf を結合した文字 |
Chr(13) & Chr(10) | vbNewLine | 改行、OS の改行コードに合わせた文字 |
表せない | vbNullString | 初期化されていない文字、長さ 0 の文字、 空文字””とは違う |
VBAのエスケープ文字「"
」
VBAコードで、文字列を入力する際は「"ダブルクォーテーション"
」で括ります。
「"
」は、VBAのエスケープ文字です。エスケープ文字とは特別な「意味を無効にしてくれる文字、あるいは、意味を付与する」ための文字です。「"
」の場合は「"文字列"
」のように両端を括ることで、挟まれた間の部分は「文字列」との意味を付与するように、必ず 2つセットで使います。
では、文字列内で「"
」を文字として表示したい場合は次のようにする必要があります。
ダブルクォーテーションを「""
」と2つ続けて書きます。文字列内でダブルコーテーション「"
」が2つ続いた場合には、1つ目の「"
」は、次の「"
」に対するエスケープ文字の役割として働き「"
」を文字として認識してくれます。こんな感じです「"これは""文字列""です"
」
「""
」のように「"
」だけを単独で表示させたい場合は「""""""
」と書きます。4個でなく何故 6個なのかと思われるでしょうが、両端の「"
」は文字列を表示させる意味の「"
」だからです。
Chr関数で「”」を表示する
「"
」の文字コードは「34」です。Chr(34) を使って「"
」を表示させることができます。
先ほどの例で試してみましょう。
Sub chr_sample01()
Debug.Print "これは文字列です"
Debug.Print "これは""文字列""です"
Debug.Print """これは文字列です"""
Debug.Print "「""」"
Debug.Print """"""
Debug.Print "「" & Chr(34) & "」"
Debug.Print Chr(34) & Chr(34)
End Sub
見てお分かりのように Chr(34) を使う場合、文字列をつなぐ「&
」と「"
」が必要になります。
Chr関数サンプル
Sub chr_sample02()
'半角文字
Debug.Print Chr(Asc("1")) '49
Debug.Print Chr(Asc("a")) '97
Debug.Print Chr(Asc("A")) '65
Debug.Print Chr(Asc("ABC")) '65
Debug.Print Chr(Asc(" ABC")) '32
'Chrで改行
Debug.Print "Chr" & Chr(13) & Chr(10) & "関数"
'全角文字
Debug.Print Chr(Asc("1")) '-32176
Debug.Print Chr(Asc("а")) '-31632
Debug.Print Chr(Asc("A")) '-32160
Debug.Print Chr(Asc("あ")) '-32096
Debug.Print Chr(Asc("愛")) '-30556
Debug.Print Chr(Asc("あい")) '-32096
Debug.Print Chr(Asc(" あい")) '-32448
'VB定数で改行
Debug.Print "Chr" & vbCrLf & "関数"
End Sub
スペースの部分は見えていませんが、書き出されています(^^;
※ 文字列から文字コードを取得する「Asc関数」についてはこちらをご覧ください。
ChrB関数
ChrB関数は、指定した文字コードに対応するバイトデータを示す文字列型の値を返します。
次のサンプルコードでは、ChrB(i)はイミディエイトに表示されないので MsgBox で表示します。
Sub ChrB_Sample01()
Dim res As String, i As Long
For i = 33 To 98 Step 5
res = "ChrB(" & i & ")= " & ChrB(i)
MsgBox res '結果を表示します
Next i
End Sub
ChrW関数
ChrW関数は、Unicode (UTF-16) の文字コードを文字に変換する関数です。
引数「文字コード」が 0 ~ 127 は半角文字です。それ以外のときは全角文字です。
次のサンプルコードでは、全角文字の部分だけにしています。
Sub ChrW_Sample01()
Dim reW
'開始
Debug.Print "ChrW関数サンプル_START"
'全角文字
reW = AscW("1") '-239
Debug.Print "ChrW(" & reW & ")= " & ChrW(reW)
reW = AscW("а") '1072
Debug.Print "ChrW(" & reW & ")= " & ChrW(reW)
reW = AscW("A") '-223
Debug.Print "ChrW(" & reW & ")= " & ChrW(reW)
reW = AscW("あ") '12354
Debug.Print "ChrW(" & reW & ")= " & ChrW(reW)
reW = AscW("愛") '24859
Debug.Print "ChrW(" & reW & ")= " & ChrW(reW)
reW = AscW("あい") '12354
Debug.Print "ChrW(" & reW & ")= " & ChrW(reW)
reW = AscW(" あい") '12288
Debug.Print "ChrW(" & reW & ")= " & ChrW(reW)
reW = AscW("1")
'終了
Debug.Print "ChrW関数サンプル_END"
End Sub
全角スペースの部分は見えていませんが、文字コードが12288であることが確認できますね(^^)
サロゲートペアとは
サロゲートペア文字(もしくはサロゲート文字)とは、通常は「1文字=2bytes」のところ、「1文字=4bytes」となることがある文字のことです。Unicode のサロゲートペア文字は 2 文字として扱います。例えば「吉」(士+口) ではなく「𠮷」(土+口) を入力するには、上位バイトのコードと下位バイトのコードをそれぞれ ChrW関数で変換してから結合します。
次のコードは、セルに貼り付けてある「サロゲートペア文字」を処理するサンプルです。
'サロゲートペア文字生成サンプル
Sub ChrW_sample02()
Dim str As String
Dim unic As Long, i As Integer
Dim high As Integer '上位バイトコード
Dim low As Integer '下位バイトコード
With WorksheetFunction
For i = 3 To 10
'対象セルの文字からUnicodeの文字コードを取得
unic = .Unicode(Cells(i, 1))
'文字コードから変換した文字を変数に代入
str = .Unichar(unic)
high = AscW(Mid(str, 1, 1))
low = AscW(Mid(str, 2, 1))
Cells(i, 4) = (high) '上位コード書き込み
Cells(i, 5) = (low) '下位コード書き込み
'サロゲートペア文字をセルに書き込む
Cells(i, 6) = ChrW(high) & ChrW(low)
Next
End With
End Sub
・11行目でWorksheetFunctionでExcel関数の「UNICODE関数」でコードを取得します。
・「𠮷」からUNICODE関数で取得したコード 134071 (&H20BB7) のままではChrW関数で文字に変換できません。
・13行目は、同じく Excel関数の「UNICHAR関数」でコードを文字に変換して変数に代入します。
・14行目で「上位バイトのコード」を取得して height 変数に代入します。
「サロゲートペア」の上位部分を Mid関数を使って取り出しAscW関数でコードを取得しています。
・15行目で「下位バイトのコード」を取得して low 変数に代入します。
「サロゲートペア」の下位部分を同じく Mid関数で取り出しAscW関数でコードを取得しています。
・16, 17行目で「上位バイトのコード」と「下位バイトのコード」をセルに書き込んでいます。
・19行目で「上位バイトのコード」と「下位バイトのコード」をそれぞれ ChrW関数で変換してから結合しています。そして、結合した「サロゲートペア文字」をセルに書き込んでいます。
※ Unicode (UTF-16) の文字コードを取得するには「AscW 関数」を使用します。
Chr関数を使っている例
Chr関数を利用している過去の記事はたくさんありますが、その一つがこちらです。
おわりに
Excel VBA「Chr関数」「ChrB関数」「ChrW関数」は、指定した文字コード(charcode)と関連付けられている文字を含む String を返す関数です。それぞれの使用方法について解説しました。
「Chr関数」で制御文字を使う場合について、vb定数でも同じ処理ができるので状況によって使い分けるようにしましょう。特に、VBAのエスケープ文字「"
」に変わる Chr(34)は覚えておきましょう。
「ChrB関数」については、使いどころが今一つ思いついていません。文字ではない「文字のバイトデータ」として使うときは「ChrB関数」ということです。
「ChrW関数」については、Unicode (UTF-16) の文字コードを文字に変換する関数です。
今回紹介した「サロゲートペア文字」のように、VBAコード内でその文字を使うには、ワークシートのセルを介したり、WorksheetFunctionでExcel関数を使わないとできなかったりします。文字って非常に奥が深くて知らないことがたくさんありました。
この解説が、少しでもみなさまのお役に立てたなら幸いです(^^;
VBAサンプルファイルはダウンロードできます
このページで使用したサンプルファイルの登録はありません(^^;
ダウンロードページへトップリンクは下のカードクリックでジャンプできます。
よろしければご利用ください!