“Windows Script Host (WSH) Shell 对象”
标准 Excel 对象模型虽然功能很多很强大,但是也有它无法直接完成的任务,因此VBA为我们预留了后门,方便我们以VBA为跳板直接进入这扇门
比如,接下来请出的这位 WScript.Shell 对象
模拟键盘输入和发送
这是特别常用的功能,通过 WScript.Shell 对象的 SendKeys方法 可以模拟人工敲击键盘,将按键发送到活动窗口, 所以经常有人用它来自动发微信消息、在网页上自动填内容之类的
举个简单的使用案例:自动向文本文件中输入一串文字,如“ 你好,欢迎来到VBA的世界 ”
为了让 SendKeys 一次就命中并锁定到目标文本文件tmp.txt,此处使用进程号ID激活文本窗口 AppActivate pid,可以通过任务管理器查看PID
![]()
参考代码:
Sub SendSomeKeysDim Sh As ObjectSet Sh = CreateObject("WScript.Shell")Dim pid As LongOn Error Resume Next ' 防止运行时出错pid = 6652AppActivate pidOn Error GoTo 0Application.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的窗口,并把它显示在最前面,不会被其他窗口挡住 ,等待两秒钟后,会看到动态输入效果,输入完成后显示如下:
![]()
2个重要提醒:
在执行 SendSomeKeys期间, 任何微小的干扰(如点击了别的地方、弹出提示框等)都会导致按键发错地方或输入法状态改变,从而失败
执行 SendKeys前一定要预留出 窗口切换和渲染的时间。因为 SendKeys 命令的执行速度远远快于Windows操作系统处理窗口切换、应用程序响应和界面渲染的速度。如果不预留时间,按键指令很可能会在错误的窗口、错误的时机被发送出去。当然对于极其不稳定的环境,预留再多的等待时间也是徒劳,寻找新出路才是王道,后续有需要再介绍
获取系统特殊文件夹
通过 WScript.Shell 对象的 SpecialFolders 方法实现
例如, 获取系统的特殊文件夹路径,如桌面、收藏夹、我的文档等,代码参考
Sub GetSpecialFoldersDim WsShell As ObjectSet 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 ObjectSet WsShell = CreateObject("WScript.Shell")' 可靠地获取“我的文档”路径documentsPath = WsShell.SpecialFolders("MyDocuments")filePath = documentsPath & "\myFile.txt"
结束语
好了,今天的编程知识到此结束了,又到每日冷知识小分享时间了
今天分享的是二进制: 它是 计算机世界的“通用语言”, 计算机底层最核心的计数方式, 因为计算机的硬件电路天然支持“通电/断电”“高电平/低电平”两种状态,正好对应二进制的0和1,因此数字0~9在二进制中表示为:
![]()
所以说,无论我们使用哪种编程语言编写的代码,最终都会转换成二进制
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.