文章目录

  • VBA的Shell函数
    • 函数参数介绍
    • 过程等待
    • 案例-执行Windows的bat文件
    • 案例-mysql查询
    • 案例-执行python脚本
    • 案例-指定应用程序打开文件
    • AppActivate语句
    • EXCEL表格函数打开应用程序
  • ShellExecute函数
    • 函数介绍
    • 函数API声明
    • 案例:打开网页、图片、文本、EXCEL

VBA的Shell函数

函数参数介绍

Shell(PathName[,WindowStyle])

  • PathName :要执行的程序名,包括目录或文件夹
  • WindowStyle :程序运行时窗口的样式

Shell函数返回在第一个参数中指定的应用程序的任务标识。可以使用这个数字在稍后激活该任务;
Shell函数启动的应用正在运行时,VBA进程不会终止(类似于加入了进程等待)。
Shell函数异步运行应用程序,执行Shell函数后,还有其他过程,会与Shell函数内容同时执行;
Shell函数第二个参数WindowStyle的值:

常量 说明
vbHide 0 窗口将隐藏,并且焦点将传递给隐藏窗口。
vbNormalFocus 1 窗口具有焦点且还原为其原始大小和位置。
vbMinimizedFocus 2 窗口将显示为具有焦点的图标。
vbMaximizedFocus 3 使用焦点最大化窗口。
vbNormalNoFocus 4 窗口将还原为其最新的大小和位置。 当前活动窗口仍保持活动状态。
vbMinimizedNoFocus 6 窗口将显示为图标。 当前活动窗口仍保持活动状态。

示例:

Function shell_func(Program As String)
' Program:应用名称
Dim TaskId As Double
On Error Resume Next
TaskId = Shell(Program, 1)      ' 任务标识,参数1代表窗口具有焦点且还原为其原始大小和位置
If Err <> 0 Then     ' 不等于0,表示报错MsgBox "无法打开应用:" & Program, vbCritical, "Error"
End If
End Function

过程等待

Shell在运行完之后会关闭小黑窗,处理快点几乎看不见,可以通过在命令行前加入cmd /k,小黑窗不会关闭;
Shell "cmd /k ipconfig/all"
VBA等待shell执行完再执行后面进程,可以定义这么一个函数

Function ShellAndWait(cmd As String) As String Dim oShell As Object, oExec As ObjectSet oShell = CreateObject("WScript.Shell")Set oExec = oShell.exec(cmd)        ' 执行cmd命令result = oExec.StdOut.ReadAll    ' 读取命令行返回的内容,读完后再进行vba后面的逻辑处理;Set oShell = NothingSet oExec = Nothing
End Function

案例-执行Windows的bat文件

Shell "c:/bat_file.bat"


案例-mysql查询

Sub sql_to_txt()
Dim this_path,cmd As Stringthis_path = ThisWorkbook.Path    ' 当前工作簿的路径
ChDrive "F"   '切换磁盘渠道到F盘
ChDir this_path     ' 切换路径,这样my_ndim_table文件就写入到工作簿所在目录下了
'-u账号 -p密码 库名mydb -e执行 "要执行的sql",> 查询结果重定向到txt文件
cmd = "cmd /k mysql -uroot -p123456 mydb -e ""select * from d_mg_game_ndim limit 20"" > my_ndim_table.txt"
shell cmd, 1
End Sub

案例-执行python脚本

' 打开jupyter notebook
Shell "jupyter notebook"' 执行python脚本
shell "python d:/python.py"

案例-指定应用程序打开文件

这里使用的是notepad++打开命名为my_ndim_table.txt的文本文件

ChDrive "c"
ChDir "C:\Program Files (x86)\Notepad++"
cmd_str = ".\notepad++.exe F:\桌面\my_ndim_table.txt"
Debug.Print cmd_strShell cmd_str, 1

AppActivate语句

如果一个程序已经在运行,使用shell函数会启动另一个实例,大多情况下,只需要激活正在运行的实例,而并非启动另一个实例。可以通过AppActivate语句激活实例;

