升级至MS365后VarPtr调用触发类型不匹配问题求助
问题根源
升级到64位MS365后,原代码的类型兼容性问题触发错误:
VarPtr(pPrim)在64位Office中返回LongPtr类型(8字节地址),但DataCopy的第二个参数toMem&是Long类型(4字节),两者类型不匹配导致"Type Mismatch"。- 若
CopyMemory的API声明未适配64位环境,会进一步加剧问题。
修复步骤
- 修正
DataCopy的参数类型
将toMem&(Long类型)改为LongPtr,兼容32/64位Office:
Private Sub DataCopy(value$, toMem As LongPtr) Dim myBuff() As Byte If value = "" Then Exit Sub myBuff = value CopyMemory ByVal toMem, myBuff(0), UBound(myBuff) + 1 End Sub
- 适配
CopyMemory的64位声明
在模块顶部替换原有API声明,确保兼容不同Office版本:
#If VBA7 Then Private Declare PtrSafe Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As LongPtr) #Else Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long) #End If
- 验证初始化逻辑
String(Len(pPrim)/2, " ")的计算逻辑正确:Len(pPrim)返回tPrim的总字节数,VB字符串为Unicode编码(每个字符占2字节),除以2可得到对应字符数,实现内存块的空格填充初始化。
额外注意事项
- 确保
tPrim的类型定义与pPrim变量在同一模块,若DataCopy在其他模块,需将tPrim的作用域改为Public。 - 64位Office中所有涉及内存地址的变量,均需用
LongPtr替代Long,避免类型不匹配问题。
内容的提问来源于stack exchange,提问作者xceej
相关产品推荐
相关产品推荐

