Excelで10進数→16進数の変換

はじめに

Excelで10進数を16進数に変換する方法を整理してみました。

3つの方法がありましたが、使い方や変換できる10進数の範囲が異なっていたので、意識して使い分けするとよさそうです。

関数名10進数(最小)10進数(最大)
ExcelDec2Hex-549,755,813,888549,755,813,887
VBAhex-2,147,483,6482,147,483,647
PowerShell[convert]::ToString-9,223,372,036,854,775,8089,223,372,036,854,775,807

3つ目のConvert クラスのToString メソッドは、Excel VBA のPowerShell コマンドを使って呼び出して使います。
指定する10進数はInt64(64ビット符号付き整数)で、3つの中で一番大きい数値を変換することができます。

使い方

Excel のDec2Hex 関数

Dec2Hex 関数に10進数の値を指定します。例えば、10進数の値が1234567890 の場合、セルに以下のように入力します。

=Dec2Hex(1234567890)

Excel VBA のhex 関数

Excel VBA のエディタ上で以下のようにコードを記述して使います。

Dim lngDec As Long
Dim strHex As String
lngDec = 1234567890
strHex = hex(lngDec)

PowerShell のConvert クラスのToString メソッド

Excel VBA のエディタ上で以下の関数を作り、呼び出して使います。

Function Dec2HexCustom(pDec As Currency) As String
  Dim objShell As Object
  Dim strCmd As String
  Dim strHex As String

  strCmd = "[convert]::ToString(" & pDec & ",16)"
  Set objShell = CreateObject("WScript.Shell").Exec("powershell -Command " & strCmd)
  strHex = objShell.StdOut.ReadAll
  Dec2HexCustom = Left(strHex, Len(strHex) - 2)
End Function
  • (6行目) PowerShell のコマンドは [convert]::ToString(1234567890, 16)
  • (7行目) PowerShell のコマンドを呼び出して変換している
  • (9行目) PowerShell のコマンドの実行結果を標準出力で受け取ると末尾に改行(CRLF)が付加されるので、改行(CRLF)に該当する右2文字を除去している

あとがき

Excel VBA でPowerShell のコマンドを実行すると、処理がもたついてあまりパフォーマンスがよくなかったです。
Excel の表から複数行を読み込んで繰り返し実行する場合は、小さい数値はhex 関数にやらせて、大きい数値のみPowerShell のConvert クラスのToString メソッドを使うように実装した方がよさそうです。

その他、注意事項として、変換後の16進数の値をセルに貼り付ける場合、変換後の16進数の値が「数字 + “E” + 数字」だと、値が指数表記と誤認されて正しくセットされなかったりします。
例えば、「12345678E90」の場合は「1.2345678E+97」に変換され、「1234567E890」の場合は変換されずそのままセットされるなど、何かと厄介です。
貼り付け先のセルの書式を文字列にすれば解消できるので、元から文字列にしておくか、値を貼り付ける直前に文字列にする処理「.Cells(x, y).NumberFormatLocal = “@”」を入れてから貼り付けるようにすればよさそうです。

参考