6
votes

Utilisation de Appactivate et SendKeys dans la commande de shell VBA

Je veux basculer entre l'application avec la commande shell dans VBA. J'utilise SendKeys pour faire des choses dans le processus A puis passer au processus B, puis pour traiter A alors processus B. Cela fonctionne bien pour la première itération. Lorsque j'utilise Appactivate pour revenir au processus B, il bascule en fait la mise au point sur le processus B. Cependant, il ignore les commandes suivantes à partir de SendKeys.

Exemple code: P>

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


0 commentaires

6 Réponses :


0
votes

Cela pourrait être plus un commentaire qu'une réponse, mais je ne semble pas être autorisé à "commenter", alors ...

C'est incroyable que vous avez obtenu aussi loin que vous le faites. Les chances sont, vous n'allez jamais être en mesure de faire ce travail de manière fiable - période. Dès que vous le faites de travail, quelque chose changera sur la manière dont l'interface utilisateur Acrobat se comporte dans une version future, ou Windows apportera un autre changement aux règles de ce que les choses peuvent envoyer des événements à quelles autres choses, puis à votre recherche. .

Qu'est-ce que vous rencontrez probablement dans ce cas, Windows tente d'empêcher une application volant l'accent sur un autre lorsqu'un utilisateur est apparemment occupé à interagir avec le premier. Vous voyez les mêmes types de problèmes d'essayer de faire des choses comme ayant un bouton dans une application d'une application d'une application à un fichier temporaire et d'ouvrir MS Word pour le modifier. Windows empêche la mise au point de transférer l'application actuelle et sur MS Word car vous venez de cliquer sur un bouton dans l'application actuelle.

Ainsi, au lieu d'essayer de résoudre ce problème technique impossible, prenons un pas en arrière et demandons ce que vous espériez à l'origine d'accomplir en faisant tout cela. De cette façon, peut-être, nous pouvons vous aider où vous essayez d'aller :)


3 commentaires

Ce que j'ai est un groupe (plus de 1000) de PDF qui ont un texte que je veux analyser. Une partie du texte est une forme libre et inutilisable. D'autres parties du texte sont formatées de manière presque systématique et je peux obtenir cette information et la mettre dans une base de données (feuille de calcul Excel) pour une analyse ultérieure. Une fois que les données sont placées dans un fichier texte, je parle avec un script Perl pour obtenir les trucs que je souhaite et créer un CSV. C'est une façon sucune de faire cela - pour les raisons que vous donnez, aussi parce qu'elle est esthétiquement laide et qu'elle ne semble pas fonctionner de manière cohérente dans tous les cas.


La méthode générale fonctionne si le PDF n'est qu'une seule page, mais pour la multipage, Acrobat sélectionne uniquement une page sur un ^ a (de SendKeys) afin que je dois donc aller d'avant en arrière - ce qui ne semble pas fonctionner. J'ai pu contourner ce problème pour ma tâche actuelle, mais je voudrais une méthode générale pour répondre à ce type de problème afin que les méthodes futures ne soient pas aussi irritantes.


Pourriez-vous utiliser quelque chose comme pdf2txt.com au lieu d'essayer d'automatiser l'interface graphique Acrobat?



4
votes

Je sais que cette question est ancienne, mais je rencontre ce même problème, mais je ne pense pas que la réponse choisie est la bonne.

Lorsque vous appelez Appactivate, le script est terminé, en attendant que l'application cible se termine. Une fois la demande terminée, le script continue. Je ne vois aucune solution à ce problème.

EDIT:

J'utilise un fichier de lots pour appeler cscript pour la commande AppAtiveVate et je remarque que vous utilisez strictement un fichier VBS. Essayez d'appeler cmd comme nouvelle fenêtre et passe cscript // nologo // b wscript.createObject ("wscript.shell"). Appactivate ("nom de la fenêtre") comme le argument, et voir si cela contourne le problème.


1 commentaires

J'ai déjà terminé ce projet et je ne travaille plus ce problème; Cependant, ce genre de chose surface toutes les quelques années, alors je vais garder cela à l'esprit pour la prochaine course. merci, tff.



2
votes

De même, j'essayais d'utiliser Appactivate sur un document PDF que j'avais ouvert avec une commande shell afin que je puisse utiliser SendKeys dessus. Il générerait toujours une erreur de temps d'exécution '5'. Ma solution, finalement, n'utilisais pas d'appactivate du tout, à l'ouverture du document l'amène de toute façon au premier plan. Le problème est que l'instruction SENDKEYS s'exécute immédiatement après la commande shell, mais le PDF a besoin d'une seconde ou de deux pour s'ouvrir. Ma solution consiste à mettre en pause le code pendant quelques secondes avant d'excuser la déclaration SendKeys.

J'ai utilisé un délai de retard de la chute de Pootle Wide. Découvrez le fil ici: http://www.dbforums.com/microsoft-access/1219379 -Time-retard-vba.html


1 commentaires

cela a fonctionné pour moi. J'ai utilisé un retard de synchronisation comme: application.wait maintenant + Timevalue ("00: 00: 2")



2
votes

Après des heures de recherche sur divers forums, je pouvais déterminer que je ne pourrai pas utiliser des objets de bibliothèque Adobe et fonctionne avec Adobe Reader. La seule option viable restante était d'utiliser des commandes Shell pour utiliser l'option "Enregistrer sous texte" disponible dans le menu Fichier d'Adobe Reader. La touche de raccourci est alt + f + a + x + s . Je les ai mis en place dans le code ci-dessous qui fonctionnait parfaitement, même si j'étais nécessaire pour insérer des retards dans certaines étapes. XXX


0 commentaires

0
votes

essayer SendKeys "% {onglet}" Pour changer de fenêtre Mais ne conservez que 2 fenêtres actives.

ou essayer Appactivate seulement après SendKeys {onglet} de sorte que la zone d'entrée de texte n'est pas sélectionnée avant la SNUCTIBG Windows CMD.

ou essayer Essayez l'appactivate Window Name 1 Ensuite, sommeil 2000 ° pour laisser le temps d'apporter cette fenêtre dans la mise au point


0 commentaires

0
votes

Vous avez oublié d'ajouter des "DoEvents" entre chaque envoi et une sorte de délai de retard / attente, pour lui donner un certain temps pour exécuter.


0 commentaires