2011-01-12 4 views
6

Ich möchte zwischen Anwendung mit dem Shell-Befehl in VBA hin und her wechseln. Ich benutze SendKeys, um Sachen in Prozess A zu tun, dann gehe zu Prozess B, dann zu A und dann zu Prozess B. Es funktioniert gut für die erste Iteration. Wenn ich AppActivate verwende, um zu Prozess B zurückzukehren, wird der Fokus tatsächlich wieder auf Prozess B zurückgesetzt. Jegliche Befehle von SendKeys werden jedoch ignoriert.Verwenden von AppActivate und Sendkeys in VBA-Shell-Befehl

Beispielcode:

Sub pastePDF2TXT_v3(pdfName As String, txtName As String) 


Dim acrobatID 
Dim acrobatInvokeCmd As String 
Dim acrobatLocation As String 

Dim notepadID 

Dim acrobatID2 
Dim notepadID2 

Debug.Print "here" 


acrobatLocation = "C:\Program Files\Adobe\Acrobat 9.0\Acrobat\Acrobat.exe" 

acrobatInvokeCmd = acrobatLocation & " " & pdfName 

acrobatID = Shell(acrobatInvokeCmd, 1) 
AppActivate acrobatID 
SendKeys "^a", True '^A selects everything already in the pdf file. 
SendKeys "^c", True '^C copies the selection to the clipboard. 



notepadID = Shell("NOTEPAD.EXE " & txtName, 1) ' invoke notepad on the text file. 
AppActivate notepadID       ' set the new app as teh active task. 

SendKeys "^a", True '^A selects everything already in the text file. 
SendKeys "^v", True '^V pastes the new stuff over the top of the old text file (deleting the old stuff) 
SendKeys "%{END}", True ' makre sure last line of text file 
SendKeys "{ENTER}", True 



AppActivate acrobatID ' NOTE: APPEARS TO WORK UP TO THIS POINT. 

SendKeys "{ENTER}", True ' NOTE: SECOND APP IGNORES SUBSEQUENT COMMANDS FROM HERE DOWN. 
SendKeys "^a", True '^A selects everything already in the pdf file. 
SendKeys "^c", True '^C copies the selection to the clipboard. 
SendKeys "%f", True 'alt f, x to exit Notepad.exe 
SendKeys "x", True 
'acrobatID.Quit 


Debug.Print "start second" 

AppActivate notepadID       ' set the new app as teh active task. 


SendKeys "%{END}", True 'Go to end of text file. 
SendKeys "^v", True '^V pastes the new stuff at end of file. 
SendKeys "{ENTER}", True 

SendKeys "^s", True 

SendKeys "%f", True 'alt f, x to exit Notepad.exe 
SendKeys "x", True 

notepadID.Quit 
acrobatID.Quit 

End Sub 

Antwort

2

Dies könnte als eine Antwort eher ein Kommentar sein, aber ich scheine nicht auf „Kommentar“ zu dürfen, so ...

Es ist erstaunlich, Sie bin so weit gekommen wie du. Wahrscheinlichkeiten sind, du wirst nie in der Lage sein, diese Arbeit zuverlässig zu machen - Periode. Sobald Sie es zum Laufen bringen, wird sich etwas ändern, wie sich das Acrobat UI in einer zukünftigen Version verhält, oder Windows wird die Regeln für Dinge, die Ereignisse an andere Dinge senden können, noch einmal ändern, und dann werden Sie wieder abgespritzt .

In diesem Fall versucht Windows wahrscheinlich zu verhindern, dass eine Anwendung den Fokus von einem anderen stehlen kann, wenn ein Benutzer scheinbar damit beschäftigt ist, mit dem ersten zu interagieren. Sie sehen die gleichen Arten von Problemen, die versuchen, Dinge zu tun, wie eine Schaltfläche in einer Anwendung Daten in eine temporäre Datei schreiben und MS Word öffnen, um sie zu bearbeiten. Windows verhindert, dass der Fokus von der aktuellen App auf MS Word übertragen wird, da Sie einfach auf eine Schaltfläche in der aktuellen App geklickt haben.

Also - statt zu versuchen, dieses unmögliche technische Problem zu lösen, lassen Sie uns einen Schritt zurücktreten und fragen, was Sie ursprünglich damit erreichen wollten. Auf diese Weise können wir Sie vielleicht dorthin bringen, wo Sie hin wollen :)

+0

