“Windows Script Host (WSH) Shell 对象”总是听到或看到有人问,编程好学吗?如何入门?多久能学会?它能做些什么?怎么写代码呀?执行过程中出问题了谁能帮帮我...如果你也有类似的问题那就赶快关注我的公众号,一起学起来吧!
标准 Excel 对象模型虽然功能很多很强大,但是也有它无法直接完成的任务,因此VBA为我们预留了后门,方便我们以VBA为跳板直接进入这扇门
比如,接下来请出的这位WScript.Shell 对象
这是特别常用的功能,通过WScript.Shell 对象的SendKeys方法可以模拟人工敲击键盘,将按键发送到活动窗口,所以经常有人用它来自动发微信消息、在网页上自动填内容之类的
举个简单的使用案例:自动向文本文件中输入一串文字,如“你好,欢迎来到VBA的世界”为了让SendKeys一次就命中并锁定到目标文本文件tmp.txt,此处使用进程号ID激活文本窗口AppActivate pid,可以通过任务管理器查看PIDSub SendSomeKeys() Dim Sh As Object Set Sh = CreateObject("WScript.Shell") Dim pid As Long On Error Resume Next ' 防止运行时出错 pid = 6652 AppActivate pid On Error GoTo 0 Application.Wait Now + TimeValue("0:00:02") Sh.SendKeys "nh,hy laidao VBA de shijie ~" ' ~ 符号代表回车键(Enter)End Sub
可能有朋友会问了,不是要输入“你好,欢迎来到VBA的世界”吗,为何SendKeys中是“nh,hy laidao VBA de shijie”?稍微解释一下:SendKeys 只是机械地模拟物理键盘的按键动作,当我们想输中文时,它无法直接告诉系统“切换到中文并打出‘你好’这两个字。因此想要输中文,必须先切换到中文输入法。之后,再SendKeys "nh " 或 SendKeys "nh1" 在大多数智能拼音输入法(如搜狗、微软拼音)下,都会打出“你好”当按F5执行SendSomeKeys之后,就会激活tmp.txt的窗口,并把它显示在最前面,不会被其他窗口挡住,等待两秒钟后,会看到动态输入效果,输入完成后显示如下:- 在执行SendSomeKeys期间,任何微小的干扰(如点击了别的地方、弹出提示框等)都会导致按键发错地方或输入法状态改变,从而失败
- 执行SendKeys前一定要预留出窗口切换和渲染的时间。因为SendKeys 命令的执行速度远远快于Windows操作系统处理窗口切换、应用程序响应和界面渲染的速度。如果不预留时间,按键指令很可能会在错误的窗口、错误的时机被发送出去。当然对于极其不稳定的环境,预留再多的等待时间也是徒劳,寻找新出路才是王道,后续有需要再介绍
通过WScript.Shell 对象的SpecialFolders方法实现
例如,获取系统的特殊文件夹路径,如桌面、收藏夹、我的文档等,代码参考
Sub GetSpecialFolders() Dim WsShell As Object Set WsShell = CreateObject("WScript.Shell") ' 获取系统文件夹的路径 Debug.Print "桌面路径: " & WsShell.SpecialFolders("Desktop") Debug.Print "我的文档: " & WsShell.SpecialFolders("MyDocuments") Debug.Print "收藏夹: " & WsShell.SpecialFolders("Favorites") Debug.Print "启动文件夹: " & WsShell.SpecialFolders("StartMenu") Debug.Print "公共桌面: " & WsShell.SpecialFolders("AllUsersDesktop") Debug.Print "当前用户启动: " & WsShell.SpecialFolders("Startup") Debug.Print "公共启动: " & WsShell.SpecialFolders("AllUsersStartup") Debug.Print "AppData: " & WsShell.SpecialFolders("AppData")End Sub
在没有使用 SpecialFolders 之前,如果想在VBA中引用“我的文档”或“桌面”,可能需要这样编码:
filePath = "C:\Users\zhangsan\Documents\myFile.txt"
这种方式非常脆弱,一旦系统用户名改变、或者用户自定义了文件夹位置,代码就会出错
而使用 SpecialFolders,就可以这样编码,不但告别了硬编码,还能以不变应万变
Dim WsShell As Object Set WsShell = CreateObject("WScript.Shell") ' 可靠地获取“我的文档”路径 documentsPath = WsShell.SpecialFolders("MyDocuments") filePath = documentsPath & "\myFile.txt"
好了,今天的编程知识到此结束了,又到每日冷知识小分享时间了
今天分享的是二进制:它是计算机世界的“通用语言”,计算机底层最核心的计数方式,因为计算机的硬件电路天然支持“通电/断电”“高电平/低电平”两种状态,正好对应二进制的0和1,因此数字0~9在二进制中表示为:
所以说,无论我们使用哪种编程语言编写的代码,最终都会转换成二进制
本公众号一直在不间断地分享免费的编程案例和实用技巧。无论您是用来提升自动化办公效率还是想提升自我,请关注我的公众号,解锁更多的编程知识