まず、ハッシュ コードを提供してくれた nixda に感謝します。
私は VBA の初心者です。電子メール アドレスを取得してユーザー名部分を難読化し、難読化された電子メール アドレスを含むレポートを配布できる関数を作成しようとしています。
VBA モジュールに次の内容を追加しました:
Private Function EncodeBase64(ByVal sTextToHash As String)
Dim objXML As Object
Dim objNode As Object
Set objXML = CreateObject("MSXML2.DOMDocument")
Set objNode = objXML.createElement("b64")
objNode.DataType = "bin.base64"
objNode.nodeTypedValue = arrData
EncodeBase64 = objNode.Text
Set objNode = Nothing
Set objXML = Nothing
End Function
Public Function BASE64SHA1(ByVal sTextToHash As String)
Dim asc As Object
Dim enc As Object
Dim TextToHash() As Byte
Dim SharedSecretKey() As Byte
Dim bytes() As Byte
Const cutoff As Integer = 5
Set asc = CreateObject("System.Text.UTF8Encoding")
Set enc = CreateObject("System.Security.Cryptography.HMACSHA1")
TextToHash = asc.GetBytes_4(sTextToHash)
SharedSecretKey = asc.GetBytes_4(sTextToHash)
enc.Key = SharedSecretKey
bytes = enc.ComputeHash_2((TextToHash))
BASE64SHA1 = EncodeBase64(bytes)
BASE64SHA1 = Left(BASE64SHA1, cutoff)
Set asc = Nothing
Set enc = Nothing
End Function
ワークブック内で関数を呼び出すと、電子メール アドレスを難読化できます。
=BASE64SHA1(LEFT(A1,FIND("@",A1)-1))&"@"&MID(A1,FIND("@",A1)+1,999)
したがって、この関数を渡すと、ハッシュ化されたユーザー名を含む電子メール アドレスが取得されます。すばらしい!
しかし、次のように入力できるようにしたいのです:
=OBFUSCATEEMAIL(A1)
ワークシート内
そこで、ワークシートの VBA モジュールを開き、これまでのところ次の操作を実行しました。
Public Function ObfuscateEmail(ByVal email As String)
Dim username As String
Dim domain As String
username = Left(email, InStr(email, "@") - 1)
domain = Right(email, Len(email) - InStr(email, "@"))
ObfuscateEmail = BASE64SHA1(username) & "@" & domain
End Function
この新しい関数を呼び出そうとすると、#VALUE エラーが発生します。
BASE64SHA1 の呼び出しが問題の原因ですが、
a) BASE64SHA1がワークシートから呼び出されたときに機能していることはわかっています。
b) ObfuscateEmailはBASE64SHA1の呼び出しを追加するまでは正常に動作します
何が間違っているのでしょうか?
答え1
このコード行:
objNode.nodeTypedValue = arrData
どちらでもない変数を使用する薄暗い'ed も値も割り当てられていません。