更新日:、 作成日:

VBA Asc 関数:文字コードを取得する

はじめに

Excel VBA マクロの Asc 関数と AscW 関数から文字コードを取得する方法を紹介します。

Asc 関数は、指定した文字の文字コード (Shift_JIS) を返します。

AscW 関数は、指定した文字の Unicode (UTF-16) を返します。

半角文字なら 0 ~ 255 の範囲を返します。A なら 65 を返します。ASCII コードと同じ値です。

Unicode のサロゲートペア文字 𩸽 の文字コードは上位 -10137 と下位 -8643 です。

文字コードを取得や判定したいときに使用します。

文字コードを変換するには「文字コードを変換や判定する」をご覧ください。

Asc 関数、AscW 関数の引数と戻り値

Asc(文字列)
文字列の先頭の文字の文字コード (Shift_JIS) を取得します。

引数「文字列」文字列を指定します。
戻り値の型数値型 (Integer)

AscW(文字列)
文字列の先頭の文字の Unicode (UTF-16) を取得します。

引数「文字列」文字列を指定します。
戻り値の型数値型 (Integer)

解説

Asc 関数

戻り値は Shift_JIS の文字コードです。

引数「文字列」の 1 文字目の文字コードを返します。

引数「文字列」が半角のときは 0 ~ 255 の範囲を返します。ASCII コードと同じ値です。全角のときは -32768 ~ 32767 の範囲を返します。

Shift_JIS に存在しない文字の文字コードは ? の 63 を返します。これを利用して、その文字が Shift_JIS の文字か Unicode 文字かを判定できます。

引数「文字列」が空文字の時は「エラー 5 プロシージャの呼び出し、または引数が不正です。」が発生します。

取得した文字コードを文字に変換するには「Chr 関数」を使用します。

AscW 関数

戻り値は Unicode (UTF-16) の文字コードです。Long 型で取得するには CUInt 関数を作成します。

引数「文字列」の 1 文字目の文字コードを返します。

引数「文字列」が半角英数字のときは 0 ~ 127 の範囲を返します。ASCII コードと同じ値です。

引数「文字列」が空文字の時は「エラー 5 プロシージャの呼び出し、または引数が不正です。」が発生します。

Unicode のサロゲートペア文字は 2 文字として扱います。𩸽 の文字コードは上位 -10137 と下位 -8643 です。負の値になっているのは、戻り値の型が Integer のためです。

上位と下位を結合した 171581 (&H29E3D) は取得できません。Excel の「エクセル UNICODE 関数:文字の Unicode を取得する」を使用して取得できます。詳しくは「文字コードを変換や判定する」をご覧ください。

取得した Unicode (UTF-16) を文字に変換するには「ChrW 関数」を使用します。

数値を 16 進数に変換するには「Hex 関数」を使用します。

使用例、Asc 関数

Asc 関数の使用例を紹介します。

文字コードを取得する

文字コード (Shift_JIS) を取得します。

Dim i As Integer
i = Asc("0")
Debug.Print(i) ' 48

i = Asc("9")
Debug.Print(i) ' 57

i = Asc("A")
Debug.Print(i) ' 65

i = Asc("Z")
Debug.Print(i) ' 90

i = Asc("a")
Debug.Print(i) ' 97

i = Asc("z")
Debug.Print(i) ' 122

i = Asc("あ")
Debug.Print(i) ' -32096

i = Asc("あいう") ' 1 文字目の「あ」のコードを取得する
Debug.Print(i) ' -32096

i = Asc("")    ' エラー

文字列の全ての文字コードを取得する

文字列の全ての文字コードを取得します。

Dim s As String ' 文字列
s = "ABC"

Dim i As Integer
Dim char As String
Dim code As Integer

' 1 文字ずつ取得する
For i = 1 To Len(s)
    char = Mid(s, i, 1)
    code = Asc(char)
    Debug.Print(code) ' 65 66 67
Next

文字コードを文字に変換する

文字コード (Shift_JIS) を文字に変換します。

Dim s As String
s = Chr(48)
Debug.Print(s) ' 0

s = Chr(65)
Debug.Print(s) ' A

s = Chr(-32096)
Debug.Print(s) ' あ
Shift_JIS に存在する文字か判定するためには「文字コードを変換や判定する」をご覧ください。

使用例、AscW 関数

AscW 関数の使用例を紹介します。

Unicode を取得する

Unicode (UTF-16) を取得します。

Dim i As Integer
i = AscW("0")
Debug.Print(i) ' 48

i = AscW("9")
Debug.Print(i) ' 57

i = AscW("A")
Debug.Print(i) ' 65

i = AscW("Z")
Debug.Print(i) ' 90

i = AscW("a")
Debug.Print(i) ' 97

i = AscW("z")
Debug.Print(i) ' 122

i = AscW("あ")
Debug.Print(i) ' 12354

i = AscW(ChrW(38960)) ' 頰、Unicode 文字
Debug.Print(i) ' -26576、Integer なので負の値になる

サロゲートペア文字の Unicode を取得する

サロゲートペア文字の上位と下位を Unicode (UTF-16) で取得します。

Dim s As String
s = WorksheetFunction.Unichar(171581) ' 𩸽、サロゲートペア文字

Dim high As Integer ' 上位コード
Dim low As Integer  ' 下位コード
high = AscW(Mid(s, 1, 1))
low = AscW(Mid(s, 2, 1))
Debug.Print(high) ' -10137、上位コード
Debug.Print(low)  ' -8643、下位コード

Range("A1").Value = ChrW(high) & ChrW(low) ' 𩸽

サロゲートペア文字の結合された Unicode (UTF-16) を取得します。

Dim s As String
Dim d As Double

s = WorksheetFunction.Unichar(171581) ' 𩸽
d = WorksheetFunction.Unicode(s)
Debug.Print(d) ' 171581

s = WorksheetFunction.Unichar(128515) ' 😃
d = WorksheetFunction.Unicode(s)
Debug.Print(d) ' 128515

戻り値が Integer なので負の値になるときがあります。これを Long として正の値にするには CUInt 関数を作成して変換できます。

Sub 実行()
    Dim s As String
    s = WorksheetFunction.Unichar(171581) ' 𩸽

    Dim high As Long ' 上位コード
    Dim low As Long  ' 下位コード
    high = CUInt(AscW(Mid(s, 1, 1)))
    low = CUInt(AscW(Mid(s, 2, 1)))
    Debug.Print(high) ' 55399、上位コード
    Debug.Print(low)  ' 56893、下位コード

    Range("A1").value = ChrW(high) & ChrW(low) ' 𩸽
End Sub

' 符号あり Integer を 符号なし UInteger に変換します。
Function CUInt(ByVal value As Integer) As Long

    ' value が正の値のときはそのまま
    If value >= 0 Then
        CUInt = value
        Exit Function
    End If

    ' 負の値のときは UInteger の最大値 + 1 の値を加える
    CUInt = value + 65536
End Function