はじめに
Excelで10進数を16進数に変換する方法を整理してみました。
3つの方法がありましたが、使い方や変換できる10進数の範囲が異なっていたので、意識して使い分けするとよさそうです。
関数名 | 10進数(最小) | 10進数(最大) | |
---|---|---|---|
Excel | Dec2Hex | -549,755,813,888 | 549,755,813,887 |
VBA | hex | -2,147,483,648 | 2,147,483,647 |
PowerShell | [convert]::ToString | -9,223,372,036,854,775,808 | 9,223,372,036,854,775,807 |
3つ目のConvert クラスのToString メソッドは、Excel VBA のPowerShell コマンドを使って呼び出して使います。
指定する10進数はInt64(64ビット符号付き整数)で、3つの中で一番大きい数値を変換することができます。
- Convert.ToString メソッド – Microsoft
- Int64 構造体 – Microsoft
使い方
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 = “@”」を入れてから貼り付けるようにすればよさそうです。
参考
- Convert.ToString メソッド – Microsoft
- Int64 構造体 – Microsoft