Excelで、たまーにハッシュ関数を使用したい時がある。
デフォルトでは対応していないので独自関数を定義する必要があり、ググれば情報はヒットするのだが、少しハマったので記録しておく。
環境
Windows10
Office365 執筆時点バージョン(バージョン 2109 ビルド 16.0.14430.20314) 64 ビット
手順
1. マクロ有効ブック(*.xlsm)としてExcelを保存する。
2. [開発]タブから[Visual Basic]を選択する。
3. 表示された画面左ペインで右クリックし、[挿入]->[標準モジュール]を選択。
4. 作成されたModule1に下記コードを貼り付け。
Public Function GetSHA256(ハッシュ値算出範囲 As Range) As String
Const LENGTH_OF_HASH = 32
Const LENGTH_OF_HASH_AS_STRING = 64
Set objUTF8 = CreateObject("System.Text.UTF8Encoding")
Set objSHA256 = CreateObject("System.Security.Cryptography.SHA256Managed")
Dim str As String
'Rangeの文字列結合(ワークシート関数のConcatを流用)
str = Application.WorksheetFunction.Concat(ハッシュ値算出範囲)
'バイト読み込み
Dim code() As Byte
code = objUTF8.GetBytes_4(str)
'ハッシュ値計算
Dim hashValue() As Byte
hashValue = objSHA256.ComputeHash_2(code)
'16進数へ変換
Dim description As String * LENGTH_OF_HASH_AS_STRING
Dim i&
For i = 0 To LENGTH_OF_HASH - 1
Mid(description, i * 2 + 1) = Right("0" & Hex(hashValue(i)), 2)
Next i
'return
GetSHA256 = LCase(description)
End Function
コードは下記リンクで紹介されていたものをほぼそのまま利用させて頂く。
これで、GetSHA256
関数が仕様出来るようになるはずだが関数が動かない。
ここで少しハマった。
5. .Net Framework 3.5の有効化
.Net Framework 3.5が有効でないとSystem.Security.Cryptography.SHA256Managed
が効かないらしい。
自分の環境ではデフォルト無効状態だったので、有効化してやる。
「コントロールパネル>プログラム>Windowsの機能の有効化または無効化」と進み、チェック。