IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

ShellWait en VBA ?


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé Avatar de Zebulon777
    Homme Profil pro
    Informaticien
    Inscrit en
    Février 2005
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Février 2005
    Messages : 1 327
    Par défaut ShellWait en VBA ?
    Salut les amis,

    depuis assez longtemps j'utilise une procédure pour exécuter des commandes externes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Public Sub ShellWait(ByVal JobToDo As String)
    Dim hProcess As Long, RetVal As Long
     
        hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, False, Shell(JobToDo, vbMinimizedNoFocus))
        Do
            GetExitCodeProcess hProcess, RetVal
            DoEvents
    '        Sleep 10
        Loop While RetVal = STILL_ACTIVE
    End Sub
    Cette procédure fonctionne impec sous Windows XP, mais impossible de la faire fonctionner sous Windows 7.

    Sur la ligne, "hProcess=...", j'ai le message d'erreur :
    erreur d'exécution 53
    Fichier introuvable.

    Merci d'avance pour votre aide.

  2. #2
    Invité
    Invité(e)
    Par défaut Bonjour, regarde ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #if win32 then
    Private Declare Function OpenProcess
    #else
    Private Declare Ptrsafe  Function OpenProcess
    #end if
    idem pour toutes tes déclarations

  3. #3
    Membre éprouvé Avatar de Zebulon777
    Homme Profil pro
    Informaticien
    Inscrit en
    Février 2005
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Février 2005
    Messages : 1 327
    Par défaut
    Je ne comprends pas.
    Dans mon code, j'ai déjà les déclarations :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
    Private Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess As Long, lpExitCode As Long) As Long
    Private Const STILL_ACTIVE = &H103
    Private Const PROCESS_QUERY_INFORMATION = &H400
    Declare Function mciExecute Lib "winmm.dll" (ByVal lpstrCommand As String) As Long
    Je dois ajouter ton code à la suite ?

  4. #4
    Invité
    Invité(e)
    Par défaut
    la déclaration est différente suivant la version de Windows
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Private Declare
    Private Declare Ptrsafe 
    c'est pour cela que j'intègre des directives de compilation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Private Const STILL_ACTIVE = &H103
    Private Const PROCESS_QUERY_INFORMATION = &H400
    #if win32 then
         private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
    Private Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess As Long, lpExitCode As Long) As Long
         Declare Function mciExecute Lib "winmm.dll" (ByVal lpstrCommand As String) As Long
    #Else
           private Declare Ptrsafe  Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
    Private Declare Ptrsafe  Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess As Long, lpExitCode As Long) As Long
          Declare  Ptrsafe  Function mciExecute Lib "winmm.dll" (ByVal lpstrCommand As String) As Long
    #end if

  5. #5
    Invité
    Invité(e)
    Par défaut
    Salut rdurupt,

    Il faut toujours mettre Win64 avant Win32. La raison est que Win32 n'est pas la version du Windows ou la version du Excel mais est une compatibilité. Un Excel 64 bit est vu par le VBA comme étant compatible 32 bit, mais non compatible 16 bit. Il y a un ordre typique:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #If Win64 Then
        MsgBox "Win64"
    #ElseIf Win32 Then
        MsgBox "Win32"
    #ElseIf Win16 Then
        MsgBox "Win16"
    #End If
    Si Win64 passe, les autres sont rejeté grâce à ElseIf. En passant Win32 en 1er, un système 64 bit verra Win32 comme étant OK et ira dans le #If et rejètera le Else/ElseIf.

    C'est la même chose pour les VBA6/7. Il ne s'agit pas d'une version mais d'une compatibilité. La constante de compile VBA6 passera sur un Excel 2010 ou 2013.

    Je pense qu'il vaut mieux déclarer avec la constante VBA7 plutôt, quitte à insérer un Win64 dans le VBA7 comme ça doit être le cas par exemple avec la fonction GetTickCount64 qui s'appel GetTickCount sous Windows 32 bit et il faut utiliser un Alias pour par exemple les appeler tous les deux GTC3264 dans la déclaration pour pouvoir être appelé dans le code par un même nom.


    Sinon, très souvent (il y a surement des exceptions), les noms commençant par h tel que Hwnd, hProcess, hThread, hInstance, hModule etc... sont des handle a déclarer uniquement en LongPtr (ou soit en LongLong si la constante de compile est Win64 par exemple, mais pas obligatoire).

    -----------------------------------------------------------------------------------------------------------
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    #If VBA7 Then
        Private Declare PtrSafe Function GetExitCodeProcess Lib "kernel32" ( _
                        ByVal hProcess As LongPtr, lpExitCode As Long) As Long
        Private Declare PtrSafe Function OpenProcess Lib "kernel32" ( _
                        ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, _
                        ByVal dwProcessID As Long) As LongPtr
        Declare PtrSafe Function mciExecute Lib "winmm.dll" ( _
                ByVal lpstrCommand As String) As Long
    #Else
         private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
         Private Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess As Long, lpExitCode As Long) As Long
         Declare Function mciExecute Lib "winmm.dll" (ByVal lpstrCommand As String) As Long
    #End If
    Private Const STILL_ACTIVE = &H103
    Private Const PROCESS_QUERY_INFORMATION = &H400
     
     
    Public Sub ShellWait(ByVal JobToDo As String)
    #If VBA7 Then
        Dim hProcess As LongPtr
    #Else
        Dim hProcess As Long
    #End If
    Dim RetVal As Long
     
        hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, False, Shell(JobToDo, vbMinimizedNoFocus))
        Do
            GetExitCodeProcess hProcess, RetVal
            DoEvents
        Loop While RetVal = STILL_ACTIVE
    End Sub
     
    Public Sub TestApplication()
        ShellWait "NOTEPAD.EXE"
        MsgBox "Process Fini"
    End Sub
    ---------------------------------------------------------------------

    Mais sinon, je pense que le problème de Zebulon777 est ailleurs. Il ne nous dit pas si Win7/Excel est en 64 bit ou non.
    Si il est en 32 bit, le code ne devrai pas changer pourtant entre WinXP et Win7.
    Dernière modification par Invité ; 03/09/2013 à 00h11.

  6. #6
    Membre éprouvé Avatar de Zebulon777
    Homme Profil pro
    Informaticien
    Inscrit en
    Février 2005
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Février 2005
    Messages : 1 327
    Par défaut
    Merci pour vos réponses, les gars, mais je suis encore plus embrouillé...

    Avant l'application fonctionnait très bien sur Win XP 32 / Excel 2003.
    Il faut maintenant que nous fassions en sorte que l'application en question fonctionne AUSSI sous Win 7 64 / Excel 2003 ET Excel 2010.

    Voici donc le code que nous avons :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
    Private Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess As Long, lpExitCode As Long) As Long
    Private Const STILL_ACTIVE = &H103
    Private Const PROCESS_QUERY_INFORMATION = &H400
     
    Public Sub ShellWait(ByVal JobToDo As String)
    Dim hProcess As Long, RetVal As Long
     
        hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, False, Shell(JobToDo, vbMinimizedNoFocus))
        Do
            GetExitCodeProcess hProcess, RetVal
            DoEvents
    '        Sleep 10
        Loop While RetVal = STILL_ACTIVE
    End Sub
    Donc, ce code ne fonctionne pas sous Win7-64 / Excel 2003, mais je n'ai pas encore pu le tester avec Excel 2010.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [VBA] [Interface] BringToFront/SendToBack
    Par DarkVader dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 23/10/2002, 14h29
  2. [VBA-E] [Excel] Lancer une macro à une heure donnée
    Par Lysis dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 16/10/2002, 12h15
  3. [VBA-E] [Excel] Tri automatique
    Par bovi dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 01/10/2002, 10h19
  4. [VBA-E] [Excel] Filtrer le donnees d'une sheet
    Par donia dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 27/09/2002, 10h55
  5. problème avec VBA
    Par Delph dans le forum Langage
    Réponses: 2
    Dernier message: 19/08/2002, 13h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo