Revenir en arrière dans une boucle avec MsgBox

Résolu/Fermé
Kuartz Messages postés 850 Date d'inscription vendredi 13 février 2015 Statut Membre Dernière intervention 15 février 2019 - 13 juil. 2015 à 14:47
Kuartz Messages postés 850 Date d'inscription vendredi 13 février 2015 Statut Membre Dernière intervention 15 février 2019 - 15 juil. 2015 à 08:50
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.
A voir également:

2 réponses

PlacageGranby Messages postés 393 Date d'inscription mercredi 26 mars 2014 Statut Membre Dernière intervention 7 mars 2019 26
13 juil. 2015 à 15:08
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
Kuartz Messages postés 850 Date d'inscription vendredi 13 février 2015 Statut Membre Dernière intervention 15 février 2019 61
13 juil. 2015 à 15:37
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
PlacageGranby Messages postés 393 Date d'inscription mercredi 26 mars 2014 Statut Membre Dernière intervention 7 mars 2019 26
13 juil. 2015 à 16:43
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
PlacageGranby Messages postés 393 Date d'inscription mercredi 26 mars 2014 Statut Membre Dernière intervention 7 mars 2019 26 > PlacageGranby Messages postés 393 Date d'inscription mercredi 26 mars 2014 Statut Membre Dernière intervention 7 mars 2019
13 juil. 2015 à 16:47
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
Kuartz Messages postés 850 Date d'inscription vendredi 13 février 2015 Statut Membre Dernière intervention 15 février 2019 61 > PlacageGranby Messages postés 393 Date d'inscription mercredi 26 mars 2014 Statut Membre Dernière intervention 7 mars 2019
13 juil. 2015 à 17:01
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
PlacageGranby Messages postés 393 Date d'inscription mercredi 26 mars 2014 Statut Membre Dernière intervention 7 mars 2019 26
Modifié par PlacageGranby le 13/07/2015 à 17:42
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
Kuartz Messages postés 850 Date d'inscription vendredi 13 février 2015 Statut Membre Dernière intervention 15 février 2019 61 > PlacageGranby Messages postés 393 Date d'inscription mercredi 26 mars 2014 Statut Membre Dernière intervention 7 mars 2019
13 juil. 2015 à 18:00
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