16進数同士の計算は10進数に変換してから行う
VBAでは16進数同士を計算する場合、16進数のままでは直接計算できません。
そのため、まず16進数から10進数に変換を行ってから計算し、計算結果を16進数に戻す方法になります。
このページでは、16進数同士の足し算と引き算を行う方法を、サンプルコード付きで解説します。
なお、16進数から10進数に変換するコード、および、10進数から16進数に変換するコードは以下のページのものを編集して利用しています。詳細は以下をご参照ください。
- VBAで16進数から10進数へ変換する(新規ウィンドウで開きます)
- VBAで10進数から16進数へ変換する(新規ウィンドウで開きます)
なぜ16進数を直接計算できないのか?
VBAは数値を10進数で扱うことが基本です。
16進数の値は文字列として表現されることが多く、そのまま計算すると文字列の連結になってしまいます。
そのため、まずは16進数文字列を10進数に変換して計算し、計算結果をまた16進数に戻すという流れが必要です。
16進数の足し算・引き算を行う関数
HexToDec関数とDecToHex関数のコードは上のリンクをご参照ください。
コードの内容はコメントにほとんど書いていますが、少し補足すると、加算のHexAdd関数と減算のHexMinusの違いはコードの途中の「加算」か「減算」かの部分しかありません。
HexToDec関数が16進数文字列を10進数文字列に変換するため、それに合わせて「10進数文字列」にしていますが、HexToDec関数を編集してDouble型を直接扱うようにしてもよいと思います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
'// 16進数の加算 '// 第一引数:16進数文字列 '// 第二引数:16進数文字列 '// 第三引数:計算結果の16進数文字列 Sub HexAdd(a_sHex1 As String, a_sHex2 As String, a_sResult As String) Dim sDec1 As String '// 第一引数16進数の10進数文字列 Dim sDec2 As String '// 第二引数16進数の10進数文字列 Dim dDec1 As Double '// 第一引数16進数の10進数値 Dim dDec2 As Double '// 第二引数16進数の10進数値 Dim dSum As Double '// 合計値 Dim sHex As String '// 合計値の16進数文字列 '// 16進数文字列 → 10進数文字列に変換 Call HexToDec(a_sHex1, sDec1) Call HexToDec(a_sHex2, sDec2) '// 10進数文字列を数値化 dDec1 = CDbl(sDec1) dDec2 = CDbl(sDec2) '// 加算 dSum = dDec1 + dDec2 '// 10進数値を16進数文字列に変換 Call DecToHex(CStr(dSum), sHex) '// 16進数文字列を返す a_sResult = sHex End Sub '// 16進数の減算 '// 第一引数:16進数文字列 '// 第二引数:16進数文字列 '// 第三引数:計算結果の16進数文字列 Sub HexMinus(a_sHex1 As String, a_sHex2 As String, a_sResult As String) Dim sDec1 As String '// 第一引数16進数の10進数文字列 Dim sDec2 As String '// 第二引数16進数の10進数文字列 Dim dDec1 As Double '// 第一引数16進数の10進数値 Dim dDec2 As Double '// 第二引数16進数の10進数値 Dim dDiff As Double '// 減算結果 Dim sHex As String '// 計算結果の16進数文字列 '// 16進数文字列 → 10進数文字列に変換 Call HexToDec(a_sHex1, sDec1) Call HexToDec(a_sHex2, sDec2) '// 10進数文字列を数値化 dDec1 = CDbl(sDec1) dDec2 = CDbl(sDec2) '// 減算 dDiff = dDec1 - dDec2 '// 10進数値を16進数文字列に変換 Call DecToHex(CStr(dDiff), sHex) '// 16進数文字列を返す a_sResult = sHex End Sub |
使い方
HexAdd関数とHexMinus関数の使い方の例です。第一引数と第二引数に16進数文字列を渡し、第三引数で計算結果を受け取ります。
1 2 3 4 5 6 7 8 9 |
Sub TestHexCalc() Dim sResult As String Call HexAdd("1A", "2F", sResult) '// 1A = 26, 2F = 47 → 26+47=73 → 49H Debug.Print "加算結果: "; sResult '// 結果: 49 Call HexMinus("1A", "F", sResult) '// 1A = 26, F = 15 → 26-15=11 → BH Debug.Print "減算結果: "; sResult '// 結果: B End Sub |
あまり注意しなくてもいい注意点
16進数を扱うときは負数(マイナス値)を扱うことはかなり少ないのですが、もし負数を扱う場合はVBAのHex関数では正しく扱えません。
VBAのHex関数は負数を補完付き2進数(2の補数)で扱わず、桁数オーバーを起こす可能性があるため、負数を扱いたい場合は、符号付きビット演算やAPIを使う必要があります。この記事では割愛します。面倒なので。