库管易

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫描二维码登录本站

查看: 73036|回复: 12

使用bat命令,一键打开Excel表格,自动调用VBA代码功能

[复制链接]
发表于 2019-8-23 11:17:28 | 显示全部楼层 |阅读模式
现实需求:
使用Excel表格的VBA编程,既可以通过手动点击按钮等动作,触发运行VBA代码功能;
也需要通过命令行控制,自动执行VBA代码,实现一键执行或供其它程序调用。
(比如仓库管理工作中,可能在月底做汇总、结转、对账等,可以写好代码一键执行)

解决思路:
1. 手动执行VBA功能,只需要在Excel中增加绑定宏的按钮即可,由操作者点击相应的按钮。
2. 通过命令执行,是为了一键执行或供其他工具调用,解决思路为:调bat文件,bat文件通过打开Excel执行VBA功能。

步骤如下:
1.写一个bat批处理命令文件,用于打开Excel表格,同时设置标识参数,用于标识是bat打开的:
BAT批处理命令.png

2.制作一个Excel工作薄文件,在VBA中增加workbook的open事件,此事件会在文件打开时触发:
表格打开事件代码.png

3.编写VBA代码检查是否为cmd命令打开表格,根据不同的打开方式执行相应功能,代码如下:
  1. ' 32 位系统为
  2. ' Private Declare Function GetCommandLine Lib "kernel32" Alias "GetCommandLineW" () As Long
  3. ' Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (MyDest As Any, MySource As Any, ByVal MySize As Long)
  4. ' Private Declare Function lstrlenW Lib "kernel32" (ByVal lpString As Long) As Long
  5. ' 64 位系统为
  6. Private Declare PtrSafe Function GetCommandLine Lib "kernel32" Alias "GetCommandLineW" () As LongPtr
  7. Private Declare PtrSafe Function lstrlenW Lib "kernel32" (ByVal lpString As LongPtr) As LongPtr
  8. Private Declare PtrSafe Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (MyDest As Any, MySource As Any, ByVal MySize As LongPtr)

  9. Private Sub Workbook_Open()
  10.     Dim CmdMsg  As String
  11.     CmdMsg = "/batOpen" '命令行传递来的参数标识,与bat文件中的参数一致
  12.    
  13.     Dim CmdRaw  As LongPtr
  14.     CmdRaw = GetCommandLine()
  15.     Dim CmdLine As String
  16.     CmdLine = CmdToSTr(CmdRaw)
  17.     On Error Resume Next '这句是必须的,防止非bat打开,下面代码会报错
  18.     Dim paraPos As Integer
  19.     paraPos = WorksheetFunction.Search(CmdMsg, CmdLine, 1) '检查打开方式
  20.     If paraPos > 0 Then
  21.         MsgBox "bat"
  22.     Else
  23.         MsgBox "man"
  24.     End If
  25. End Sub

  26. '被调用的子函数 , 用来将命令行参数转换成字符串类型
  27. Function CmdToSTr(Cmd As LongPtr) As String
  28.     Dim Buffer() As Byte
  29.     Dim StrLen   As LongPtr
  30.     If Cmd Then
  31.         StrLen = lstrlenW(Cmd) * 2
  32.         If StrLen Then
  33.             ReDim Buffer(0 To CInt(StrLen - 1)) As Byte
  34.             CopyMemory Buffer(0), ByVal Cmd, StrLen
  35.             CmdToSTr = Buffer
  36.         End If
  37.     End If
  38. End Function
复制代码

执行效果:
分别使用bat命令打开Excel表格,以及手动打开Excel表格,执行的效果如下:

1.手工打开表格弹窗
手工打开表格弹窗.png

2.命令打开表格弹窗
命令打开表格弹窗.png

最终文件:
实现使用bat命令,一键打开Excel表格,自动调用VBA代码功能,代码并不复杂,只是做为基本的演示。
附件是制作好的bat调用命令文件,以及Excel测试表格,可以在此基础上,扩展执行任意自动化操作。

测试表格.xlsm

14.33 KB, 下载次数: 129, 下载积分: 贡献 -2

测试表格.xlsm

调用命令.bat

172 Bytes, 下载次数: 54, 下载积分: 贡献 -2

调用命令.bat

回复

使用道具 举报

发表于 2019-8-25 19:41:04 | 显示全部楼层
感谢楼主分享
回复 支持 1 反对 0

使用道具 举报

发表于 2019-9-12 03:59:42 | 显示全部楼层
这个真是不错;
半自动了
回复 支持 1 反对 0

使用道具 举报

发表于 2020-8-14 10:51:37 | 显示全部楼层
感谢分享,学习了!
回复 支持 1 反对 0

使用道具 举报

发表于 2020-8-18 09:02:25 | 显示全部楼层
刚开始接触学起来太困难了
回复 支持 1 反对 0

使用道具 举报

发表于 2020-12-15 18:13:58 | 显示全部楼层
谢谢分享。。。。。
回复

使用道具 举报

发表于 2021-3-11 09:10:52 | 显示全部楼层
谢谢分享....
回复

使用道具 举报

发表于 2021-3-11 09:34:43 | 显示全部楼层
非常实用,感谢分享。
回复 支持 1 反对 0

使用道具 举报

发表于 2021-5-23 21:00:06 | 显示全部楼层

非常实用,感谢分享。
回复 支持 1 反对 0

使用道具 举报

发表于 2021-6-7 10:19:56 | 显示全部楼层
谢谢楼主分享!
回复 支持 1 反对 0

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|仓库管理网

GMT+8, 2024-11-21 16:42

Powered by 库管易

KuGuanYi.Com

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