在VBA shell命令中使用AppActivate和Sendkeys

在VBA shell命令中使用AppActivate和Sendkeys,shell,vba,sendkeys,Shell,Vba,Sendkeys,我想用VBA中的shell命令在应用程序之间来回切换。 我使用SendKeys来完成流程A中的工作,然后移动到流程B,然后再移动到流程A,然后再移动到流程B。它在第一次迭代中运行良好。当我使用AppActivate返回到进程B时,它实际上会将焦点切换回进程B。但是,它会忽略来自SendKeys的后续命令 示例代码: 子粘贴PDF2TXT_v3(pdfName为字符串,txtName为字符串) 暗淡杂技演员 将ECMD作为字符串调用 将位置设置为字符串 Dim notepadID 昏暗的杂技演员2

我想用VBA中的shell命令在应用程序之间来回切换。 我使用SendKeys来完成流程A中的工作,然后移动到流程B,然后再移动到流程A,然后再移动到流程B。它在第一次迭代中运行良好。当我使用AppActivate返回到进程B时,它实际上会将焦点切换回进程B。但是,它会忽略来自SendKeys的后续命令

示例代码:

子粘贴PDF2TXT_v3(pdfName为字符串,txtName为字符串)
暗淡杂技演员
将ECMD作为字符串调用
将位置设置为字符串
Dim notepadID
昏暗的杂技演员2
Dim notepadID2
调试。打印“此处”
acrobatLocation=“C:\Program Files\Adobe\Acrobat 9.0\Acrobat\Acrobat.exe”
acrobatInvokeCmd=acrobatLocation&“”&pdfName
AcrobaId=Shell(AcrobaInvokeCMD,1)
活跃杂技演员
SendKeys“^a”,True“^a选择pdf文件中已有的所有内容。
SendKeys“^c”,True“^c将所选内容复制到剪贴板。
notepadID=Shell(“NOTEPAD.EXE”&txtName,1)”在文本文件上调用NOTEPAD。
AppActivate notepadID'将新应用设置为活动任务。
SendKeys“^a”,True“^a选择文本文件中已有的所有内容。
SendKeys“^v”,True“^v将新内容粘贴到旧文本文件的顶部(删除旧内容)
SendKeys“%{END}”,True'确保文本文件的最后一行
SendKeys“{ENTER}”,真
AppActivate acrobatID'注意:到目前为止似乎仍在工作。
SendKeys“{ENTER}”,True'注意:第二个应用程序会忽略下面的后续命令。
SendKeys“^a”,True“^a选择pdf文件中已有的所有内容。
SendKeys“^c”,True“^c将所选内容复制到剪贴板。
SendKeys“%f”,True,alt f,x退出Notepad.exe
SendKeys“x”,正确
“我退出
调试。打印“第二次启动”
AppActivate notepadID'将新应用设置为活动任务。
SendKeys“%{END}”,True'转到文本文件的末尾。
SendKeys“^v”,True“^v将新内容粘贴到文件末尾。
SendKeys“{ENTER}”,真
SendKeys“^s”,对吗
SendKeys“%f”,True,alt f,x退出Notepad.exe
SendKeys“x”,正确
notepadID.退出
杂技演员,退出
端接头

这可能更多的是一个评论而不是一个答案,但我似乎不被允许“评论”,所以

你能走这么远真是太神奇了。有可能的是,你永远都无法使这项工作可靠地进行。一旦成功,Acrobat UI在将来的版本中的行为就会发生变化,或者Windows会对哪些内容可以将事件发送到哪些其他内容的规则进行另一次更改,然后您将再次受到影响

在这种情况下,您可能会遇到Windows试图防止应用程序在用户显然忙于与第一个应用程序交互时从另一个应用程序窃取焦点。您在尝试执行类似操作时会遇到同样的问题,例如在一个应用程序中使用按钮将数据写入临时文件,然后打开MS Word进行编辑。Windows阻止焦点从当前应用转移到MS Word,因为您刚刚单击了当前应用中的按钮


请不要试图解决这个不可能的技术问题,让我们后退一步,问问你最初希望通过做这一切来实现什么。这样,也许我们可以把你带到你想去的地方:)

我知道这个问题很老了,但我遇到了同样的问题,但我不认为选择的答案是正确的

调用AppActivate时,脚本将暂停,等待目标应用程序终止。应用程序终止后,脚本将继续。我认为这个问题没有解决办法

编辑:


我使用批处理文件调用AppActivate命令的CSCRIPT,我注意到您严格使用的是VBS文件。尝试调用
CMD
作为一个新窗口,并将
CSCRIPT//NoLogo//B WScript.CreateObject(“WScript.shell”).AppActivate(“窗口名”)
作为参数,看看这是否绕过了这个问题。

类似地,我尝试在使用shell命令打开的pdf文档上使用AppActivate,以便在其上使用SendKeys。它将始终生成运行时错误“5”。最终,我的解决方案是根本不使用AppActivate,事实上,打开文档会让它走到最前沿。问题是SendKeys语句在shell命令之后立即执行,但pdf需要一两秒钟才能打开。我的解决方案是在执行sendkeys语句之前暂停代码几秒钟

我用了一种延时的蓬松姿态。在这里查看线程:

在各种论坛上研究了几个小时后,我发现我无法在AdobeReader上使用AdobeLibrary对象和函数。唯一可行的选择是使用Shell命令使用Adobe Reader的文件菜单中的“另存为文本”选项。快捷键是Alt+f+a+x+s。我在下面的代码中实现了这些功能,虽然我需要在某些步骤中插入延迟,但这些代码工作得非常好

Sub SavePDFasText()
Dim AdobeReaderPath As String
Dim PdfFilePath As String
Dim PDFid, NotepdId As Double

AdobeReaderPath = "C:\Program Files\Adobe\Reader 10.0\Reader\AcroRd32.exe"
PdfFilePath = "D:\PowerGenMacro\opm_11.pdf"
PDFid = Shell(AdobeReaderPath & " " & PdfFilePath, vbNormalFocus)
Application.Wait TimeSerial(Hour(Now()), Minute(Now()), Second(Now()) + 5)
'Alt+f+a+x is required to save the pdf as text in the adobe reader
SendKeys "%(FAX)", True
Application.Wait TimeSerial(Hour(Now()), Minute(Now()), Second(Now()) + 2)
SendKeys "%S", True
SendKeys "^q", True

End Sub
试一试 发送键“%{tab}” 切换窗口 但只保留两个活动窗口

或尝试 appactivate仅在sendkeys{Tab}之后激活,以便在切换IBG windows cmd之前不选择文本输入框

或尝试 请尝试激活窗口名称,1 然后睡眠2000°以便有时间聚焦该窗口

您忘记在每个发送键和延迟/等待时间之间添加“DoEvents”,给它一些执行时间。

我拥有的是一堆(1000多个)PDF,其中包含我想要解析的文本。有些文本是自由形式的,无法使用。文本的其他部分的格式几乎是一致的,我可以得到这些信息并将其放入数据库(excel电子表格)中供以后分析。将数据放入文本文件后,我使用perl脚本进行解析,以获得所需内容并创建CSV。这是一个糟糕的方式做这件事-为