Hex
Hex関数は数値を16進数に変換し、文字列で返します。
数値が整数でない場合は、一番近い整数として扱われます。
Double型などの小数値を持つ値も変換できますが、後述の通り、小数値の扱いがわかりにくいため、Hex関数に小数値をそのまま渡すのはおすすめしません。
引数が数値でない場合は実行時エラー13「型が一致しません」が発生します。
構文
Function Hex(Number)
Function Hex$(Number) As String
一応定義として存在するためHex$も書いていますが、$付きの関数は通常は使う必要がありません。
$付きの関数を使う必要がない理由については「VBA関数の$ドルマークの意味」をご参照ください。
Number | 16進数に変換したい数値を指定します。 |
戻り値 | 変換後の16進数値を文字列で返します。
文字列で返す理由は、16進数が「0 1 2 3 4 5 6 7 8 9 A B C D E F」の16種類の文字で構成されるため、AからFを文字列でしか表現できないためです。 |
引数に数値ではない値を指定するとエラー
以下のように数値でない引数を指定するとエラーが発生します。
1 2 3 |
Sub HexTest3() Debug.Print Hex("a") End Sub |
サンプルコード
Byte型の範囲でもある1から255の値をそれぞれHex関数で16進数に変換してセルに出力するサンプルです。
A1セルを基点として、A列に整数値、B列にHex関数での変換値を出力します。
1 2 3 4 5 6 7 8 9 10 11 12 |
Sub HexTest1() Dim i Dim r As Range Range("A1").Select Set r = ActiveCell For i = 0 To 255 r.Offset(i, 0).Value = i r.Offset(i, 1).Value = Hex(i) Next End Sub |
実行結果
途中は省略しますが、以下のように256行目まで出力されます。
小数がある場合の変換
Hex関数における小数の扱いは挙動がよく分かりません。
以下のサンプルは9から10.9をHex関数で変換しますが、9.5の場合は”9″として0.5が切り捨てられるのに、10.5の場合は”A”として繰り上がります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
Sub HexTest2() '// 9 Debug.Print "9 = " & Hex(9) '// "9" Debug.Print "9.1 = " & Hex(9.1) '// "9" Debug.Print "9.49 = " & Hex(9.49) '// "9" '// 9.5 Debug.Print "9.5 = " & Hex(9.5) '// "A" 繰り上げ Debug.Print "9.51 = " & Hex(9.51) '// "A" Debug.Print "9.9 = " & Hex(9.9) '// "A" '// 10 Debug.Print "10 = " & Hex(10) '// "A" Debug.Print "10.1 = " & Hex(10.1) '// "A" Debug.Print "10.49 = " & Hex(10.49) '// "A" '// 10.5 Debug.Print "10.5 = " & Hex(10.5) '// "A" 切り捨て Debug.Print "10.51 = " & Hex(10.51) '// "B" Debug.Print "10.9 = " & Hex(10.9) '// "B" End Sub |
このように小数値をそのままHex関数に渡すと挙動が怪しいため、以下のようにInt関数やFix関数やワークシート関数のRound関数での四捨五入などで整数に変換して渡すようにすることをお勧めします。
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 |
Sub HexTest2B() '// Fix '// 9 Debug.Print "9 = " & Hex(Fix(9)) '// "9" Debug.Print "9.1 = " & Hex(Fix(9.1)) '// "9" Debug.Print "9.49 = " & Hex(Fix(9.49)) '// "9" '// 9.5 Debug.Print "9.5 = " & Hex(Fix(9.5)) '// "A" 繰り上げ Debug.Print "9.51 = " & Hex(Fix(9.51)) '// "A" Debug.Print "9.9 = " & Hex(Fix(9.9)) '// "A" '// 10 Debug.Print "10 = " & Hex(Fix(10)) '// "A" Debug.Print "10.1 = " & Hex(Fix(10.1)) '// "A" Debug.Print "10.49 = " & Hex(Fix(10.49)) '// "A" '// 10.5 Debug.Print "10.5 = " & Hex(Fix(10.5)) '// "A" Debug.Print "10.51 = " & Hex(Fix(10.51)) '// "A" Debug.Print "10.9 = " & Hex(Fix(10.9)) '// "A" '// 四捨五入 '// 9 Debug.Print "9 = " & Hex(Application.Evaluate("ROUND(9, 0)")) '// "9" Debug.Print "9.1 = " & Hex(Application.Evaluate("ROUND(9.1, 0)")) '// "9" Debug.Print "9.49 = " & Hex(Application.Evaluate("ROUND(9.49, 0)")) '// "9" '// 9.5 Debug.Print "9.5 = " & Hex(Application.Evaluate("ROUND(9.5, 0)")) '// "A" 四捨五入 Debug.Print "9.51 = " & Hex(Application.Evaluate("ROUND(9.51, 0)")) '// "A" Debug.Print "9.9 = " & Hex(Application.Evaluate("ROUND(9.9, 0)")) '// "A" '// 10 Debug.Print "10 = " & Hex(Application.Evaluate("ROUND(10, 0)")) '// "A" Debug.Print "10.1 = " & Hex(Application.Evaluate("ROUND(10.1, 0)")) '// "A" Debug.Print "10.49 = " & Hex(Application.Evaluate("ROUND(10.49, 0)")) '// "A" '// 10.5 Debug.Print "10.5 = " & Hex(Application.Evaluate("ROUND(10.5, 0)")) '// "B" 四捨五入 Debug.Print "10.51 = " & Hex(Application.Evaluate("ROUND(10.51, 0)")) '// "B" Debug.Print "10.9 = " & Hex(Application.Evaluate("ROUND(10.9, 0)")) '// "B" End Sub |