【VBA】Asc関数
VBA の Asc は指定した文字を ASCII コード に対応する数値に変換する関数です。たとえば小文字のアルファベットの a と z を表す文字コードを知りたいときは次のように記述します。
'[VBA] Ascで小文字アルファベットのASCIIコードを調べる Sub Asc_Lowercase() Debug.Print Asc("a"); Asc("z") End Sub 'Asc_Lowercaseの実行結果: '97 122
Asc_Lowercase() を実行すると「97 122」という数値が返ってくるので、小文字のアルファベットには 97 ~ 122 という数値が対応していると推測できるのです。ついでに大文字のアルファベットの文字コードも調べておきましょう。
'[VBA] Ascで大文字アルファベットのASCIIコードを調べる Sub Asc_Uppercase() Debug.Print Asc("A"); Asc("Z") End Sub 'Asc_Uppercaseの実行結果: '65 90
Asc_Uppercase() を実行すると「65 90」という数値が返ってくるので、大文字アルファベットには 65 ~ 90 の数値が割り当てられていることがわかります。次はひらがなの「あ」と「ん」を調べてみます。
'[VBA] Ascでひらがなの「あ」と「ん」のASCIIコードを調べる Sub Asc_Hiragana() Debug.Print Asc("あ"); Asc("ん") End Sub 'Asc_Hiraganaの実行結果: '-32096 -32015
Asc_Hiragana() を実行すると「-32096 -32015」という数値が返ってきます。
【VBA】Chr関数
VBA の Chr は Asc関数とは逆に、指定した ASCII コードを対応する文字列に変換する関数です。
'[VBA] ChrでASCIIコード97に対応する文字を取得 Sub Chr_Test_1() Debug.Print Chr(97) End Sub 'Chr_Test_1の実行結果: 'a
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 え
Chr_Test_2 を実行すると各コードに対応するひらがながずらずら並びます(やっぱり目がちかちかするけどね)。
≫【VBA】Lenで文字数をカウント
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 'ALPHABET_FREQUENCYの実行結果: 'a:3335 b:3349 c:3316
ALPHABET() には乱数が組込まれているので、実行結果は毎回異なりますが、どの文字もおおよそ 3333 回ぐらいになっているはずです。
コメント