ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[讨论] EXCEL使用"标准DLL函数"的疑惑

[复制链接]

TA的精华主题

TA的得分主题

发表于 2011-6-1 22:14 | 显示全部楼层 |阅读模式
1、实际测试下来,在单元格里使用"标准DLL函数"是不经过自动Unicode编码转换的!
   而在Excel VBA / VB6中调用DLL函数会自动对字符串进行Unicode编码转化(如何避免VB自作主张的转换?)
2、"标准DLL函数"引用路径的问题:VB6中可以使用相对路径进行声明可在Excel VBA中就没办法了,只能使用绝对路径
   或放入WINNT\system32下面才能识别(如何在VBA中也能使用相对路径?放入system32中总感觉不环保!同样使用COM Addin DLL形式输出函数还得进行一系列注册)
3、DLL函数的声明如何封装入DLL而Excel单元格能直接引用,现在只能采用变通的办法(将函数声明成public,存入xla加载)
4、注:DLL函数是用“AmicForVB插件”生成的
http://www.vbgood.com/thread-32788-1-1.html
编码转换.jpg
路径.jpg

TESTDLL.rar

29.47 KB, 下载次数: 160

TA的精华主题

TA的得分主题

发表于 2011-6-1 22:29 | 显示全部楼层
有待研究。

TA的精华主题

TA的得分主题

发表于 2011-6-2 09:47 | 显示全部楼层
1。公式中用ASC、WIDECHAR函数转换双字节和单字节字符
2。VBA代码中用STRCONV转换UNICODE字符和单字节字符

TA的精华主题

TA的得分主题

发表于 2011-6-2 10:03 | 显示全部楼层
没有看那个AMIC插件。
一般来说,MS在VB系就绑定了ACTIVEX COM DLL,不打算让VB生成函数 API DLL,如果要HACK一个VB自个的API DLL,那就要自已看里面的问题,没有官方的服务。
而一般的这种插件都是自已弄一个MAKE EXE或MAKE DLL,这种东西,最大的问题是,如果他搬的是老外的MAKE DLL,人家是早期版本,或欧美语系,就不考虑UNICODE的转换,一概用单字节字符,我等天朝VBA不用说也是UNICODE...
因此你在用这个插件写代码遇到麻烦的时候,建议自已的函数代码里面本身就要先做个STRCONV转化——我是指那个API VB函数里面——假定API 函数接收的字符是UNICODE,先给它处理掉,就不用在EXCEL VBA里搞得鸡毛鸭血了

TA的精华主题

TA的得分主题

 楼主| 发表于 2011-6-2 12:26 | 显示全部楼层
MyFun.dll中的两个函数daxie和daxieA产生的效果是一样的
仅仅daxie是在函数内部用StrConv进行转换
而daxieA是直接接受和输出字符串,未进行任何编码处理
现在的实际情况是:声明DLL函数后,EXCEL单元格中可以直接使用不编码的daxieA函数
EXCEL VBA,VB6可以使用编码的daxie函数
编成DLL函数的好处是EXCEL VBA和VB6都可以使用,声明、使用方法一样,而且绿色环保。
坏处就是到现在为止EXCEL VBA只认绝对路径(这点在VB6中就没有限制,可以使用相对路径)

[ 本帖最后由 zhw79 于 2011-6-2 12:33 编辑 ]

TA的精华主题

TA的得分主题

发表于 2011-6-2 13:59 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
可能的话用C++或DELPHI写成XLL,不过可惜我还没学会!

TA的精华主题

TA的得分主题

发表于 2011-6-2 14:36 | 显示全部楼层
原来你很在意DLL API相对路径,说明一下。
1.关于DECLARE的问题,它的路径在SYSTEM、PATH、和当前目录之一。
SYSTEM就是你说的系统目录,不够安全绿色,这点我同意。
PATH是环境变量(vba.Environ("path"))指定的位置。
当前目录是CURDIR,注意不是THISWORBOOK.path,一般在我的文档,可以用CHDIR改变,这个最简单,我在附件里演示了,当WORKBOOK OPEN时改到THISWORKBOOK.PATH,你的DLL就OK了

2.关于字符的问题,再看了一下,之前你的理解是错的,我没有看你的附件,我也想错了。
  事实上是你的函数没做类型检测,你那个BOOK,在单元格里传入的函数参数是B1,它是一个RANGE VALUE。一般的EXCEL函数都很大路无所谓,它们给你完成类型检测——基本上来说,VAR类型的数据都可以,它们在函数内部再转,比如参数要STRING,传入的是VAR,它先转成STR
  而你的VBP里,DAXIE直接定义参数是STRING,另一个是SINGLE....好吧,看看附件,我传单字符,双字节字符,它一样吃下去,直到数字就完了

最后,还是不怎么建议你用VB搞API。实话说,VB的工程,真要用第3方插件做成 API限制一定很多,只要你一用控件,它就会退化...不,进化成COM,保证乱七八糟很不环保,你那个VBP我打开一看,你还留有个FORM,呃,真是奇怪了,没看插件怎么玩的,但VB FORM是VB的COM组件,它跟你的API根本就不应该放在一块,这种东西按API的思路就算“不环保不绿色要注册”的东东丫

TEST.rar

16.54 KB, 下载次数: 103

TA的精华主题

TA的得分主题

 楼主| 发表于 2011-6-2 21:40 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
1、ChDir 可以解决EXCEL VBA中API声明的相对路径问题。谢谢提醒!
DECLARE声明的时候VB6可以使用当前路径,或相对当前路径的上级或下级路径。
比如函数路径为“D:\Backup\桌面\TESTDLL\TEST\12\MyFun.dll”
调用程序位于“D:\Backup\桌面\TESTDLL\TEST\工程1.EXE”
声明时使用
Private Declare Function daxie Lib "12/MyFun.dll" (ByVal Money As String) As String
就可以直接使用

2、Form窗体是VB6里测试DLL用的,不是函数的工程代码,MyFun才是函数DLL的源代码

产生这个DLL函数这想法源于本人编写的Excel com addin程序中经常用到一些通用函数操作,
比如进制转换,系统软硬件环境信息,加密解密等作为源代码复制粘贴无法保证版本一致性、代码复用、编译花费时间太长等的问题;所以才想到将这些函数封装成DLL方便EXCEL VBA以及VB6都能通用,用其他语言(C&C++)编写api函数,只要涉及字符操作,同样会遇到此问题。
此问题源于VB语言太过自作聪明得进行UNICODE转换操作,而数值类型无此影响!

TA的精华主题

TA的得分主题

发表于 2011-6-2 23:42 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

回复 7楼 hiyou 的帖子

关于路径 是个很好的思路 谢谢提醒。

TA的精华主题

TA的得分主题

发表于 2011-11-7 14:35 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-22 13:44 , Processed in 0.033354 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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