Revenir en arrière dans une boucle avec MsgBox

Résolu
Kuartz Messages postés 852 Date d'inscription   Statut Membre Dernière intervention   -  
Kuartz Messages postés 852 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour à tous.

Je vous explique ce que je souhaiterais faire.

Dans un premier temps voici mon code original :

If MsgBox("Voulez-vous vérifier la TVA sur les débits?", vbYesNo, "Vérif RAN TVA débits") = vbYes Then
        For I = 13 To DL
            If Sheets(1).Range("D" & I) = "RAN" Then
                Sheets(1).Range("B" & I).Select
                retval = MsgBox("La facture suivante (tiers : " & Range("B" & I) & " ) est-elle soummise à TVA sur les débits?", vbYesNoCancel, "Vérif TVA débits")
                If retval = vbYes Then
                    Sheets(1).Range("N" & I) = Sheets(1).Range("K" & I)
                ElseIf retval = vbCancel Then
                    Exit For
                End If
            End If
        Next I
    End If


(Les variables ont été définies avant et tout marche correctement, le code est très long en entier)

Voilà donc ce code me permet, après avoir répondu "oui" à la première MsgBox, de sélectionner une à une les cellules de la colonne B qui répondent à la condition "D = RAN" puis de remplir mon tableau petit à petit en fonction de ma réponse "OUI ou NON".

Ce que je souhaiterais c'est avoir un bouton supplémentaire ("LIGNE PRECEDENTE") qui pourrait me ramener à la ligne d'avant répondant à la condition "D = RAN". En fait le problème est que les gens cliquent trop vite et font une erreur et je me suis rendu compte qu'on ne pouvait pas revenir à la ligne précédente pour rerépondre à la question de la MsgBox "RetVal". Pensez-vous que cela est possible?

Merci d'avance.

Cordialement.

