ExcelTip.Net留存知识帖 ---【注:附件之前被网盘供应商清空后,现已修复-现已修复-现已修复为本地下载!】
现在位置:首页 > E问E答 > Excel VBA > 如何在VBA中和API传递处理中文字符串

如何在VBA中和API传递处理中文字符串

作者:绿色风 分类: 时间:2022-08-17 浏览:108
楼主
xmyjk
Q:在看西西的帖子,如何在VBA中使用钩子(HOOK)以及WINDOWS消息机制简介
http://www.exceltip.net/thread-37847-1-1.html

第一节,第五个部分,字符串,好奇,拿了个中文去处理,套用西西的代码,代码如下,结果出现很奇怪的问题:
  1. Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
  2. Sub st()
  3.     Dim s As String, a() As Byte, cs As String, cd As Long, cs1 As String

  4.     s = "你好"
  5.     a = s
  6.     cs = String(Len(s), vbNullChar) '设定缓存字符串
  7.     CopyMemory ByVal cs, ByVal s, LenB(s) '拷贝字符串
  8.     cs1 = String(Len(s), vbNullChar) '设定缓存字符串
  9.     CopyMemory ByVal StrPtr(cs1), ByVal StrPtr(s), LenB(s) '拷贝字符串
  10.     CopyMemory cd, ByVal StrPtr(s) - 4, 4
  11.     Debug.Print cs, cs1, cd
  12. End Sub
立即窗口里面只有:你            你好
第一种方式,少了个好字。
奇怪了,这是为什么呢?,查了一些资料和请教了西西,大概了解了些。

A:经过如下测试,了解中文字节的传递情况。
  1. Sub t2()
  2.     Dim s As String, sb1(1 To 5) As Byte, sb2(1 To 5) As Byte, a() As Byte
  3.     s = "你好"
  4.     a = s '查看对应中文数组
  5.     CopyMemory sb1(1), ByVal s, LenB(s) '复制到数组
  6.     CopyMemory sb2(1), ByVal StrPtr(s), LenB(s) '复制到数组
  7. End Sub

 

所以,其实传回的还是四个这个字节的,VBA在英文和数字的传递,会安装西西帖子说的,转成asni格式的,会压缩了一半。
但是,中文方面,其实还是四个字节的这样,并没有压缩,所以,做缓存字符串要做两倍,传递过去的时候,会被压缩掉一半,然后接到后返回,就不会丢失,也就是,原来程序第六行,要改成lenb函数。
原程序修改如下,才能处理。就是,要lenb
  1. Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
  2. Sub st()
  3.     Dim s As String, a() As Byte, cs As String, cd As Long, cs1 As String

  4.     s = "你好"
  5.     a = s
  6.     cs = String(LenB(s), vbNullChar)
  7.     CopyMemory ByVal cs, ByVal s, LenB(s) '其他代码还是一样,但是注意了,这里是lenb
  8.     cs1 = String(Len(s), vbNullChar)
  9.     CopyMemory ByVal StrPtr(cs1), ByVal StrPtr(s), LenB(s)
  10.     CopyMemory cd, ByVal StrPtr(s) - 4, 4
  11.     Debug.Print cs, cs1, cd
  12. End Sub

字符串API.zip
2楼
い卋玑┾宝珼
万能的API
学习ing
3楼
亡者天下
学习一下
4楼
BianChengNan
好文章啊,顶了,慢慢学习
5楼
水星钓鱼
这个比较高深了
6楼
老糊涂
万能的API

免责声明

有感于原ExcelTip.Net留存知识的价值及部分知识具有的时间限定性因素, 经与ExcelTip.Net站长Apolloh商议并征得其同意, 现将原属ExcelTip.Net的知识帖采集资料于本站点进行展示, 供有需要的人士查询使用,也慰缅曾经的论坛时代。 所示各个帖子的原作者如对版权有异议, 可与本人沟通提出,或于本站点留言,我们会尽快处理。 在此,感谢ExcelTip.Net站长Apolloh的支持,感谢本站点所有人**绿色风(QQ:79664738)**的支持与奉献,特此鸣谢!
------本人网名**KevinChengCW(QQ:1210618015)**原ExcelTip.Net总版主之一

评论列表
sitemap