Attendre pour la Coquille à la fin, puis format de cellule - synchrone exécuter une commande
J'ai un exécutable que j'appel à l'aide de la commande shell:
Shell (ThisWorkbook.Path & "\ProcessData.exe")
L'exécutable ne certains calculs, ensuite l'exportation des résultats vers Excel. Je veux être en mesure de changer le format des résultats APRÈS ils sont exportés.
En d'autres termes, j'ai besoin de la commande du Shell d'abord ATTENDRE jusqu'à ce que l'exécutable termine sa tâche, exporte les données, et ENSUITE faire la prochaine commandes de format.
J'ai essayé le Shellandwait()
, mais sans beaucoup de chance.
J'ai eu:
Sub Test()
ShellandWait (ThisWorkbook.Path & "\ProcessData.exe")
'Additional lines to format cells as needed
End Sub
Malheureusement, encore, la mise en forme prend place avant de l'exécutable est terminée.
Juste pour référence, voici mon code complet à l'aide de ShellandWait
' Start the indicated program and wait for it
' to finish, hiding while we wait.
Private Declare Function CloseHandle Lib "kernel32.dll" (ByVal hObject As Long) As Long
Private Declare Function WaitForSingleObject Lib "kernel32.dll" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
Private Declare Function OpenProcess Lib "kernel32.dll" (ByVal dwDesiredAccessas As Long, ByVal bInheritHandle As Long, ByVal dwProcId As Long) As Long
Private Const INFINITE = &HFFFF
Private Sub ShellAndWait(ByVal program_name As String)
Dim process_id As Long
Dim process_handle As Long
' Start the program.
On Error GoTo ShellError
process_id = Shell(program_name)
On Error GoTo 0
' Wait for the program to finish.
' Get the process handle.
process_handle = OpenProcess(SYNCHRONIZE, 0, process_id)
If process_handle <> 0 Then
WaitForSingleObject process_handle, INFINITE
CloseHandle process_handle
End If
Exit Sub
ShellError:
MsgBox "Error starting task " & _
txtProgram.Text & vbCrLf & _
Err.Description, vbOKOnly Or vbExclamation, _
"Error"
End Sub
Sub ProcessData()
ShellAndWait (ThisWorkbook.Path & "\Datacleanup.exe")
Range("A2").Select
Range(Selection, Selection.End(xlToRight)).Select
Range(Selection, Selection.End(xlDown)).Select
With Selection
.HorizontalAlignment = xlLeft
.VerticalAlignment = xlTop
.WrapText = True
.Orientation = 0
.AddIndent = False
.IndentLevel = 0
.ShrinkToFit = False
.ReadingOrder = xlContext
.MergeCells = False
End With
Selection.Borders(xlDiagonalDown).LineStyle = xlNone
Selection.Borders(xlDiagonalUp).LineStyle = xlNone
End Sub
- Si vous essayez le code complet sur:
http://www.cpearson.com/excel/ShellAndWait.aspx
Vous devez vous connecter pour publier un commentaire.
Essayer le Objet WshShell au lieu de la maternelle
Shell
fonction.Bien noter que:
Afin de détecter si le programme est exécuté avec succès, vous avez besoin
waitOnReturn
à être défini à True, comme dans mon exemple ci-dessus. Sinon, il sera tout juste de retour à zéro, peu importe quoi.Pour le début de la liaison (donne accès à de l'auto-complétion), une référence à "Windows Script Host Object Model" (Outils > Reference > coche) et de le déclarer comme ceci:
Pour lancer votre processus au lieu de le bloc-notes... j'attends votre système rechignent à des chemins contenant des caractères espace (
...\My Documents\...
,...\Program Files\...
, etc.), donc vous devez placer le chemin d'accès dans"
citations"
:wsh.Run()
.Ce que vous avez fonctionnera une fois que vous ajoutez
qui votre. (Sens
0
est passé comme le droit d'accès àOpenProcess
qui n'est pas valide)Faire
Option Explicit
la ligne supérieure de l'ensemble de vos modules aurait provoqué une erreur dans ce casLa
WScript.Shell
de l'objet.Run()
méthode comme l'a démontré Jean-François Député de réponse utile est le bon choix si vous savez que la commande vous appelez va se terminer dans le délai prévu.Ci-dessous est
SyncShell()
, une alternative qui vous permet de spécifier un délai, inspiré par la grandeShellAndWait()
mise en œuvre. (Le dernier est un peu lourde et parfois un maigre alternative est préférable.)Shell-et-Attendre en VBA (Compact Edition)
Exemple D'Utilisation:
Adapté de (et plus d'options à) Puce de Pearson site.
Je cherchais une solution simple aussi, et finalement à faire de ces deux fonctions, alors peut-être pour les futurs amateurs de lecteurs 🙂
1.) prog doit être en cours d'exécution, lit tasklist de dos, le statut de sortie
fichier, lire le fichier en vba
2.) début du prog et attendre jusqu'à ce prog est fermé avec un wscript shell .exec waitonrun
3.) demander la confirmation pour supprimer le fichier tmp
Modifier le nom du programme et les variables de chemin d'accès et d'exécuter en une seule fois.
Je viens à ce à l'aide de la
Timer
fonction. Comprendre à peu près combien de temps vous voulez que la macro pour mettre en pause pendant la .exe fait son truc, et puis de modifier le " 10 " dans la ligne de commentaire pour tout le temps (en secondes) que vous le souhaitez.Cela devrait faire l'affaire, laissez-moi savoir si ce n'.
Acclamations, Ben.