32位转64位VBA的TrimWS函数失效问题求助
修复32位VBA TrimWS函数适配64位环境
原代码存在的问题
- 系统库名拼写错误:
kernal32应为kernel32,导致无法正确加载系统函数 - 64位环境下API参数类型不匹配:
lstrlen和StrTrim的参数使用Long类型,无法适配64位的8字节指针 - 对64位VBA的误解:
StrPtr在64位环境中依然存在,返回LongPtr类型指针,并非不存在
修复后的完整代码
Option Explicit Option Compare Text Option Base 1 Private Declare PtrSafe Function lstrlen Lib "kernel32" Alias "lstrlenW" ( _ ByVal lpString As LongPtr) As LongPtr Private Declare PtrSafe Function StrTrim Lib "shlwapi" Alias "StrTrimW" ( _ ByVal pszSource As LongPtr, _ ByVal pszTrimChars As LongPtr) As LongPtr Private Function TrimWS(ByVal Text As String) As String 'unicode safe Dim WHITE_SPACE As String WHITE_SPACE = " " & vbTab & vbCr & vbLf & Chr(1) & Chr(2) & Chr(3) & Chr(4) & Chr(5) & Chr(6) & Chr(7) & Chr(8) & Chr(9) & Chr(10) & Chr(11) & Chr(12) & Chr(13) & Chr(14) & Chr(15) & Chr(16) & Chr(17) & Chr(18) & Chr(19) & Chr(20) & Chr(21) & Chr(22) & Chr(23) & Chr(24) & Chr(25) & Chr(26) & Chr(27) & Chr(28) & Chr(29) & Chr(30) & Chr(31) & Chr(32) & ChrW(&HA0) If StrTrim(StrPtr(Text), StrPtr(WHITE_SPACE)) Then TrimWS = Left$(Text, lstrlen(StrPtr(Text))) Else TrimWS = Text End If End Function
关键修改说明
- 修正库名拼写:将原代码中的
kernal32改为正确的kernel32,确保系统能找到对应的API函数 - 适配64位指针类型:将两个API函数的所有指针参数从
Long改为LongPtr,LongPtr会根据VBA运行环境自动切换为32位的4字节或64位的8字节,完美兼容两种环境 - 确认StrPtr的有效性:64位VBA中
StrPtr并未被移除,它返回的LongPtr类型指针与修改后的API参数类型完全匹配,解决了类型不匹配错误
内容的提问来源于stack exchange,提问作者G G Synaptic
相关产品推荐
相关产品推荐

