ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 240|回复: 7

[求助] vba 程序运行 提示类型不匹配

[复制链接]

TA的精华主题

TA的得分主题

发表于 2024-10-17 11:13 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
我用论坛上的代码计算文件的MD5值,但是一直提示类型不匹配
我的电脑系统是Win11,Excel是2021版的
1、在Declare 语句中添加PtrSafe
2、然后把long数据类型,改为LongPtr
3、然后就出现如图错误,这个网上也搜不到,所以处理不了了,请高人指点一下


Snipaste_Microsoft Visual Basic for Applications - 计算MD5值.xlsm [中断] - [模块.jpg


代码如下:


Option Explicit
Option Base 0

Public Type MD5_CTX
    i(1) As LongPtr
    buf(3) As LongPtr
    inc(63) As Byte
    digest(15) As Byte
End Type

Public Declare PtrSafe Sub MD5Init Lib "Cryptdll.dll" (ByVal pContex As LongPtr)
Public Declare PtrSafe Sub MD5Final Lib "Cryptdll.dll" (ByVal pContex As LongPtr)
Public Declare PtrSafe Sub MD5Update Lib "Cryptdll.dll" (ByVal pContex As LongPtr, ByVal lPtr As LongPtr, ByVal nSize As LongPtr)

Public Function ConvBytesToBinaryString(bytesIn() As Byte) As String
    Dim i As LongPtr
    Dim nSize As LongPtr
    Dim strRet As String
   
    nSize = UBound(bytesIn)
    For i = 0 To nSize
         strRet = strRet & Right$("0" & Hex(bytesIn(i)), 2)
    Next
    ConvBytesToBinaryString = strRet
End Function

Public Function GetMD5Hash(bytesIn() As Byte) As Byte()
    Dim ctx As MD5_CTX
    Dim nSize As LongPtr
   
    nSize = UBound(bytesIn) + 1
   
    MD5Init VarPtr(ctx)
    MD5Update ByVal VarPtr(ctx), ByVal VarPtr(bytesIn(0)), nSize
    MD5Final VarPtr(ctx)
   
    GetMD5Hash = ctx.digest
End Function

Public Function GetMD5Hash_Bytes(bytesIn() As Byte) As String
    GetMD5Hash_Bytes = ConvBytesToBinaryString(GetMD5Hash(bytesIn))
End Function

Public Function GetMD5Hash_String(ByVal strIn As String) As String
    GetMD5Hash_String = GetMD5Hash_Bytes(StrConv(strIn, vbFromUnicode))
End Function

Public Function GetMD5Hash_File(ByVal strFile As String) As String
    Dim lFile As LongPtr
    Dim bytes() As Byte
    Dim lSize As LongPtr
   
    lSize = FileLen(strFile)
    If (lSize) Then
        lFile = FreeFile
        ReDim bytes(lSize - 1)
        Open strFile For Binary As lFile
        Get lFile, , bytes
        Close lFile
        GetMD5Hash_File = GetMD5Hash_Bytes(bytes)
    End If
End Function


TA的精华主题

TA的得分主题

发表于 2024-10-17 11:32 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
我複製你的代碼執行沒有問題

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-10-17 11:43 | 显示全部楼层
解0人 发表于 2024-10-17 11:32
我複製你的代碼執行沒有問題

我的系统是Win11,64位的,office是2021专业版的,你的是否和我一样

TA的精华主题

TA的得分主题

发表于 2024-10-17 11:56 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
Cavan2022 发表于 2024-10-17 11:43
我的系统是Win11,64位的,office是2021专业版的,你的是否和我一样

win10 + office2019 32位

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-10-18 09:50 | 显示全部楼层
解0人 发表于 2024-10-17 11:56
win10 + office2019 32位

应该是我是64位系统的原因,运行不了,数据长度不一致导致的,就是不知道怎么修改

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-10-18 09:52 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2024-10-18 20:10 来自手机 | 显示全部楼层
Option Explicit
Option Base 0

Public Type MD5_CTX
    i(1) As Long
    buf(3) As Long
    inc(63) As Byte
    digest(15) As Byte
End Type

Public Declare PtrSafe Sub MD5Init _
    Lib "Cryptdll.dll" (ByVal pContex As LongLong)
Public Declare PtrSafe Sub MD5Final _
    Lib "Cryptdll.dll" (ByVal pContex As LongLong)
Public Declare PtrSafe Sub MD5Update _
    Lib "Cryptdll.dll" (ByVal pContex As LongLong, _
    ByVal lPtr As LongLong, ByVal nSize As Long)

Public Function ConvBytesToBinaryString(bytesIn() As Byte) As String
    Dim i As Long
    Dim nSize As Long '
    Dim strRet As String
  
    nSize = UBound(bytesIn)
    For i = 0 To nSize
         strRet = strRet & Right$("0" & Hex(bytesIn(i)), 2)
    Next
    ConvBytesToBinaryString = strRet
End Function

Public Function GetMD5Hash(bytesIn() As Byte) As Byte()
    Dim ctx As MD5_CTX
    Dim nSize As Long
  
    nSize = UBound(bytesIn) + 1
  
    MD5Init VarPtr(ctx)
    MD5Update ByVal VarPtr(ctx), ByVal VarPtr(bytesIn(0)), nSize
    MD5Final VarPtr(ctx)
  
    GetMD5Hash = ctx.digest
End Function

Public Function GetMD5Hash_Bytes(bytesIn() As Byte) As String
    GetMD5Hash_Bytes = ConvBytesToBinaryString(GetMD5Hash(bytesIn))
End Function

Public Function GetMD5Hash_String(ByVal strIn As String) As String
    GetMD5Hash_String = GetMD5Hash_Bytes(StrConv(strIn, vbFromUnicode))
End Function

Public Function GetMD5Hash_File(ByVal strFile As String) As String
    Dim lFile As Long
    Dim bytes() As Byte
    Dim lSize As Long
  
    lSize = FileLen(strFile)
    If (lSize) Then
        lFile = FreeFile
        ReDim bytes(lSize - 1)
        Open strFile For Binary As lFile
        Get lFile, , bytes
        Close lFile
        GetMD5Hash_File = GetMD5Hash_Bytes(bytes)
    End If
End Function

Sub getfilemd5()
    Dim md As Variant
    md = GetMD5Hash_File(ThisWorkbook.Path & "\abc.txt")
End Sub

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-10-18 23:42 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
lss001 发表于 2024-10-18 20:10
Option Explicit
Option Base 0

我试了,可以正常在我的系统中运行,高人啊,厉害!!
0835015C.png
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-19 11:28 , Processed in 0.048256 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表