Sub StartCalculate()
Dim Program As String
Dim TaskId As DoubleProgram = "calc.exe"   ' 计算器
On Error Resume Next   '遇到错误,继续执行下面语句
AppActivate "计算器"    ' 这里是应用程序面板的标题titile
If Err <> 0 Then   ' 如果没有捕捉到‘计算器’程序,则err不等于0Err = 0TaskId = shell(Program, 1)    ' 打开计算器If Err <> 0 Then MsgBox "无法打开计算器"
End If
End Sub


EXCEL表格函数打开应用程序

如果是在工作表里,我们可以使用该函数:
=HYPERLINK("C:\Windows\System32\calc.exe","打开计算器")


ShellExecute函数

函数介绍

使用API函数ShellExecute能打开任何文件(包括桌面和URL快捷方式)。ShellExecute解析系统注册表HKEY_CLASSES_ROOT中所有的内容,判断启动哪一个执行程序,并且启动一个新的实例或使用DDE将文件名连到一打开的实例。然后,ShellExecute返回打开文件的应用的实例句柄。
ShellExecute函数可以简单地打开磁盘文件和Internet文件。如果将第二个参数“OPEN”改为“PRINT”或者“EXPLORE”,则ShellExecute能打印文件或打开文件夹。

该函数只能启用已知文件名的应用程序(文件类型在Windows注册)


函数API声明

在模块中的声明部分输入如下声明语句

Private Declare PtrSafe Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hWnd As Long, _ByVal ipOperation As String, ByVal lpFile As String, _ByVal lpParameters As String, ByVal lpDirectory As String, _ByVal nShowCmd As Long) As Long

声明关键词:

  • Declare关键字:在模块级别中声明对动态链接库(DLL)中外部过程的引用。
  • Function关键字:紧随Function的函数名是从VBA中调用该函数时要使用的名称。该名称可以与API函数本身的名称相同,也可以使用Declare语句中的Alias关键字,表示要在VBA中使用不同的名称(“别名”)调用该函数。
  • Lib关键字:指明包含所声明过程或函数的动态链接库。它说明的是函数或过程从何而来的问题。例如在上例中,SetFocus Lib"user32"说明函数SetFocus来自“user32.dll”文件。
  • Alias关键字:用于指定API函数的别名,如果调用的API函数要使用字符串(参数中包含String类型),则Alias关键字是必需的。这是因为在ANSI和Unicode字符集中同一API函数的名称可能是不一样的。为了保证不出现声明错误的情况,必须使用Alias关键字指出API函数的别名。

案例:打开网页、图片、文本、EXCEL

Sub open_url()
' 打开百度链接
res = ShellExecute(0&, vbNullString, "http://www.baidu.com", vbNullString, vbNullString, 1)' 打开图片
res = ShellExecute(0&, vbNullString, "F:\桌面\111.png", vbNullString, vbNullString, 1)' 打开txt文件
res = ShellExecute(0&, vbNullString, "my_ndim_table.txt", vbNullString, vbNullString, 1)' 打开excel表格
res = ShellExecute(0&, vbNullString, "F:\excel_file.xlsx", vbNullString, vbNullString, 1)
End Sub

