7
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

ExcelでSHA256ハッシュ関数を使用する

Posted at

Excelで、たまーにハッシュ関数を使用したい時がある。
デフォルトでは対応していないので独自関数を定義する必要があり、ググれば情報はヒットするのだが、少しハマったので記録しておく。

環境

Windows10
Office365 執筆時点バージョン(バージョン 2109 ビルド 16.0.14430.20314) 64 ビット

手順

1. マクロ有効ブック(*.xlsm)としてExcelを保存する。

2. [開発]タブから[Visual Basic]を選択する。

3. 表示された画面左ペインで右クリックし、[挿入]->[標準モジュール]を選択。

image.png

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の機能の有効化または無効化」と進み、チェック。

image.png

6. 動くようになった。

image.png

7
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?