2 réponses

  1. PlacageGranby Messages postés 402 Statut Membre 26
     
    Bonjour,

    Il n'est pas possible d'avoir un 4ieme bouton pour précédent sur le msgbox a moins d'importer un nouveau contrôle ce qui n'est pas nécessaire.

    Donc, il faut ajouter un msgbox au code.
    Je vois deux possibilité.
    Soit on ajouter un msgbox pour confirmer notre choix pour retval et on force l'utilisateur à faire deux clic tout le temps jusqu'a temps que l'utilisateur se fâche et nous arrache la tête.

    Soit on ajouter un msgbox dans la portion Cancel pour offrir deux choix.
    Du genre, si on a fait oui et on voulait faire non, à la prochaine question on choisi cancel et il valide si on veut vraiment canceller ou plutôt remonter à la ligne précédente en trafiquant la valeur de notre variable I.

    If MsgBox("Voulez-vous vérifier la TVA sur les débits?", vbYesNo, "Vérif RAN TVA débits") = vbYes Then
            For I = 13 To DL
                If Sheets(1).Range("D" & I) = "RAN" Then
                    Sheets(1).Range("B" & I).Select
                    retval = MsgBox("La facture suivante (tiers : " & Range("B" & I) & " ) est-elle soummise à TVA sur les débits?", vbYesNoCancel, "Vérif TVA débits")
                    If retval = vbYes Then
                        Sheets(1).Range("N" & I) = Sheets(1).Range("K" & I)
                    ElseIf retval = vbCancel Then
                        if Msgbox("Faite ok pour revenir à la ligne précédente, ou cancel pour annuler", Vbokcancel, "Confirmer le choix") = VBok then
                             I = i -2
                         Else
                                Exit For
                         End If
                    End If
                End If
            Next I
        End If
    0
  2. Kuartz Messages postés 852 Date d'inscription   Statut Membre Dernière intervention   65
     
    Bonjour,

    Merci pour ces informations et de vous être penché sur mon problème.

    Cependant, le bouton annuler + OK me laisse sur la même ligne. Je ne reviens pas à la ligne d'avant. En gros, j'appellerais cette suite de MsgBox un événement. J'aurais voulu qu'on revienne à l'événement précédent.

    Exemple: Avec votre code, excel me dit : "Voulez vous contrôler la TVA sur les débits", je répond oui, il sélectionne alors la première cellule de la colonne B pour qui D = RAN. Nouvelle MsgBox "La facture suivante (tiers : "X") est elle soumise à TVA sur les débits?", je répond oui, la cellule N & i se remplit. On passe alors à la cellule B & i suivante (Tiers Y). Mince, je m'étais trompé, je veux revenir au tiers X. Or, votre code reste le tiers Y.
    0
    1. PlacageGranby Messages postés 402 Statut Membre 26
       
      Re-Bonjour,
      On boucle sur les ligne à l'aide de la variable i
      Donc, si ok choisi si on s'est trompé, on fait cancel lors de la cellule suivante, et il nous demande si on cancel, ou si c'est un "rollback", on choisi ok, et il change i pour revenir à la ligne précédente.

      Si l'on veut réagir avant le changement de ligne, c'est ma solution #1.
      Excel ne peut pas savoir qu'un erreur à été faite. Donc soit on trappe l'erreur avec le MSGbox existant, soit on rajoute un msgbox pour savoir s'il y a une erreur ou non.

      If MsgBox("Voulez-vous vérifier la TVA sur les débits?", vbYesNo, "Vérif RAN TVA débits") = vbYes Then
              For I = 13 To DL
                  If Sheets(1).Range("D" & I) = "RAN" Then
                      Sheets(1).Range("B" & I).Select
                      retval = MsgBox("La facture suivante (tiers : " & Range("B" & I) & " ) est-elle soummise à TVA sur les débits?", vbYesNoCancel, "Vérif TVA débits")
                      IF msgbox("Confirmer qu'il n'y a pas d'erreur",vbYesNo,"Message qui va tapper sur les nerfs") = vbYes then
                          If retval = vbYes Then
                              Sheets(1).Range("N" & I) = Sheets(1).Range("K" & I)
                          ElseIf retval = vbCancel Then
                              Exit For
                          End If
                      Else
                           I = I -1
                      End If
                   End If
              Next I
          End If


      Le msgbox de confirmation va être redondant lorsqu'il n'y a pas d'erreur soit 90% des cas.
      Il y a même le risque que les employés s'habitue de cliquer deux fois rapidement pour passer les messages d'avertissement, et ce trop vite, ce qui ne corrige pas le problème
      0
    2. PlacageGranby Messages postés 402 Statut Membre 26 > PlacageGranby Messages postés 402 Statut Membre
       
      Pour mettre mon autre exemple plus explicite pour l'utilisateur
      If MsgBox("Voulez-vous vérifier la TVA sur les débits?", vbYesNo, "Vérif RAN TVA débits") = vbYes Then
              For I = 13 To DL
                  If Sheets(1).Range("D" & I) = "RAN" Then
                      Sheets(1).Range("B" & I).Select
                      retval = MsgBox("La facture suivante (tiers : " & Range("B" & I) & " ) est-elle soummise à TVA sur les débits?", vbYesNoCancel, "Vérif TVA débits")
                      If retval = vbYes Then
                          Sheets(1).Range("N" & I) = Sheets(1).Range("K" & I)
                      ElseIf retval = vbCancel Then
                          if Msgbox("Faite ok pour revenir à la facture : (tiers : " & Range("B" & I-1) & " )  ou cancel pour annuler", Vbokcancel, "Confirmer le choix") = VBok then
                               I = i -2
                           Else
                                  Exit For
                           End If
                      End If
                  End If
              Next I
          End If
      0
    3. Kuartz Messages postés 852 Date d'inscription   Statut Membre Dernière intervention   65 > PlacageGranby Messages postés 402 Statut Membre
       
      Ok, merci des explications.

      La seule chose c'est que si je répond "OK" à la fin pour revenir à la facture précédente, je n'y reviens pas. Je reste sur la même ligne.

      Un autre problème est que le tiers en question n'est pas toujours sur "i-1", tout dépend de si "RAN" est en cellule D.
      0
    4. PlacageGranby Messages postés 402 Statut Membre 26
       
      Re-Re-Bonjour,

      En effet, je n'avais pas pensé à la condition RAN en colonne D.
      Pour que ca marche, il faudrait créé des variables pour se souvenir de la valeur précédente de i.

      Dim Rollback as integer
      
      If MsgBox("Voulez-vous vérifier la TVA sur les débits?", vbYesNo, "Vérif RAN TVA débits") = vbYes Then
              For I = 13 To DL
                  If Sheets(1).Range("D" & I) = "RAN" Then
                      Sheets(1).Range("B" & I).Select
                      retval = MsgBox("La facture suivante (tiers : " & Range("B" & I) & " ) est-elle soummise à TVA sur les débits?", vbYesNoCancel, "Vérif TVA débits")
                      If retval = vbYes Then
                          Sheets(1).Range("N" & I) = Sheets(1).Range("K" & I)
                          Rollback = i
                      Elseif retval = vbNo then Rollback = i
                      ElseIf retval = vbCancel Then
                          if Msgbox("Faite ok pour revenir à la facture : (tiers : " & Range("B" & Rollback) & " )  ou cancel pour annuler", Vbokcancel, "Confirmer le choix") = VBok then
                               I = Rollback -1
                           Else
                                  Exit For
                           End If
                      End If
                  End If
              Next I
          End If


      Quelque chose du genre devrait être fonctionnel.
      J'ai aussi ajouter un elseif au cas ou on choisi "Non" pour la TVA, pour que l'on puisse aussi corriger ce "Non" au besoin
      0
    5. Kuartz Messages postés 852 Date d'inscription   Statut Membre Dernière intervention   65 > PlacageGranby Messages postés 402 Statut Membre
       
      Absolument parfait ! Merci beaucoup ! Dernière petite question, si je voulais vraiment un 4eme bouton, quelle serait la marche à suivre?

      Merci vraiment pour avoir résolu mon problème en tout cas.
      0