excel - 如何等待 shell 命令完全打开应用程序?
问题描述
目前,我的 VBA 代码能够验证文件是否存在。如果存在,它会打开文件并用“Hello”替换所有“Test”实例。如果它不存在,它会发送一条消息说明存在。我的问题是,在打开文件(在本例中为 Word 文档)时,可能需要几秒钟,并且代码返回“运行时错误”。有没有办法可以等待应用程序完全打开,直到继续?我已经尝试过“Application.Wait”方法,但它并不那么可靠,因为该文件可能需要一秒钟以上的时间。此外,我看到其他论坛建议改用 WScript.Shell,但是有没有办法可以在我的代码中使用该类型?
If strFileExists = "" Then
MsgBox "The selected file doesn't exist"
Else
Set objShell = CreateObject("shell.application")
objShell.ShellExecute strFileName, "", "", "open", 3
Application.Wait (Now + TimeValue("00:00:01"))
Set myRange = ActiveDocument.Content
myRange.Find.Execute FindText:="Test", ReplaceWith:="Hello", _
Replace:=wdReplaceAll
Set objShell = Nothing
End If
解决方案
您可以使用 Windows API FindWindowExA或FindWindowA函数来解决您的问题(我想您使用的是 Windows)。顺便说一句,我已经在我的工作中为同样的问题实现了 API 解决方案(无法提供代码,因为我不在我的工作桌面和 Linux、ATM 上)。
查找窗口标题是什么(只需打开文件并在标题栏中输入您看到的标题)。通常,它由文件名和应用程序的名称组成(例如,my_file.docx - Word
或my_file - Word
)。然后,将FindWindowExA
或FindWindowA
函数放入While
或Until
循环中。将窗口标题传递给函数。一旦找到具有指定标题的窗口,退出循环。
推荐阅读
- matlab - 在 Matlab 上的每次迭代中存储错误的问题 - “无法识别的变量”
- android - 在 Xamarin Forms 中找不到“Master Detail Forms App”选项?
- python - 有没有办法让 isort 自动检测具有多个独立包的代码库中的第一方和第三方模块?
- python - 返回第一个非零值的列名
- python - 如何运行计算
- c# - 如何使用 System.Reflection 遍历所有字符串属性并更改其值
- swift - 从 Swift 字符串中删除周围的引号,同时保留类似于 Kotlin 命令 string.removeSurrounding 的内部引号
- arduino - sprintf 导致时间问题?
- javascript - 调用类方法时默认添加事件监听器
- antlr4 - ANTLR4 歧义 - 如何解决