MsgBox toujours affiché pour YOda

Résolu/Fermé
acha - 17 mai 2012 à 11:12
 Yoda - 20 mai 2012 à 14:27
Bonjour,Yoda ,

Je reviens pour te demander comment faire pour que la boite msgBox " Enregistrement Classeur en cours" reste affichée pendant l'Enregistrement et disparaisse à la fin, laissant la macro continuer.

Merci.

7 réponses

Bonjour,

Avec une boite MsgBox ça ne marche pas.
Tu dois faire un formulaire UserForm, et rajouter une procédure spéciale.

Dans la fenêtre VBAProject, click droit, Insertion , Userform.

Tu dimensionne ton UserForm et tu lui ajoutes un Label au milieu, (dans la boite à outils tu click sur le A , ensuite tu click deux points sur le UserForm).

Tu modifies le texte par défaut et inscris ton propre message. tu redimenssionnes pour voir tout le texte.

Si tu arrives à faire déjà ça, je te dirais ce qu'il fau faire ensuite.

Tiens moi au courant.
0
Yoda, je viens de faire un UserForm avec le texte
ENREGISTREMENT DU CLASSEUR

que faire maintenant?
0
Maintenat tu vas copier / coller cette procedure tout au début de ton module ou tu as ta macro.

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 Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds 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 100
    Loop While RetVal = STILL_ACTIVE
End Sub


Ensuite tu remplaces ta macro par celle-ci un peu modifiée, dis moi si ça marche.

Sub CopieClasseurXPMimi()

'enregistre le classeur
Application.StatusBar = Space(15) & "ENREGISTREMENT CLASSEUR EN COURS"
Application.EnableEvents = False
ActiveWorbook.Save
Application.EnableEvents = True

'sauve sur disque extérieur H
DEBUT:
Rep = MsgBox("Sauvegarde du Fichier" & vbCrLf _
             & "Veuillez monter le disque sur le lecteur H:", vbOKCancel + vbExclamation)
