古庄 潤(ふるしょう じゅん)
本業はエンジニア。ICに様々な機械をつなぎ,電流やら電圧を測定する。もちろん,これらの測定器もVBAでコントロールし,取り込んだデータもマクロで処理する。人呼んで,マクロの鬼軍曹!
今回のサンプルは、Excel2003/Excel2007での動作を確認しています

「先生、前回の続きですね?」
「うむ、前回時間切れになったからな」
「時間切れって・・・」
「大人の都合じゃ」
「あ!これ?」
「まぁ・・・そのぉ・・・」
「それは誰かの声帯模写ですか?」
「田中角栄じゃないか」
「誰です?その田中なんとかっておっさんは」
「そうかぁ、君は田中角栄を知らない世代なんだな。元総理大臣だった人じゃ」
「へぇ~」
「昔は、大受けだったんだがなぁ」
「はいはい!わっはっは。これでいいですか」
「傷つくなぁ」
「本題に入ってください」
「はい」

今月の相談
 組み込みのマイコンを使ってハードウエアをコントロールしています。マイコンとの間では、バイナリーやヘックスで数値のやり取りをするのですが、数値の変換で行き詰っています。Excelの関数では桁数が足りません。ドクター、どうかお助けを!

「分かりました。まずは、10進数を16進数に変改するマクロから。ちちんぷいぷいのえい!」

リスト1●10進数を16進数に変換するマクロ
Function DEC_TO_HEX_A(DEC_VALUE As Long, myHexDigits As Integer) As String
    Dim myVALUE As Long
    Dim myRess As Double
    Dim myDEC_BIT As Long
    Dim myHEX_1BIT As String
    Dim i As Integer

    myVALUE = DEC_VALUE    '<--------(1)

    For i = myHexDigits To 1 Step -1    '<--------(2)
        myVALUE = myVALUE Mod (16 ^ i)    '<--------(3)
        myDEC_BIT = Int(myVALUE / (16 ^ (i - 1)))    '<--------(4)

        Select Case myDEC_BIT    '<--------(5)
            Case 0 To 9
                myHEX_1BIT = CStr(myDEC_BIT)    '<--------(6)
            Case 10
                myHEX_1BIT = "A"    '<--------(7)
            Case 11
                myHEX_1BIT = "B"    '<--------(8)
            Case 12
                myHEX_1BIT = "C"    '<--------(9)
            Case 13
                myHEX_1BIT = "D"    '<--------(10)
            Case 14
                myHEX_1BIT = "E"    '<--------(11)
            Case 15
                myHEX_1BIT = "F"    '<--------(12)
        End Select
        DEC_TO_HEX_A = DEC_TO_HEX_A & myHEX_1BIT    '<--------(13)
    Next i
End Function
【コードの解説】
(1)引数DEC_VALUEで受け取った10進数の数値を変数myVALUEに代入します
(2)引数myHexDigitsで受け取った16進数の桁数の数だけ繰り返すループです。Stepが“-1”なので、カウンター変数iは、myHexDigitsから“1”づつ減って“1”になったところで終了します
(3)変数myVALUEに代入した10進数の数値を16のべき乗で割り、その余りを求め変数myVALUEに代入します
(4)変数myVALUEに代入した10進数の数値を16のべき乗で割り、Int関数でその整数部を求め変数myDEC_BITに代入します
(5)変数myDEC_BITの値で条件分岐します
(6)変数myDEC_BITの値が0~9の場合は、そのままCstr関数で文字列に変換して、変数myHEX_1BITに代入します
(7)変数myDEC_BITの値が10の場合は、変数myHEX_1BITに“A”を代入します
(8)変数myDEC_BITの値が11の場合は、変数myHEX_1BITに“B”を代入します
(9)変数myDEC_BITの値が12の場合は、変数myHEX_1BITに“C”を代入します
(10)変数myDEC_BITの値が13の場合は、変数myHEX_1BITに“D”を代入します
(11)変数myDEC_BITの値が14の場合は、変数myHEX_1BITに“E”を代入します
(12)変数myDEC_BITの値が15の場合は、変数myHEX_1BITに“F”を代入します
(13)変数DEC_TO_HEX_Aに格納されている文字列に、変数myHEX_1BITに格納した文字列を結合して変数DEC_TO_HEX_Aに代入します

「先生、解説をお願いします」
「うむ、2進数を10進数に変換するマクロと同様に、推移表を作ってみた」
「はい」

表1●10進数を16進数に変換するマクロの推移表。ループの回数と、変数の中身および計算の結果
表1
[画像のクリックで拡大表示]

「“myVALUE Mod (16 ^ i)”が、(3)のステートメントの結果。“Int(myVALUE / (16 ^ (i - 1)))”が、(3)のステートメントの結果じゃ」
「なるほど・・・1回目の(3)のステートメントは無駄ではありませんか?」
「ドキッ!」
「さては、図星ですね?」
「その通り。ループの1回目で(3)のステートメントは必要ない」
「じゃあ、なんで?」
「Ifステートメントで条件分岐してもよいのじゃが、計算結果は同じじゃ。よって、余計なステートメントは省いたので、このようなマクロになった」
「じゃあ、ループの最後にもってくれば?」
「さらに、ドキッ!」
「まぁ・・・そのぉ・・・」
「わっはっは。満足ですか?」
「しょんぼり」

「(5)~(12)のコードは、ちょっとダサい」
「ほほぅ、君ならどう書く?」
「はい、このように。ちちんぷいぷいの・・・うりゃ!」