You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

升级至MS365后VarPtr调用触发类型不匹配问题求助

问题根源

升级到64位MS365后,原代码的类型兼容性问题触发错误:

  • VarPtr(pPrim)在64位Office中返回LongPtr类型(8字节地址),但DataCopy的第二个参数toMem&是Long类型(4字节),两者类型不匹配导致"Type Mismatch"。
  • 若CopyMemory的API声明未适配64位环境,会进一步加剧问题。
修复步骤
  1. 修正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
  1. 适配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
  1. 验证初始化逻辑
    String(Len(pPrim)/2, " ")的计算逻辑正确:Len(pPrim)返回tPrim的总字节数,VB字符串为Unicode编码(每个字符占2字节),除以2可得到对应字符数,实现内存块的空格填充初始化。
额外注意事项
  • 确保tPrim的类型定义与pPrim变量在同一模块,若DataCopy在其他模块,需将tPrim的作用域改为Public。
  • 64位Office中所有涉及内存地址的变量,均需用LongPtr替代Long,避免类型不匹配问题。

内容的提问来源于stack exchange,提问作者xceej

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 13:34:59