Was ich habe, ist ein Haufen (mehr als 1000) von PDFs, den Text, die ich mag durchforschen. Ein Teil des Textes ist frei und unbrauchbar. Andere Teile des Textes sind fast durchgängig formatiert und ich kann diese Informationen abrufen und in eine Datenbank (Excel-Tabelle) zur späteren Analyse einfügen. Nachdem die Daten in eine Textdatei eingegeben wurden, analysiere ich sie mit einem Perl-Skript, um die gewünschten Daten zu erhalten und eine CSV-Datei zu erstellen. Dies ist eine schlechte Art, dies zu tun - aus den Gründen, die Sie geben, auch weil es ästhetisch hässlich ist und es scheint nicht in allen Fällen einheitlich zu funktionieren. – elbillaf

+0

Die allgemeine Methode funktioniert, wenn die pdf nur eine Seite ist, aber für Multipage, acrobat wählt nur eine Seite auf einem^A (von sendkeys), also muss ich hin und her gehen - das scheint nicht zu funktionieren. Ich war in der Lage, dieses Problem für meine derzeitige Aufgabe zu umgehen, aber ich hätte gerne eine allgemeine Methode zur Lösung dieser Art von Problem, damit zukünftige Methoden nicht so irritierend sind. – elbillaf

+1

Können Sie etwas wie http://www.pdf2txt.com/ verwenden, anstatt zu versuchen, die Acrobat GUI zu automatisieren? –

3

Ich weiß, dass diese Frage alt ist, aber ich bin auf dasselbe Problem gestoßen, aber ich glaube nicht, dass die Antwort gewählt wurde ist der Richtige.

Wenn Sie AppActivate aufrufen, wird das Skript angehalten und wartet darauf, dass die Zielanwendung beendet wird. Nachdem die Anwendung beendet wurde, wird das Skript fortgesetzt. Ich sehe keine Lösung für dieses Problem.

EDIT:

Ich benutze eine Batch-Datei CSCRIPT für den AppActivate Befehl zu nennen, und ich merke, Sie sind eine VBS-Datei streng verwenden. Versuchen Sie, CMD als ein neues Fenster aufzurufen und übergeben Sieals das Argument, und sehen Sie, ob das das Problem umgeht.

+0

Ich habe dieses Projekt bereits beendet und arbeite dieses Problem nicht mehr; aber diese Art von Ding taucht alle paar Jahre auf, also werde ich das für die nächste Runde im Hinterkopf behalten. danke, tff. – elbillaf

2

In ähnlicher Weise versuchte ich, AppActivate für ein PDF-Dokument zu verwenden, das ich mit einem Shell-Befehl geöffnet hatte, damit ich SendKeys verwenden konnte. Es würde immer Run Time Error '5' generieren. Meine Lösung bestand schließlich darin, AppActivate überhaupt NICHT zu verwenden, und das Öffnen des Dokuments bringt es sowieso in den Vordergrund. Das Problem besteht darin, dass die SendKeys-Anweisung direkt nach dem Shell-Befehl ausgeführt wird, aber die PDF-Datei braucht ein oder zwei Sekunden, um geöffnet zu werden. Meine Lösung besteht darin, den Code für einige Sekunden anzuhalten, bevor die sendkeys-Anweisung ausgeführt wird.

Ich verwendete eine Zeitverzögerung curtosy von Potle flump. Sehen Sie sich den Thread hier an: http://www.dbforums.com/microsoft-access/1219379-time-delay-vba.html

+0

das hat für mich funktioniert. Ich verwendete eine Zeitverzögerung wie: Application.Wait Now + TimeValue ("00: 00: 2") – Selrac

2

Nach stundenlanger Recherche in verschiedenen Foren, konnte ich feststellen, dass ich Adobe Bibliothek Objekte und Funktionen mit Adobe Reader nicht verwenden kann. Die einzige praktikable Option war die Verwendung von Shell-Befehlen, um die Option "Als Text speichern" im Dateimenü von Adobe Reader zu verwenden.Die Tastenkombination ist Alt + f + ein + x + s. Ich habe diese im unten stehenden Code implementiert, was perfekt funktionierte, obwohl ich in einigen Schritten Verzögerungen einfügen musste.

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 
0

Versuchen Sendkeys "% {tab}" Fenster zu wechseln aber dann nur zwei aktive Fenster halten.

oder versuchen Sie appactivate nur nach sendkeys {Tab}, so dass Texteingabefeld nicht vor switchibg Windows cmd ausgewählt ist.

oder versuchen versuchen AppActivate Fensternamen, 1 dann schlafen 2000 ° Zeit, um das Fenster in dem Fokus zu bringen