Problème de boucle qui ne s'arrete pas

kesechris

XLDnaute Nouveau
Bonjour,

Je viens de créer un fichier excel pour répertorier les amis (une sorte de carnet d'adresse). Il y a un bouton (activex) sur la première page qui ouvre un UserForm pour remplir les différentes données.

3 possibilités se présentent :

1- l'ami n'existe pas et tout marche pour le mieux. Les lignes sont remplis automatiquement et se décalent, se trient par nom puis par prénom.

2- l'ami est déjà présent et une messagebox apparait en le signalant. Quand on clique sur "Annuler", la ligne précédemment inscrite s'efface et on retrouve le fichier prêt à être utiliser. Tout est ok.

3- l'ami existe, la messagebox apparait et quand on clique sur "Recommencer", la UserForm ré-apparait et l'on peut modifier le nom et le prénom.

Le problème est que lorsque l'on modifie le nom et le prénom, toutes les modifications se font, une nouvelle ligne apparait, le tri s'effectue MAIS au lieu de s'arrêter, comme lorsque l'on annule la modification, le code repart au début de la ligne de comparaison et recommence sa routine et donc me rannonce qu'il y a déjà le même ami alors que l'on a changer de page.

En gros, je n'arrive pas à stopper cette routine de comparaison une fois lancée (après la modification). J'espère être clair et je vous fournis le fichier pour être plus clair.

Je vous remercie d'avance pour l'aide que vous pourrez me fournir.
 

Pièces jointes

  • test.xlsm
    33.2 KB · Affichages: 39
  • test.xlsm
    33.2 KB · Affichages: 44
  • test.xlsm
    33.2 KB · Affichages: 44

Papou-net

XLDnaute Barbatruc
Re : Problème de boucle qui ne s'arrete pas

Bonjour kesechris, et bienvenue à toi,

Peut-être qu'en modifiant ton code ainsi :

Code:
Private Sub CommandButton1_Click()
'validation et copie dans liste client
...
...
...
...
        If Rep = vbRetry Then
        UserForm1.Show
        Range("A3") = TextBox1.Value
        Range("B3") = TextBox2.Value
    
        
        Else
        Unload UserForm1
        Rows("3:3").Select
        Selection.Delete Shift:=xlUp
        Exit Sub ' Ligne ajoutée pour mettre fin à la macro
        End If
End If
Next

'insertion ligne
...
...
...
Sheets("menu").Activate
End Sub

Espérant avoir résolu.

Cordialement.
 

kesechris

XLDnaute Nouveau
Re : Problème de boucle qui ne s'arrete pas

Merci de ta réponse.

Mais malheureusement, cela n'a pas résolu le problème. Quand on lance le mode pas à pas, on s'apercoit uniquement dans le cas de modification des données après avoir eu la messagebox signalant le doublon, que lorsque l'on arrive à End Sub, qui devrait arreter la routine, elle repart au niveau de la comparaison et recommence.

Je n'arrive pas à lui dire stop quand cela arrive à End Sub...
 

Papou-net

XLDnaute Barbatruc
Re : Problème de boucle qui ne s'arrete pas

Re kesechris,

C'est normal que le programme continue puisque tu restes dans la boucle de lecture des cellules G4:G22.

Il faut trouver une autre méthode, pour gérer la vérification des doublons. Je n'ai pas trop le temps d'y regarder maintenant, mais si personne ne te propose une solution qui fonctionne, j'étudierai alors la question.

Cordialement.
 

kesechris

XLDnaute Nouveau
Re : Problème de boucle qui ne s'arrete pas

La boucle de lecture marche 2 fois au lieu d'une fois et le problème n'apparait uniquement que lorsqu'il y a un doublon.
Sinon il faut que je trouve une routine pour comparer une cellule à une colonne. Mais j'ai beau chercher sur les forums, je ne trouve pas.
 

Papou-net

XLDnaute Barbatruc
Re : Problème de boucle qui ne s'arrete pas

Re lesechris,

Voici une copie de ton fichier avec modification du code qui, je l'espère, devrait te convenir.

Cordialement.
 

Pièces jointes

  • Copie de test.xlsm
    26.6 KB · Affichages: 51
  • Copie de test.xlsm
    26.6 KB · Affichages: 53
  • Copie de test.xlsm
    26.6 KB · Affichages: 51

kesechris

XLDnaute Nouveau
Re : Problème de boucle qui ne s'arrete pas

Bonjour,
Désolé de ne pas avoir répondu plus tôt. Je viens de tester et ça marche nickel. Un grand merci à vous. Je n'aurais jamais penser à ça.

Merci bien et bon continuation.

Cordialement.
 

Papou-net

XLDnaute Barbatruc
Re : Problème de boucle qui ne s'arrete pas

Bonjour kesechris,

Heureux d'avoir résolu ton problème.

Et puisque ça fonctionne comme tu le veux, et que je suis adepte du moindre effort sur le clavier, je te propose ce code révisé à la simplicité. Il y gagne en structuration et en clarté :

Code:
Private Sub CommandButton1_Click()
'validation et copie dans liste client
Sheets("liste").Select
For n = 1 To 6
    Cells(3, n) = Me.Controls("TextBox" & n)
Next

'recopie concatener
Range("G4").Copy Destination:=Range("G3")
    
'comparaison
For n = 4 To Range("G" & Rows.Count).End(xlUp).Row
    If Cells(n, 7) = Cells(3, 7) Then
        Rep = MsgBox("Amis déjà existant, Voulez-vous modifier les données?", vbRetryCancel + vbQuestion, "AVERTISSEMENT")
        If Rep = vbRetry Then
            TextBox1.SetFocus
            Else
            Range("A3:F3").ClearContents
            For x = 1 To 6
                Me.Controls("TextBox" & x) = ""
            Next
            Me.Hide
        End If
        Sheets("menu").Activate
        Exit Sub
    End If
Next
    
'insertion ligne
Rows("3:3").Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove

'tri par nom
With ActiveWorkbook.Worksheets("liste").Sort
    .SortFields.Clear
    .SortFields.Add Key:=Range("A4"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    .SortFields.Add Key:=Range("B4"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    .SetRange Range("A4:F22")
    .Header = xlGuess
    .MatchCase = False
    .Orientation = xlTopToBottom
    .SortMethod = xlPinYin
    .Apply
End With
Unload UserForm1
Sheets("menu").Activate
End Sub
Il y a sûrement moyen de faire encore plus simple, mais j'ai voulu conserver ta philosophie de départ.

Bonne journée.

Cordialement.
 

kesechris

XLDnaute Nouveau
Re : Problème de boucle qui ne s'arrete pas

je dois être idiot mais je ne comprends pas comment modifier ce code car j'ai voulu ajouter des colonnes devant. J'ai beau changer la lettre G en H, ça ne marche pas. J'ai incrémenté les valeurs et pas de résultats. Peux-tu m'expliquer vite fait à quoi correspond n et le 7 dans les parenthèses de cells ?

For n = 4 To Range("G" & Rows.Count).End(xlUp).Row
If Cells(n, 7) = Cells(3, 7) Then

Merci d'avance.
 

Papou-net

XLDnaute Barbatruc
Re : Problème de boucle qui ne s'arrete pas

RE kesechris,

La boucle balaye les lignes de la colonne G, de la quatrième à la dernière ligne qui comporte une valeur dans cette colonne. Elle compare chaque cellule lue à la cellule G3 : si une correspondance est trouvée, le msgbox d'erreur s'affiche et attend une réponse, sinon la macro enregistre le nouvel ami et procède au tri de la liste.

L'adressage par la méthode "Cells(x,y)" désigne la cellule par son numéro de ligne (x) et son numéro de colonne (y). Le n correspond donc à la ligne en cours de lecture par la boucle, et le 7 au numéro de la colonne G.

Pour faciliter ta compréhension, et pour une modification plus aisée dans le futur, tu peux réécrire la boucle de cette façon :

Code:
...
...
'comparaison
For n = 4 To Range("G" & Rows.Count).End(xlUp).Row
    If Range("G" & n) = Range("G3") Then
        Rep = MsgBox("Amis déjà existant, Voulez-vous modifier les données?", vbRetryCancel + vbQuestion, "AVERTISSEMENT")
        If Rep = vbRetry Then
            TextBox1.SetFocus
            Else
            Range("A3:F3").ClearContents
            For x = 1 To 6
                Me.Controls("TextBox" & x) = ""
            Next
            Me.Hide
        End If
        Sheets("menu").Activate
        Exit Sub
    End If
Next
...
...

Ca fonctionne tout aussi bien.

Espérant avoir répondu.

Cordialement.

PS : non, tu n'es pas idiot, tu cherches à comprendre. C'est tout à ton honneur, et je t'en félicite.
 

Discussions similaires

Statistiques des forums

Discussions
312 416
Messages
2 088 245
Membres
103 783
dernier inscrit
manax