ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[分享] VBA封装成exe探讨研究

[复制链接]

TA的精华主题

TA的得分主题

发表于 2024-1-28 00:34 | 显示全部楼层 |阅读模式
本帖最后由 ivrdachen 于 2024-1-28 12:43 编辑

dll封装只支持32位,且注册还需要管理员权限,以及遇到各种未知问题,兼容性实在太差了,果断放弃了,研究了exe封装,发现exe几乎可以兼容目前大多数平台,而且不需要注册即可使用。
exe封装实际上是通过shell命令执行VB6生成的exe文件,但这里需要解决两个问题,如何传递参数和获取返回值,而且VBA里面用shell命令执行不如dll类模块调用方便,最后想了一个方法,利用数组方式,数组值作为shell执行函数的参数值,这样基本接近函数调用习惯了,例如下面的执行hanshu1, 只需要shellfunction("hanshu1", Array(3, 2))即可,hanshu1是函数名称,3, 2就是传递的参数,这样至少形式上像一个函数吧,关于读取shell命令的返回值,也是搞了好久才弄明白,原来执行的exe默认并不会将结果输出给shell窗口,而需要先将函数的输出转换成能读取到的标准输出,至此基本解决了VBA封装和兼容性问题。


执行速度上,相比于dll确实慢了很多,至少降低了50%,但是反正自动化,慢点就慢点了,兼容性好就行,测试了office2007到2016 32位系统和64位系统上都是可以正常运行的,另外exe文件可能会被杀毒软件误报,添加到信任即可。


将以下代码放到VB6模块中:

Private Declare Function GetStdHandle Lib "kernel32" _
    (ByVal nStdHandle As Long) As Long
Private Declare Function WriteFile Lib "kernel32" _
    (ByVal hFile As Long, ByVal lpBuffer As String, _
    ByVal nNumberOfBytesToWrite As Long, _
    lpNumberOfBytesWritten As Long, _
    ByVal lpOverlapped As Long) As Long
Private Const STD_OUTPUT_HANDLE = -11&


Sub Main()
scmd = Command()
If scmd = "" Then
MsgBox "欢迎使用本测试软件" & Now
End If

If InStr(scmd, "hanshu1" & "|") Then
canshu = Split(scmd, "|")
res = hanshu1(canshu(1), canshu(2))
End If

If InStr(scmd, "hanshu2" & "|") Then
canshu = Split(scmd, "|")
res = hanshu2(canshu(1), canshu(2), canshu(3))
End If

   WriteToStdOut CStr(res)
End Sub
Private Sub WriteToStdOut(ByVal sText As String)
    Dim hStdOut As Long
    Dim iWritten As Long
    hStdOut = GetStdHandle(STD_OUTPUT_HANDLE)
    WriteFile hStdOut, ByVal sText, Len(sText), iWritten, 0&
End Sub

Function hanshu1(x, y)
hanshu1 = x * y
End Function

Function hanshu2(x, y, z)
hanshu2 = x * y + z
End Function


VBA中代码:

Sub test()
MsgBox shellfunction("hanshu1", Array(3, 2))
MsgBox shellfunction("hanshu2", Array(1, 2, 3))
End Sub

Function shellfunction(mingcheng, canshu)
Set objShell = CreateObject("WScript.Shell")
strCommand = ThisWorkbook.Path & "\excel_exe.exe " & mingcheng & "|"
For cs_num = 0 To UBound(canshu)
strCommand = strCommand & canshu(cs_num) & "|"
Next

Set objExec = objShell.exec(strCommand)
Dim output As String
    output = ""
    Do While Not objExec.StdOut.AtEndOfStream
        output = output & objExec.StdOut.ReadLine() & vbNewLine
    Loop
Set objShell = Nothing
shellfunction = output
End Function



评分

5

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-1-28 10:16 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
还没学到这,先标记后续使用看看,感谢分享

TA的精华主题

TA的得分主题

发表于 2024-1-28 10:34 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
感谢分享   点赞支持

TA的精华主题

TA的得分主题

发表于 2024-1-28 11:35 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
封装exe不需要任何支持吗,也不限制版本?        exe不是需要先安装的吗?

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-1-28 12:19 | 显示全部楼层
micch 发表于 2024-1-28 11:35
封装exe不需要任何支持吗,也不限制版本?        exe不是需要先安装的吗?

不需要,但可能会被杀毒软件误杀,至少excel 2007到2016版运行都没问题,32位系统和64位系统都没问题

TA的精华主题

TA的得分主题

发表于 2024-1-28 12:30 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2024-1-28 15:41 来自手机 | 显示全部楼层
不需要修改ActiveX可执行文件,因为它们必然会通过RPC进行通信并与64位兼容。由于ActiveX可执行文件是进程外的,因此64位进程可以与32位ActiveX可执行文件通信,反之亦然。

虽然可以使用ActiveXDLL,但进程内限制仍然适用。64位进程无法调用32位ActiveXDLL,而32位进程也无法调用64位ActiveX DLL。

TA的精华主题

TA的得分主题

发表于 2024-1-28 16:31 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
vb6也只支持32位的。

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-1-31 22:27 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

生成exe就可以在64位下用了

TA的精华主题

TA的得分主题

发表于 2024-2-1 01:31 来自手机 | 显示全部楼层
shenjianrong163 发表于 2024-1-28 16:31
vb6也只支持32位的。

vb6.0同样定位的工具,64位里只有ahk,了解一下ahk还是很香的
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-6-28 09:10 , Processed in 0.047636 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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