【VBA】Asc・Chr (ASCIIコードと文字列の変換)

【VBA】Asc関数

 Asc は指定した文字を ASCII コード に対応する数値に変換する関数です。たとえば小文字のアルファベットの a と z を表す文字コードを知りたいときは次のように記述します。

'[VBA] Ascで小文字アルファベットのASCIIコードを調べる
Sub Asc_Lowercase()
  Debug.Print Asc("a"); Asc("z")
End Sub

 Asc_Lowercase() を実行すると「 97 122 」という数値が返ってくるので、小文字のアルファベットには 97 ~ 122 という数値が対応していると推測できるのです。ついでに大文字のアルファベットの文字コードも調べておきましょう。

'[VBA] Ascで大文字アルファベットのASCIIコードを調べる
Sub Asc_Uppercase()
  Debug.Print Asc("A"); Asc("Z")
End Sub

 Asc_Uppercase() を実行すると「 65 90 」という数値が返ってきます。なので大文字アルファベットには 65 ~ 90 の数値が割り当てられていることがわかります。次はひらがなの「あ」と「ん」を調べてみます。

'[VBA] Ascでひらがなの「あ」と「ん」のASCIIコードを調べる
Sub Asc_Hiragana()
  Debug.Print Asc("あ"); Asc("ん")
End Sub

 Asc_Hiragana() を実行すると「 -32096 -32015 」という数値が返ってきます。

【VBA】Chr関数

 Chr は Asc関数とは逆に、指定した ASCII コードを対応する文字列に変換する関数です。

'[VBA] ChrでASCIIコード97に対応する文字を取得
Sub Chr_Test_1()
  Debug.Print Chr(97)
End Sub

 Chr_Test_1() を実行すると「 a 」という小文字アルファベットが返ってきます。さきほど Asc関数でひらがなには -32096 ~ -32015 という数値が対応していることを調べましたが、具体的にどんなふうに割り当てられているか知りたいときは、ヘルプの ASCII コードを眺めるか(目がちかちかするけどね)、次のようなマクロを書いて調べます。

'[VBA] ChrでASCIIコードに対応する文字を調べる
Sub Chr_Test_2()
  For i = -32096 To -32015
    Debug.Print i; Chr(i)
  Next i
End Sub

 Chr_Test_2 を実行すると

 -32096 あ
 -32095 ぃ
 -32094 い
 -32093 ぅ
 -32092 う
 -32091 ぇ
 -32090 え

というように各コードに対応するひらがながずらずら並びます(やっぱり目がちかちかするけどね)。

ALPHABET 関数

 Chr 関数を使って、26文字のアルファベットをランダムに選ぶ関数を作ってみました。他の関数と組合わせると色々なことに応用がきくので重宝しています。

'[VBA] アルファベットをランダムに選ぶ関数

Function ALPHABET(Optional n As Long = 26) As String

  Dim rd As Long

  '0~nの整数乱数
  rd = Int(Rnd * n)

  'ASCIIコードrd+97に対応する文字列を取得
  ALPHABET = Chr(rd + 97)

End Function

 ALPHABET 関数の引数 n はオプションで、デフォルトでは 26 に設定してあります。26 はアルファベットの文字数です。適当なセルに

=ALPHABET()

と入力すると、a から z の 26 文字の中から無作為に 1 文字が選ばれます。ユーザーが n を指定することで、アルファベットの範囲を設定できます。たとえば、

=ALPHABET(3)

と入力すると、a, b, c の中から 1 文字がそれぞれ約 33 % の確率で選び出されます。以下のコードを実行すると、ALPHABET(3) を 10000 回呼び出して、a, b, c がそれぞれ何回出力されたかを確認できます。

'[VBA] a,b,cの出力回数の頻度を調査

Sub ALPHABET_FREQUENCY()

  Dim i As Long
  Dim abc As String
  Dim cta As Long, ctb As Long, ctc As Long

  For i = 1 To 10000

    abc = ALPHABET(3)

    If abc = "a" Then
      cta = cta + 1
    ElseIf abc = "b" Then
      ctb = ctb + 1
    Else
      ctc = ctc + 1
    End If

  Next i

  Debug.Print "a:" & cta; " b:" & ctb; " c:" & ctc

End Sub
a:3335 b:3349 c:3316

 ALPHABET() には乱数が組込まれているので、実行結果は毎回異なりますが、どの文字もおおよそ 3333 回ぐらいになっているはずです。

Excel VBA
Excel VBA 表計算とプログラミング学習サイト

コメント

タイトルとURLをコピーしました