If Rep = vbOK Then
   On Error GoTo ERR1
   'test si le lecteur H:\ est prêt
   ChDir ("H:\")
   On Error GoTo 0

    'afficher ton message   
    UserForm1.Show (0)

   'Nom des fichiers origine et destination
   Orig = "D:\DépMalAs\DépMimi.xls"
   Dest = "H:\DépMimi.xls_" & Format(Date, "yyyy-mm-dd") & "_" & Format(Time, "hh\Hmm")
   
   'ne pas modifier ces 2 lignes
   commandeDOS = "cmd /c copy " & Chr(34) & Orig & Chr(34) & " " & Chr(34) & Dest & Chr(34)
   ShellWait (commandeDOS)

   'chacher ton message
   UserForm1.Hide
   MsgBox "Sauvegarde effectuée avec succès"
Else
    MsgBox "Sauvegarde annulée"
End If

Call Auto_Close
ActiveSheet.Protect
Application.Quit
Exit Sub

ERR1:
MsgBox "Erreur: le lecteur H:\ n'est pas prêt", vbCritical
Resume DEBUT

End Sub 
0
Bonjour Yoda,
L'essai de la macro complète donne:Impossible de trouver la macro
"DépMimi.Xls!CopieClasseurMimi"

Lorsque je supprime les lignes Private,Public, hProcess à End sub
la macro fontionne en affichant UserForm1"ENREGITREMENT CLASSEUR EN COURS" ainsi que MsgBox "ENREGISTREMENT CLASSEUR EN COURS" et bouton OK
un clic sur OK Fait disparaitre MsgBox tandis que UserForm1 reste affiché pendant que le classeur s'enregistre pour disparaitre avec" Sauvegarde effectuée avec succès"
Après contôle sur H: la copy est bien effectuée.
0
Non, tu dois remettre ce que t'as enlevé sans rien changer.

Fais attention, dans ce que je t'ai donné, la macro s'appelle CopieClasseurXPMimi et non CopieClasseurMimi

La macro ShellWait sert justement à faire attendre le programme jusqu'a ce que la commande copy soit achevée.

Tu as bien copié ShellWait (commandeDOS) et pas Shell.

Verifie bien le nom des macros et refais un essai.
0
Yoda, désolé j'ai supprimé ' mis au début des lignes Private à End sub et toujours:impossible de trouver la macro DépMimi.xls!CopieClasseurXPMimi
0
Fais moi une copie de tout le code du module1, (toutes les macros) , il doit y avoir quelque chose qui cloche dans l'appel de la macro.

A+
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Yoda, voici la macro:

'
Sub CopieClasseurXPMimi()


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 Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds 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 100
Loop While RetVal = STILL_ACTIVE
End Sub


'enregistre le classeur
DEBUT:

Rep = MsgBox("Sauvegarde du Fichier" & vbCrLf _
& "Veuillez vérifier que le disque H: est branché", vbOKCancel + vbExclamation)
If Rep = vbOK Then
On Error GoTo ERR1

' test si le lecteur H:\ est prêt
ChDir ("H:\")

On Error GoTo 0

'afficher message
UserForm1.Show (0)

MsgBox "ENREGISTREMENT CLASSEUR EN COURS"


'MsgBox Format(Now() - vChrono, "h:mm:ss"), vbOK, "PATIENTEZ"
Application.EnableEvents = False
ActiveWorkbook.Save
Application.EnableEvents = True

'sauve sur disque extérieur H


'Nom des fichiers origine et destination
Orig = "D:\DépMalAs\DépMimi.xls"
Dest = "H:\DépMimi.xls" & " " & Format(Date, "dd-mm-yyyy") & "_" & Format(Time, "hh\Hmm")

'ne pas mofifier ces 2 lignes
commandeDos = "cmd /c copy " & Chr(34) & Orig & Chr(34) & " " & Chr(34) & Dest & Chr(34)
ShellWait (commandeDos)

'cacher message
UserForm1.Hide

'On Error GoTo 0

MatailleD = FileLen("D:\DépMalAs\DépMimi.xls")
ChDir ("H:\")
MatailleH = FileLen("\DépMimi.xls")

MsgBox "Sauvegarde effectuée avec succès" & " " & MatailleD & " " & "octets" _
& " " & MatailleH

' MsgBox "taille fichier sur disque H" = MatailleH

Else
MsgBox " Sauvegarde annulée"
End If

Call Auto_Close
ActiveSheet.Protect
Application.Quit
Exit Sub

ERR1:
MsgBox "Erreur: le lecteur H:\ n'est pas prêt", vbCritical
Resume DEBUT


End Sub
0
Forcement, tel que c'est là ça peut pas marcher, tu as imbriqué les deux procédures.
Je te remets tout dans l'ordre. Fais un copier / coller tel que c'est ci-dessous.
Dis moi si ça marche. A+

'Déclaration de variables globales, ne pas modifier
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 Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Private Const STILL_ACTIVE = &H103
Private Const PROCESS_QUERY_INFORMATION = &H400

'Procédure ShellWait, ne pas modifier
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 100
    Loop While RetVal = STILL_ACTIVE
End Sub

'Ta procédure d'enregistrement
Sub CopieClasseurXPMimi()

'enregistre le classeur
Application.StatusBar = Space(15) & "ENREGISTREMENT CLASSEUR EN COURS"
Application.EnableEvents = False
ActiveWorbook.Save
Application.EnableEvents = True

'sauve sur disque extérieur H
DEBUT:
Rep = MsgBox("Sauvegarde du Fichier" & vbCrLf _
             & "Veuillez monter le disque sur le lecteur H:", vbOKCancel + vbExclamation)
If Rep = vbOK Then
   On Error GoTo ERR1
   'test si le lecteur H:\ est prêt
   ChDir ("H:\")
   On Error GoTo 0

    'afficher ton message   
    UserForm1.Show (0)

   'Nom des fichiers origine et destination
   Orig = "D:\DépMalAs\DépMimi.xls"
   Dest = "H:\DépMimi.xls_" & Format(Date, "yyyy-mm-dd") & "_" & Format(Time, "hh\Hmm")
   
   'ne pas modifier ces 2 lignes
   commandeDOS = "cmd /c copy " & Chr(34) & Orig & Chr(34) & " " & Chr(34) & Dest & Chr(34)
   ShellWait (commandeDOS)

   'chacher ton message
   UserForm1.Hide
   MsgBox "Sauvegarde effectuée avec succès"
Else
    MsgBox "Sauvegarde annulée"
End If

Call Auto_Close
ActiveSheet.Protect
Application.Quit
Exit Sub

ERR1:
MsgBox "Erreur: le lecteur H:\ n'est pas prêt", vbCritical
Resume DEBUT

End Sub 
0
Bonjour Yoda,
L'essai de cette macro donne: Impossible de trouver la macro DépMimi.xls!Copie ClasseurXPMimi et
en quittant
Seul des commentaires peuvent apparaître après End Sub ou EndFonction ou End Property
En dessous le copier/coller de la Macro en place, j'espère ne pas y avoir
fait d'erreurs

A+

Sub CopieClasseurXPMimi()


'Déclaration de variables globales, ne pas modifier
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 Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Private Const STILL_ACTIVE = &H103
Private Const PROCESS_QUERY_INFORMATION = &H400

'Procédure ShellWait, ne pas modifier
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 100
Loop While RetVal = STILL_ACTIVE


'Ta procédure d'enregistrement


'enregistre le classeur
Application.StatusBar = Space(15) & "ENREGISTREMENT CLASSEUR EN COURS"
Application.EnableEvents = False
'ActiveWorbook.Save
Application.EnableEvents = True

'sauve sur disque extérieur H
DEBUT:
Rep = MsgBox("Sauvegarde du Fichier" & vbCrLf _
& "Veuillez monter le disque sur le lecteur H:", vbOKCancel + vbExclamation)
If Rep = vbOK Then
On Error GoTo ERR1
'test si le lecteur H:\ est prêt
ChDir ("H:\")
On Error GoTo 0

'afficher ton message
UserForm1.Show (0)

'Nom des fichiers origine et destination
Orig = "D:\DépMalAs\DépMimi.xls"
Dest = "H:\DépMimi.xls_" & Format(Date, "yyyy-mm-dd") & "_" & Format(Time, "hh\Hmm")

'ne pas modifier ces 2 lignes
commandeDOS = "cmd /c copy " & Chr(34) & Orig & Chr(34) & " " & Chr(34) & Dest & Chr(34)
ShellWait (commandeDOS)

'chacher ton message
UserForm1.Hide
MsgBox "Sauvegarde effectuée avec succès"
Else
MsgBox "Sauvegarde annulée"
End If

Call Auto_Close
ActiveSheet.Protect
Application.Quit
Exit Sub

ERR1:
MsgBox "Erreur: le lecteur H:\ n'est pas prêt", vbCritical
Resume DEBUT

End Sub
0
Tu as refait exactement les mêmes erreurs.
Je ne vais pas recopier encore une fois. Reprends intégralement ce que je t'ai mis dans le message précédent. Voici comment ça doit être structuré:

D'abord il y a la partie déclaration des variables globales
'Déclaration de variables globales, ne pas modifier
Private Declare Function .....
......

Esuite la Procédure ShellWait
'Procédure ShellWait, ne pas modifier
Public Sub ShellWait(ByVal JobToDo As String)
....
....
End Sub

Enfin ta procédure
'Ta procédure d'enregistrement
Sub CopieClasseurXPMimi()
'enregistre le classeur
Application.StatusBar = Space(15) & "ENREGISTREMENT CLASSEUR EN COURS"
...
...
End Sub

Or tu n'a pas respecté cette structure. Tu as commencé par Sub CopieClasseurXPMimi()
à la suite de quoi tu as mélangé les déclarations et la procédure ShellWait, alors que ce sont trois parties biens distinctes. Voilà pour les explications.
Supprime tout ton code et fait un copié/collé de ce que je t'ai envoyé tel quel, tu verras que ça marchera.

A+.
0
Bonjour Yoda,

La macro copier/coller foctionne à condition de supprimer ActiveWorbook.save pourquoi?
Inconvénient, la fermeture demande "Voulez-vous enregistrer le classeur OUI NON"

la macro ci dessous fonctionne parfaitement et enregitre le classeur au début.



Sub CopieClasseurXPMimi()

'enregistre le classeur
DEBUT:

Rep = MsgBox("Sauvegarde du Fichier" & vbCrLf _
& "Veuillez vérifier que le disque H: est branché", vbOKCancel + vbExclamation)
If Rep = vbOK Then
On Error GoTo ERR1

' test si le lecteur H:\ est prêt
ChDir ("H:\")

On Error GoTo 0

'afficher message
UserForm1.Show (0)

MsgBox "ENREGISTREMENT CLASSEUR EN COURS"


'MsgBox Format(Now() - vChrono, "h:mm:ss"), vbOK, "PATIENTEZ"
Application.EnableEvents = False
ActiveWorkbook.Save
Application.EnableEvents = True

'sauve sur disque extérieur H


'Nom des fichiers origine et destination
Orig = "D:\DépMalAs\DépMimi.xls"
Dest = "H:\DépMimi.xls" & " " & Format(Date, "dd-mm-yyyy") & "_" & Format(Time, "hh\Hmm")

'ne pas mofifier ces 2 lignes
commandeDOS = "cmd /c copy " & Chr(34) & Orig & Chr(34) & " " & Chr(34) & Dest & Chr(34)
Shell (commandeDOS)

'cacher message
UserForm1.Hide

On Error GoTo 0

MatailleD = FileLen("D:\DépMalAs\DépMimi.xls")
ChDir ("H:\")
MatailleH = FileLen("\DépMimi.xls")

MsgBox "Sauvegarde effectuée avec succès" & " " & MatailleD & " " & "octets" _
& " " & MatailleH


Else
MsgBox " Sauvegarde annulée"
End If

Call Auto_Close
ActiveSheet.Protect
Application.Quit
Exit Sub

ERR1:
MsgBox "Erreur: le lecteur H:\ n'est pas prêt", vbCritical
Resume DEBUT


End Sub
0
Je ne comprend pas ce que tu fais.

Je me creuse la tête pour dénicher une macro ShellWait qui arrête l'execution de la macro CopieClasseurXPMimi en laissant UserForm1 affiché le temps de la sauvegarde.

Finalement tu reviens à la macro d'origine avec Shell mais en laissant quand même l'affichage de UserForm1, tu rajoutes des instructions que t'as trouvé par-ci par-là...

On s'en sortira pas. Je laisse tomber.
Bonne continuation.
0