VBA 如何用VBA控制,开启,激活其他非VBA程序?

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值