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 :

Enchaînement MsgBox vbYesNo


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    1 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 1 150
    Par défaut Enchaînement MsgBox vbYesNo
    (J'AI MODIFIE LE CODE PRECEDEMMENT POSTE)


    Bonjour,
    Je cherche le code pour déclencher plusieurs actions sous condition, le problème étant que j'ai l'impression qu'Excel se perd dans mon code entre les If Else End If.

    En schématisant

    J'ai deux grandes conditions:

    Fermeture Simple

    Fermeture non simple

    Et dans cette dernière, deux sous conditions:

    Pause déjeuné

    Non pause déjeuné

    Dans certains cas, je demande à Excel un enregistrement puis une fermeture

    Dans d'autres, une action puis un enregistrement puis une fermeture

    Le code:

    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Dim w As Workbook
    Sheets("Feuil6").Select
    Range("B1").Select
    Application.Calculation = xlManual
    Sheets("Feuil1").Select
    Range("A65536").End(xlUp).Select
     If MsgBox("FERMETURE SIMPLE?", vbYesNo) = vbYes Then
     
     Call EnregistrerAction("FERMETURE SIMPLE")
     On Error GoTo Handler
    Handler:
    On Error Resume Next
        Application.OnTime temps, Procedure:="majHeure", Schedule:=False
        Workbooks("TIPI0.xlsm").Close True
    Exit Sub
     
     Else
     
    EnregistrerAction ("FERMETURE SESSION")
     
       If MsgBox("PAUSE DEJ?", vbYesNo) = vbYes Then
           EnregistrerAction ("FERMETURE SESSION DEJEUNE")
           ActiveSheet.Unprotect
     
           MsgBox "A tout de suite " & Environ("UserName")
        Range("B65536").End(xlUp).Offset(1, 0).Select
        ActiveCell.Formula = "=NOW()"
         Selection.Copy
        Range("B65536").End(xlUp).Select
        Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _
            xlNone, SkipBlanks:=False, Transpose:=False
        Application.CutCopyMode = False
     
          'ThisWorkbook.Save
     
          ActiveSheet.Protect
     
     
          On Error Resume Next
        Application.OnTime temps, Procedure:="majHeure", Schedule:=False
        Workbooks("TIPI0.xlsm").Close True
     
          Exit Sub
     
     
       Else
     
           ActiveSheet.Unprotect
     
           MsgBox "Au revoir " & Environ("UserName")
        Range("E65536").End(xlUp).Offset(1, 0).Select
        ActiveCell.Formula = "=NOW()"
         Selection.Copy
        Range("E65536").End(xlUp).Select
        Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _
            xlNone, SkipBlanks:=False, Transpose:=False
        Application.CutCopyMode = False
     
          'ThisWorkbook.Save
     
          ActiveSheet.Protect
     
     
          On Error Resume Next
        Application.OnTime temps, Procedure:="majHeure", Schedule:=False
     
        For Each w In Workbooks
           'MsgBox w.Name
       Call EnregistrerAction("FERMETURE " & w.Name)
     
     
        w.Close True
     
     
        Next w
        Workbooks("TIPI0.xlsm").Close True
          Exit Sub
     
        End If
     
          End If
     
     
    End Sub
    Est ce que quelqu'un peut m'aider à sortir de ce cercle vicieux.

    Merci beaucoup

  2. #2
    Expert confirmé Avatar de casefayere
    Homme Profil pro
    RETRAITE
    Inscrit en
    Décembre 2006
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : RETRAITE
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 138
    Par défaut
    Bonjour,
    ça ne résoudra pas ton probleme mais
    avant tout, c'est moche les "Select", rien que cette partie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Range("B65536").End(xlUp).Offset(1, 0).Select
        ActiveCell.Formula = "=NOW()"
         Selection.Copy
        Range("B65536").End(xlUp).Select
        Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _
            xlNone, SkipBlanks:=False, Transpose:=False
        Application.CutCopyMode = False
    peut être remplacée par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Range("B" & Rows.Count).End(xlUp).Offset(1, 0).Formula = "=NOW()"
        Range("B" & Rows.Count).End(xlUp) = Range("B" & Rows.Count).End(xlUp).Offset(1, 0).Value
    adaptes pour le reste
    Cordialement,
    Dom
    _____________________________________________
    Vous êtes nouveau ? pour baliser votre code, cliquer sur cet exemple : Anomaly
    pensez à cliquer sur :resolu: si votre problème l'est
    Par contre, il est désagréable de voir une discussion résolue sans message final du demandeur (satisfaction, désarroi, remerciement, conclusion...)

  3. #3
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    1 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 1 150
    Par défaut
    C'était le meilleur moyen que j'avais trouvé pour rentrer la date du moment auquel l'action se fait sans qu'elle reste en formule pour la figer, c'est un fichier qui me compte mes périodes de temps de travail décomposé en matins et après midis.

    Désolé, j'ai retravaillé un peu le code, voici ce qu'il est maintenant:

    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Dim w As Workbook
    Sheets("Feuil6").Select
    Range("B1").Select
    Application.Calculation = xlManual
    Sheets("Feuil1").Select
    Range("A65536").End(xlUp).Select
     If MsgBox("FERMETURE SIMPLE?", vbYesNo) = vbYes Then
     
     Call EnregistrerAction("FERMETURE SIMPLE")
     On Error GoTo Handler
    Handler:
    On Error Resume Next
        Application.OnTime temps, Procedure:="majHeure", Schedule:=False
        Workbooks("TIPI0.xlsm").Close True
    Exit Sub
     
     Else
     
    EnregistrerAction ("FERMETURE SESSION")
     
       If MsgBox("PAUSE DEJ?", vbYesNo) = vbYes Then
           EnregistrerAction ("FERMETURE SESSION DEJEUNE")
           ActiveSheet.Unprotect
     
           MsgBox "A tout de suite " & Environ("UserName")
        Range("B65536").End(xlUp).Offset(1, 0).Select
        ActiveCell.Formula = "=NOW()"
         Selection.Copy
        Range("B65536").End(xlUp).Select
        Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _
            xlNone, SkipBlanks:=False, Transpose:=False
        Application.CutCopyMode = False
     
     
     
          ActiveSheet.Protect
     
     
          On Error Resume Next
        Application.OnTime temps, Procedure:="majHeure", Schedule:=False
        Workbooks("TIPI0.xlsm").Close True
     
          Exit Sub
     
     
       Else
     
           ActiveSheet.Unprotect
     
           MsgBox "Au revoir " & Environ("UserName")
        Range("E65536").End(xlUp).Offset(1, 0).Select
        ActiveCell.Formula = "=NOW()"
         Selection.Copy
        Range("E65536").End(xlUp).Select
        Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _
            xlNone, SkipBlanks:=False, Transpose:=False
        Application.CutCopyMode = False
     
     
     
          ActiveSheet.Protect
     
     
          On Error Resume Next
        Application.OnTime temps, Procedure:="majHeure", Schedule:=False
     
        FermerTousClasseurs
          Exit Sub
     
        End If
     
          End If
     
     
    End Sub
    Ok.

    Existe-t-il un moyen pour "attacher" un Else et un End If à son If si on a:

    Sub

    (A) If MsgBox vbYesNo Yes Then

    (B) If Msgbox vbYesNo Yes Then

    (B) Else

    (B) End If

    (A) Else

    (A) End If

    End Sub

    Pour que (A) reste lié à (A) et (B) à (B)?

    Je sais bien que mes pinceaux sont parfaitement emmelables est qu'excel ne fait qu'obéir mais cela pourrait aussi correspondre à un fonctionnement d'Excel qui ne repère pas les "rimes croisées ou embrassées"?

  4. #4
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Ce que tu décris là est une structure I classique.
    Les Else et End If sont liés au If par leur occurence. C'est à dire que tu les ferme dans l'ordre inverse dans lequel tu les as ouverts.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    (A) If MsgBox vbYesNo Yes Then
     
        (B) If Msgbox vbYesNo Yes Then
     
        (B) Else
     
        (B) End If
     
    (A) Else
     
    (A) End If
    Je le répète : une indentation correcte te permettra d'éviter de te perdre dans tes structures.

    Autre conseil : tu n'es pas obligé d'utiliser tout de suite le résultat d'un MsgBox. Tu peux mettre ce résultat dans une variable de type Integer.

    Je te donne un exemple :

    Si tu écris ça (ce n'est pas un vrai code, ça juste schématique) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    If MsgBox = vbYes Then
       Action A
       Action B
       Action C
       Action D
       Action E
    Else
       Action B
       Action D
       Action X
    End If
    Il est plus simple d'écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Dim Reponse As Integer
     
    Reponse = MsgBox
     
    If Reponse = vbYes Then Action A
    Action B
    If Reponse = vbYes Then Action C
    Action D
    If Reponse = vbYes Then 
       Action E
    Else
       Action X
    End If
    Ce type de codage peut simplifier beaucoup ton code dans lequel tu as répété beaucoup d'instructions.

  5. #5
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    1 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 1 150
    Par défaut
    En effet, c'est bien plus clair.

    Menhir, dans ton dernier code, si je comprends bien:

    Reponse est la réponse de la msgbox (yes ou no) que tu appliques à 3 cas (un par ligne de répétition).
    Excel ouvre alors 3 msgbox successives? est applique le bon then à chaque fois?

    Est-ce bien cela?

    Ca rentrerait bien dans mes plans pour le code alors

  6. #6
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Citation Envoyé par Kestion100 Voir le message
    Reponse est la réponse de la msgbox (yes ou no) que tu appliques à 3 cas (un par ligne de répétition).
    Excel ouvre alors 3 msgbox successives? est applique le bon then à chaque fois?
    Est-ce bien cela?
    Non, pas du tout.
    Et c'est tout l'intérêt de la méthode : tu n'ouvre le MsgBox qu'une fois (il n'est écrit qu'une fois dans le code), mais, au lieu d'utiliser directement le résultat dans un If, tu le places dans une variable Interger.
    Ensuite, tu peux utiliser ce résultat comme bon te semble dans le reste du code : il est à disposition.

    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
    Reponse = MsgBox("Est-ce qu'on ajoute de la confiture ?")
     
    Couper le pain
     
    If Reponse = vbYes Then
        Mettre de la confiture
    Else
        Mettre du miel
    End If
     
    Donner le gouter à l'enfant
    Ranger le pain
     
    If Reponse = vbNo Then
        Ranger le miel
    Else
        Ranger la confiture
    End If
    La MsgBox ne se trouve qu'une seule fois dans le code et l'utilisateur n'y répond qu'une fois.
    Pourtant, dans la suite du code, la réponse, placée dans une variable, est utilisée plusieurs fois.

  7. #7
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Citation Envoyé par Kestion100 Voir le message
    j'ai l'impression qu'Excel se perd dans mon code entre les If Else End If.
    Généralement, c'est plutôt le programmeur qui se perds dans ses structures If.

    Comme le répétait à longueur de cours ma prof d'Histoire/géo de 6è (citant Boileau) : Ce qui se conçoit bien s'énonce clairement et les mots pour le dire viennent aisément.
    Transposé à la programmation, donne : écrit clairement ton algorithme et ton code en découlera aisément.

    Un conseil : pour éviter de s'y perdre dans les structures If et autres, indente correctement ton code.

    Autre conseil : pas de "On Error" en phase de développement.

  8. #8
    Membre expérimenté
    Homme Profil pro
    Ingénieur commercial
    Inscrit en
    Février 2015
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur commercial

    Informations forums :
    Inscription : Février 2015
    Messages : 118
    Par défaut
    Citation Envoyé par Menhir Voir le message
    Un conseil : pour éviter de s'y perdre dans les structures If et autres, indente correctement ton code.
    Bonjour, Menhir a parfaitement raison et les codes modifiés que tu présentes sont illisibles.

    Exemple de code "lisible" avec ton premier programme non modifié :

    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
     
    Private Sub Workbook_BeforeClose(Cancel As Boolean)
        Dim w As Workbook
     
        Sheets("Feuil6").Select
        Range("B1").Select
        Application.Calculation = xlManual
        Sheets("Feuil1").Select
        Range("A65536").End(xlUp).Select
        If MsgBox("FERMETURE SIMPLE?", vbYesNo) = vbYes Then
            Call EnregistrerAction("FERMETURE SIMPLE")
            On Error GoTo Handler
    Handler:
     
            On Error Resume Next
            Application.OnTime temps, Procedure:="majHeure", Schedule:=False
            Workbooks("TIPI0.xlsm").Close True
            Exit Sub
        Else
     
            EnregistrerAction ("FERMETURE SESSION")
     
            If MsgBox("PAUSE DEJ?", vbYesNo) = vbYes Then
                EnregistrerAction ("FERMETURE SESSION DEJEUNE")
                ActiveSheet.Unprotect
                MsgBox "A tout de suite " & Environ("UserName")
                Range("B65536").End(xlUp).Offset(1, 0).Select
                ActiveCell.Formula = "=NOW()"
                Selection.Copy
                Range("B65536").End(xlUp).Select
                Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
                Application.CutCopyMode = False
                'ThisWorkbook.Save
                ActiveSheet.Protect
                On Error Resume Next
                Application.OnTime temps, Procedure:="majHeure", Schedule:=False
                Workbooks("TIPI0.xlsm").Close True
                Exit Sub
            Else
                ActiveSheet.Unprotect
                MsgBox "Au revoir " & Environ("UserName")
                Range("E65536").End(xlUp).Offset(1, 0).Select
                ActiveCell.Formula = "=NOW()"
                Selection.Copy
                Range("E65536").End(xlUp).Select
                Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
                Application.CutCopyMode = False
                'ThisWorkbook.Save
                ActiveSheet.Protect
                On Error Resume Next
                Application.OnTime temps, Procedure:="majHeure", Schedule:=False
                For Each w In Workbooks
                    'MsgBox w.Name
                    Call EnregistrerAction("FERMETURE " & w.Name)
                    w.Close True
                Next w
                Workbooks("TIPI0.xlsm").Close True
                Exit Sub
            End If
         End If
     
    End Sub
    A+

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

Discussions similaires

  1. [XL-2003] INSÉRER UNE MsgBox vbYesNo
    Par BtjpsspgrW dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 10/06/2014, 16h37
  2. Boucle à base de MsgBox vbYesNo
    Par Automnep dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 28/04/2013, 00h58
  3. Réponse d'un MsgBox vbYesNo
    Par two3d dans le forum VB.NET
    Réponses: 5
    Dernier message: 01/12/2012, 23h05
  4. Probleme avec Msgbox,vbyesno
    Par benhmou dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 22/03/2012, 23h33
  5. MsgBox vbYesNo en SQL possible?
    Par georgesasc dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 03/08/2010, 20h40

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