Во-первых, спасибо 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 вызывает проблему, но:
а) я знаю, что BASE64SHA1 работает при вызове с рабочего листа, и
б) У меня ObfuscateEmail работает нормально, пока не добавлю звонок в BASE64SHA1
Что я делаю неправильно?