1 如何打开其他非VBA程序,shell()
如何打开其他程序,多种方法
- 点 "运行"时,输入程序的名字,打开
- Windows菜单的图形化图标打开程序
- VBA里可以用 shell 打开其他程序
- 如果是系统自带的程序,可以直接用程序名如 notepad.exe,否则就用 完整路径更保险。
Shell(pathname[,windowstyle])
Shell 函数的语法含有下面这些命名参数:
- pathname 必要参数。Variant (String),要执行的程序名,以及任何必需的参数或命令行变量 Windowstyle
- 可选参数。Variant (Integer),表示在程序运行时窗口的样式。
- 如果 windowstyle省略,则程序是以具有焦点的最小化窗口来执行的。
- 所以一般要带参数 ,1 或者 vbNormalFocus
- 下面是常用参数
- 经过测试: 非系统性文件需要有完整的路径
- 系统程序可以用关键词打开,或完整路径都可以 '但是要注意,要带激活的参数,否则可能在后台最小化。
- 因为QQ等不是windows系统文件,所以需要写完整路径到.exe,不能简写程序名 '后面这种写法是错误的,shell “QQ.EXE”,vbNormalFocus
Sub test11()
'经过测试,系统程序可以用关键词打开,或完整路径都可以
'但是要注意,要带激活的参数,否则可能在后台最小化。
Shell "notepad", 1
'Shell "notepad.exe", vbNormalFocus
'Shell "C:\Windows\winsxs\wow64_microsoft-windows-notepad_31bf3856ad364e35_6.1.7600.16385_none_d5642974be118415\notepad.exe", vbNormalFocus
'Shell "calc"
'Shell "calc.exe"
'Shell "C:\Windows\winsxs\x86_microsoft-windows-calc_31bf3856ad364e35_6.1.7601.17514_none_abc56b2678fe1108\calc.exe"
'Shell "control"
'Shell "control.exe"
Shell "C:\Program Files (x86)\Tencent\QQ\Bin\QQ", 1
'因为QQ等不是windows系统文件,所以需要写完整路径,不能简写程序名
'后面这种写法是错误的,shell "QQ.EXE", vbNormalFocus
End Sub
shell打开的程序,可以作为函数返回值,被调用
Dim RetVal
RetVal = Shell(“C:\WINDOWS\CALC.EXE”, 1) ’
2 激活和其他其他程序 (中文操作系统,注意程序名) AppActivate()
VBA.AppActivate title [, wait ]
https://docs.microsoft.com/zh-cn/office/vba/language/reference/user-interface-help/appactivate-statement
AppActivate 语句语法具有下列命名参数:
title 必需。
- titile 是必须的,是文本 “” ,而且支持模糊查询。
- 比如 “WORD” 或 “Microsoft word”
- 也支持用目标程序的线程ID,Shell函数有一个Double型的返回值。这个返回值里存的是目标程序的线程ID,可以 配合Appactive。
时间 可选。 毫秒?
特点:
- 这个是激活已经启动的程序,而不会自动开启程序
- 这里的title需要以 字符串的形式 “” 出现,并且支持模糊查找,多个只会任意激活1个。
- 被激活的程序,之前是最大化还是最小化,还会保持原状,不会直接放大,会选中在任务栏里的小APP图标
- 而在桌面的程序,会被激活后选中在前台。
实测发现的问题
- 实测发现,AppActivate “calc” AppActivate “calc.exe” 都不行
- 但是AppActivate “计算器” 可行
- 估计原因是,因为电脑是中文WIN7,所以系统的执行程序还是 calc.exe,系统的进程名也是calc.exe,但是电脑里的程序命名为中文的 计算器。
Sub test12()
AppActivate "计算器" 'AppActivate "calc" AppActivate "calc.exe" 都不行
AppActivate "记事本" 'AppActivate "notepad" AppActivate "notepad.exe" 都不行
AppActivate "QQ" '或"QQ",可模糊,不想模糊就提供精确名字, 不能是QQ.EXE
'这也不行 C:\Windows\winsxs\wow64_microsoft-windows-notepad_31bf3856ad364e35_6.1.7600.16385_none_d5642974be118415\notepad.exe
'这也不行 AppActivate "C:\Windows\winsxs\wow64_microsoft-windows-notepad_31bf3856ad364e35_6.1.7600.16385_none_d5642974be118415\notepad.exe"
End Sub
3 发送按键操作其他程序 sendkeys()
sendkeys string [,wait]
实测发现的问题
-
首先需要打开程序,shell “calc.exe”
-
打开程序后不能马上调用AppActivate “计算器”,否则会报错
-
我现在是加了个延迟 Application.Wait (Now + TimeValue(“00:00:02”))
-
或者先用其他过程打开 "calc.exe"也行
-
一个是AppActivate “计算器”, 需要用中文,而不能用 AppActivate “calc”
-
参数[,wait] 可以是true,也可以是毫秒数?
-
如果 AppActivate “计算器”,5000 并不是只等5秒。。。好像需要点击VBE才激活?
-
而写 AppActivate “计算器” 就会马上执行
'这个是MSDN官方例子,实际不好用,估计是因为作者是用的英文windows,所以可以
Dim ReturnValue, I
ReturnValue = Shell("CALC.EXE", 1) ' Run Calculator.
AppActivate ReturnValue ' Activate the Calculator.
For I = 1 To 100 ' Set up counting loop.
SendKeys I & "{+}", True ' Send keystrokes to Calculator
Next I ' to add each value of I.
SendKeys "=", True ' Get grand total.
SendKeys "%{F4}", True ' Send ALT+F4 to close Calculator.
Sub test1301()
Shell "calc.exe", 1
Application.Wait (Now + TimeValue("00:00:02"))
Dim i
AppActivate "计算器"
SendKeys "C", True
For i = 1 To 10
SendKeys i & "{+}", True
Debug.Print i
Next
End Sub
或者这样也可以
Sub test1300()
Shell "calc.exe", 1
Application.Wait Now() + VBA.TimeValue("00:00:03")
Call test1301
End Sub
Sub test1301()
Dim i
AppActivate "计算器"
SendKeys "C", True
For i = 1 To 10
SendKeys i & "{+}", True
Debug.Print i
Next
End Sub
实测按键
计算器的按键 C 不是 “c” ,但是试了 "clear"也不行,没做到计算前清除计算器的内容。
SendKeys “clear”, True
SendKeys “{clear}”, True
sendkeys的按键
https://docs.microsoft.com/zh-cn/office/vba/api/excel.application.sendkeys
Keys 参数可指定任何单个键或与 Alt、Ctrl 或 Shift 的组合键(或者这些键的组合)。 每个键均可用一个或多个字符表示,例如,“a” 表示字符 a,"{ENTER}" 表示 Enter 键。
单键输入
字母键等,一般用 “a” “k” “5”
功能键,一般用 “{enter}” “{clear}” “{esc}” “{F1}”
组合输入:般是指顺次输入
Application.SendKeys (“1234{Enter}”) '表示顺次输入 1 2 3 4 enter
组合键:表示同时按下
shift+c, 使用 “+c” '表示同时输入 按下 shift+c+e
ctrl+c, 使用 “^c”
alt+c, 使用 “%c”
复合组合键:优先识别组合键,包括()内的,然后顺次执行
shift+C+E, 使用 “+(ce)” '表示同时输入 按下 shift+c+e
shift+C+E, 使用 “+ce” '表示同时输入 按下 shift+c,然后执行e
重复按键:使用 {key number} 的形式,中间加空格,{D 9} 表示重复按9次D
{D 9} 表示重复按9次D
{down 9} 表示重复按9次down箭头
Sub 退出()
Application.Quit
Application.SendKeys "Y"
End Sub