VBA调用Shell相关推荐

  1. vba执行linux命令,如何使用vba的shell()运行参数的.exe?

    我有一个目标文件路径的结构如下例所示. C:\Program Files\Test\foobar.exe /G 我需要做的就是使用vba的shell()命令来执行这个文件. 如何格式化文件路径以告诉S ...

  2. VBA调用bat,doc 命令行 窗口关闭之后,VBA代码 再继续执行

    VBA调用doc命令,doc窗口关闭之后,继续执行代码 Option Explicit'Docワィンドワ閉じるした後.後続けの処理実施 Public Declare Function WaitForS ...

  3. 使用VBA调用jar传递参数,并获取返回值

    目录 ■VBA代码 ■Java代码 ■运行效果 Excel Log效果 (通过VBA调用jar后,运行,生成的Log) ■课题 ■课题原因(直接原因) ●log4j的配置 ■课题验证 ■课题解决(其他 ...

  4. java无阻塞执行脚本,JAVA调用Shell脚本-及阻塞的解决方法

    JAVA调用Shell脚本--及阻塞的解决办法 用java调用shell,使用 Process p=Runtime.getRuntime().exec(String[] cmd); Runtime.e ...

  5. python 调用shell命令的方法

    转载: https://www.cnblogs.com/thinker-lj/p/3860123.html https://www.cnblogs.com/wenwangt/p/4897961.htm ...

  6. Java调用 shell脚本阻塞

    Java在调用Shell时,要不断读取进程中标准输出和错误输出流的信息,否则缓冲区被写满就会造成子进程阻塞而无法继续运行下去,可起两个线程不断读取标准输出.错误流信息而不被阻塞 import java ...

  7. 从Ruby调用Shell命令

    如何从Ruby程序内部调用Shell命令? 然后如何将这些命令的输出返回到Ruby? #1楼 上面的答案已经很不错了,但是我真的很想分享以下摘要文章:" 在Ruby中运行Shell命令的6种 ...

  8. 基于sparksql调用shell脚本运行SQL

    [Author]: kwu 基于sparksql调用shell脚本运行SQL,sparksql提供了类似hive中的 -e  , -f ,-i的选项 1.定时调用脚本 #!/bin/sh # uplo ...

  9. Vim命令行模式调用shell命令方式(笔记)

    本文为阅读vim实用技巧时的一部分笔记 在vim中操作时,我们能很方便德调用shell命令.下面选取了最有用的一些调用外部命令的方式: :shell:启动一个shell(输入exit返回vim) :! ...

最新文章

  1. mysql show processlist info null_关于查询mysql processlist的建议
  2. libmysqld_dev linux,Linux下python玩转MySQLdb
  3. linux编译l和l区别,linux 下 g++编译程序时-I(大写i) 与-L(大写l)-l(小写l) 的作用详解...
  4. armv6、armv7、armv7s及arm64
  5. 微信小程序云开发-支付
  6. prometheus + cadvisor + grafana 监控容器和服务器
  7. 送给计算机老师平安夜贺卡,平安夜小朋友送老师的贺卡寄语
  8. 2022考公务员难还是考研难?
  9. AI虚拟教练助你练出人鱼线,揭秘Keep AI运动技术实力
  10. 数学之美--计算机图形学中的数学方法论
  11. go语言导入自定义包出现: package xxx is not in GOROOT (/xxx/xxx) 的解决方案
  12. 跨境电商看不到另一面:商家刷单、平台封号、黑灰产牟利
  13. t460 拆解_ThinkPad T460s开箱及更换内存和硬盘
  14. 用volatile的视角,来打开JMM内存模型
  15. 改变命运的早上三分钟 之 三
  16. 天猫商品详情接口,天猫商品优惠券接口,天猫api接口,天猫价格监控接口,天猫比价接口,品牌维权接口,天猫销量api接口,接口代码可对接数据分析业务,品牌维权,比价业务,行业分析业务接口代码分享
  17. zabbix之3触发器/action及模板
  18. 小程序源码:登录已修复零象垃圾废品回收微信小程序源码下载,V2.8.2完整全开源前端+后端
  19. 特殊气体的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  20. 基于深度学习的图像识别模型研究综述

热门文章

  1. 软件著作权申请注意事项——计算机软件著作权登记申请(R11申请)流程
  2. FormData对象用法
  3. Gitee+PicGo上传图片失败404 - {“status“:“404“,“error“:“Not Found“}
  4. html5自带可编辑文字属性
  5. 黑鲨鸿蒙系统手机,黑鲨4代参数_黑鲨4代手机参数配置
  6. 如何将Mac文件添加到 iCloud 云盘的具体操作方法!
  7. win10设置微信双开电脑登录多个微信,超级详细教程,小白也可轻松设置
  8. SQL126 平均活跃天数和月活人数
  9. L2TP客户端之Strongswan移植(二)
  10. 嵌入式行业的发展前景?