Un CommandButton pour Boucler [Résolu]

Signaler
Messages postés
18
Date d'inscription
samedi 3 mars 2007
Statut
Membre
Dernière intervention
18 août 2007
-
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
-
Bonjour,

Que faut-il ajouter à ce Code pour permettre au bouton "Suivant" d'effectuer une boucle  sur For.

Merci d'avance.
 Private Sub Button_Suivant_Click()
    
    Dim x As Long
    Dim Found As Boolean
    Dim Reponse As Integer
    
    Button_Rechercher.Visible = False
    Button_Suivant.Visible = True
   
   
    Found = False
   


    For x = 4 To Range("A65535").End(xlUp).Row
        If UCase(Range("A" & x)) Like "*" & UCase(UserForm2.TextBox_Nom_Frn.Value) & "*" Then
            Found = True
            Remplir ActiveSheet, x
            MsgBox "Poursuivre la recherche ?", vbYesNo
            If vbYes Then
            'J'ai un Pb de syntaxe sur le MsgBox :-(
            'Avec MsgBox ça permet provisoirement une boucle sur l'Occurence mais sans la sortie :-(
            'Finalement je préfére obter pour une boucle "Occurence" avec le bouton Suivant ainsi je gagne
            'en visibilté sur les infos Userform , mais là encore j'ai pas la syntaxe du Code
                   
        End If
            End If
    Next x
      
    If Not Found Then
   
Reponse:          MsgBox ("Requête non trouvée !"), vbRetryCancel + vbExclamation
        If Reponse = Retry Then
            Vider
            TextBox_Nom_Frn.SetFocus
        End If
    End If
End Sub

15 réponses

Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
18
Il faudrait que tu crées une variable en dehors de ta procédure, en entête de code de feuille ou dans un module, qui garde en mémoire la ligne sur laquelle tu es situé.

Quand tu cliques sur ton premier bouton de recherche "Commencer", tu affectes 1 à ta variable, tu appelles ta procédure de recherche en lui passant cette variable, du genre
PremièreLigne = 1
MaProcDeRecherche PremièreLigne

Et tu crées ta procédure comme suit en y mettant tout ton code
Sub MaProcDeRecherche(Ligne as long)
......................

Et dans cette procédure, tu démarres ta boucle de Ligne à NombreDeLignes
For x = Ligne To Range("A65535").End(xlUp).Row

Sur click du bouton "Suivant", tu appelles donc la même procédure qui démarrera à la ligne selon la valeur où est rendue cette variable.

Je sentais que mes explications s'embrouillaient... Voici donc le principe que j'expliquais, mais en concret

**********************************************
Option Explicit

Dim Ligne As Long, Limite As Long

Private Sub Button_Rechercher_Click()
    Ligne = 1  'début de recherche à la ligne 1
    Limite = Cells(Rows.Count, "A").End(xlUp).Row
   
    Recherche Ligne
End Sub

Private Sub Button_Suivant_Click()
    Recherche Ligne
End Sub

Sub Recherche(Début As Long)  ' au cas où, Début = Ligne ici
    Dim X As Long
   
    For X = Début To Limite
        If Range("A" & X) = 2 Then  ' 2, c'est pour mon test, mets ta condition
            MsgBox "La valeur a été trouvée à la ligne " & X
            Ligne = X + 1  ' +1 pour ne pas relire la même ligne
            Exit For           ' On sort de la boucle ou la Sub pour utilisation de "Suivant"
        End If
    Next
       
End Sub

Tu remplaces donc le MsgBox en bleu par ton code de vérification
Et la condition par la tienne

MPi
Messages postés
18
Date d'inscription
samedi 3 mars 2007
Statut
Membre
Dernière intervention
18 août 2007

MPI

Ok C'est Bon J'ai Trouvé !

Encore Merci

Alonso
Messages postés
18
Date d'inscription
samedi 3 mars 2007
Statut
Membre
Dernière intervention
18 août 2007

For X
|
|
|
|->Next

If x = Limite + 1 Then
MsgBox "Recherche Terminé", vbOKOnly
Button_Rechercher.Visible = True
Button_Suivant.Visible = False
Exit Sub


Je boucle toutes les occurences avec Suivant et revient à Rechercher

Impec

Alonso
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
18
En principe, ici tu ne devrais jamais y arriver... Limite étant la limite
If x = Limite + 1 Then ...
Change plutôt pour
If x > = Limite Then  ' un simple = devrait aussi suffire

Pour ta dernière condition, il y a un petit hic.
Ça te prendrait une variable qui compte le nombre d'occurrences trouvées.
C'est-à-dire que chaque fois que tu arriveras en fin de boucle, tu risques de recevoir le message "Requête non trouvée !" puisque Found = False
Founf est réinitialisée à False à chaque fois que tu entres dans cette procédure puisqu'elle est déclarée à l'intérieur de celle-ci.
Donc, une variable qui s'incrémente de 1 à chaque fois que la valeur est trouvée et ta dernière condition serait du genre
If nbItems = 0 then
    Reponse = MsgBox("Requête non trouvée !", vbRetryCancel + vbExclamation)
    .....
Ne pas oublier de réinitialiser cette variable lorsque tu redémarres une nouvelle recherche

MPi
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
18
Voici à peu près le même code avec légères modifications.
Je ne me suis pas servi de UserForm; seulement les lignes de données que tu as inscrites.
Fais des tests en changenat le mot "citron" pour autre chose.

Option Explicit

Dim Ligne As Long, Limite As Long

Sub Button_Rechercher_Click()
    Ligne = 4  'début de recherche à la ligne 1
    Limite = Cells(Rows.Count, "A").End(xlUp).Row
  
    Recherche Ligne
   
    If Ligne = 4 Then MsgBox "Aucune valeur n'a été trouvée"

End Sub

Sub Button_Suivant_Click()
    If Ligne > Limite Then  ' si on dépasse la limite, la recherche est terminée
        MsgBox "Recherche terminée"
        Exit Sub  'ne pas continuer
    End If
   
    Recherche Ligne
   
    If Ligne = 4 Then MsgBox "Aucune valeur n'a été trouvée"
   
End Sub

Sub Recherche(Début As Long)
    Dim X As Long
  
    For X = Début To Limite
        If InStr(1, LCase(Range("A" & X)), "tarte") Then 'remplace par ta condition
            MsgBox "La valeur a été trouvée à la ligne " & X
            'Remplir ActiveSheet, X ' je rempli mon tableau
            Ligne = X + 1  ' +1 pour ne pas relire la même ligne
            Exit Sub           ' On sort de la boucle ou la Sub pour utilisation de "Suivant"
        End If
    Next
   
    If X > Limite Then MsgBox "Recherche terminée"
   
End Sub

MPi
Messages postés
918
Date d'inscription
vendredi 3 août 2007
Statut
Membre
Dernière intervention
27 octobre 2008
10
Qu'entends-tu par "... permettre au bouton "Suivant" d'effectuer une boucle sur For"
Messages postés
18
Date d'inscription
samedi 3 mars 2007
Statut
Membre
Dernière intervention
18 août 2007

Bonjour,

Merci MPI

Je suis débutant ( à voir mon code ca doit se voir  ;-)

J'ai suivi tes conseils est voilà ce que sa donne ; Sa fonctionne Impec mais je souhaite ajouter une condition (Voir Code)

Alonso

Code :


<hr />

Option ExplicitDim ligne As Long, Limite As Long

<hr />
Private Sub Button_Rechercher_Click()
    ligne = 4  'début de recherche à partir de  la ligne 4 
    Limite = Cells(Rows.Count, "A").End(xlUp).Row
    Recherche ligne
End Sub
<hr />
Private Sub Button_Suivant_Click()
    Recherche ligne
End Sub
   
<hr />
Sub Recherche(Début As Long) 'Début = Ligne
 
    Dim x As Long
    Dim Found As Boolean
    Dim Reponse As Integer
     
    Button_Rechercher.Visible = False
    Button_Suivant.Visible = True
     
    Found = False
   
    If UserForm2.TextBox_Nom_Frn = "" Then ' Condition de saisie valeur en TextBox
        MsgBox "Vous devez saisir une Recherche", vbCritical
    Exit Sub
    End If
   
    For x = Début To Limite
   
    If UCase(Range("A" & x)) Like "*" & UCase(UserForm2.TextBox_Nom_Frn.Value) & "*" Then ' Recherche de "x"  d'après
    la  valeur "x" du TextBox
        
    Found = True
        Remplir ActiveSheet, x ' Ici je remplie un ensemble de TextBox dan mon UserForm selon la Valeur trouvé de "x"
        ligne = x + 1  ' +1 pour ne pas relire la même ligne
    Exit For ' On sort de la boucle ou la Sub pour utilisation de "Suivant"
    End If
        Next
       
     Question ici je voudrai ajouter une condition après la première Boucle arrivée à " x +1" MsgBox 
    'MsgBox "Recherche Terminé", vbOKOnly
   
    + Button True/False afin de saisir une autre demande en affichant de nouveau 'Rechercher'
    'Button_Rechercher.Visible = True
    'Button_Suivant.Visible = False    Exit Sub
   
    If Not Found Then
  
Reponse:          MsgBox ("Requête non trouvée !"), vbRetryCancel + vbExclamation
        If Reponse = vbRetry Then
            Vider
            TextBox_Nom_Frn.SetFocus
        End If
    End If
   
End Sub

<hr />
Fin de Code
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
18
Premièrement, je pense que tu devrais jouer avec le textbox.visible = True/False après avoir vérifier si le textbox est rempli. Cette condition devrait être au tout début de la procédure, je pense.

Pour ton message, tu devrais écrire
Reponse =  MsgBox ("Requête .....

Pour ta condition, je ne suis pas certain de ce que tu cherches à faire, mais tu pourrais vérifier si Found = True et ajouter ta condition

If Found Then
    ta condition
    exit sub
Else
    Reponse =  MsgBox ("Requête .....  ' mettre " = " et non pas " : "
    If Reponse = vbRetry ....
        ........
    End If
End If

MPi
Messages postés
18
Date d'inscription
samedi 3 mars 2007
Statut
Membre
Dernière intervention
18 août 2007

RE : MPI

Je m'embrouille aussi à force d'imbriquer  les codes avec mes conditions ; En fait :


<hr />
   For x = Début To Limite

If UCase(Range("A" & x)) Like "*" & UCase(UserForm2.TextBox_Nom_Frn.Value) & "*" Then    
   
Found = True
   Remplir ActiveSheet, x       Cette partie est Bonne pour moi j'appel un Sub Remplir

    ligne = x + 1 

 
Exit For 





End If
        Next
<hr />
C'est ensuite
 voir Code au Début
Rechercher=False en début , Libère Suivant=True pour avancer en x+1 ; ça c'est Ok

Mais après la Boucle ' For ', comment puis-je annonçer, une fois que toutes les valeurs "x" ont été appeler, un retour à Rechercher
et obtenir ainsi un Suivant=False et Rechercher=True pour le CommandButton ?

Alonso
Messages postés
18
Date d'inscription
samedi 3 mars 2007
Statut
Membre
Dernière intervention
18 août 2007

Bonjour,

Un petit Bug tout de même.

Avec la Condition 'x=Limite+1' avec 'Exit Sub' je zap la condition 'Not Found'

Etape 1
Il faut quand fin d'Occurence 'ligne x+1' j'obtienne le message 'Recherche terminé' et récupére mon Bouton 'Rechercher'

Etape 2
Quand je tape une valeur qui n'existe pas que la condition Not 'Found' soit déclenchée, mais sans le message "Recherche terminé !"


Je voudrais conserver les 2 conditons, mais sans avoir en fin de boucle (voir code complet) un double message quand je supprime 'Exit Sub'.

Que faut-il écrire ?? Merci d'avance

Alonso

Code :

Sub Recherche(Début As Long) 'Début = Ligne

Dim x As Long
Dim Found As Boolean
Dim Reponse As Integer

Button_Rechercher.Visible = False
Button_Suivant.Visible = True

Found = False

For x = Début To Limite

If UCase(Range("A" & x)) Like "*" & UCase(UserForm2.TextBox_Nom_Frn.Value) & "*" Then

Found = True
Remplir ActiveSheet, x
Ligne = x + 1 'pour ne pas relire la même ligne
Exit For ' On sort de la boucle ou la Sub pour utilisation de "Suivant"
End If
Next

If x = Limite + 1 Then
MsgBox "Recherche Terminé", vbOKOnly
Button_Rechercher.Visible = True
Button_Suivant.Visible = False
Exit Sub

End If

If Not Found Then

Reponse = MsgBox("Requête non trouvée !", vbRetryCancel + vbExclamation)
If Reponse = vbRetry Then
Vider
TextBox_Nom_Frn.SetFocus
End If
End If
End Sub
/code
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
18
1-
Tout juste avant ta boucle For X = Début to Limite
vérifies si X >= Limite
Si oui, tu es rendu au bout de la recherche
Et tu remets les états des boutons comme tu le souhaites, avec ou sans message et tu sors de la Sub (Exit Sub).

2-
Après le Next de ta boucle For X = Début to Limite
Vérifie si Found = True
If Found Then
    'trouvé
Else
    'Non trouvé
End If

PS: essaie de bien indenter ton code pour une meilleure lecture.
C'est important lorsqu'il y a plusieurs boucles et conditions.
Personnellement, j'ai pris l'habitude d'écrire de la façon qui suit, avant même d'entrer le code d'une boucle ou d'une condition:

For X = Y to Z   'ENTER
Next                  'Flèche haut, END, ENTER, TAB
et je suis prêt à entrer le code indenté
Si j'y mets une condition, j'agis de la même façon
    If MaCondition Then   'ENTER
    Else                           'Si nécessaire
    End If                        'Flèche haut(x fois), END, ENTER, TAB

Ça peut sembler un peu compliqué au début, mais ça devient vite un automatisme.

MPi
Messages postés
18
Date d'inscription
samedi 3 mars 2007
Statut
Membre
Dernière intervention
18 août 2007

Bonjour MPI,

Là j'y comprends plus rien ...

Alonso
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
18
C'est-à-dire ?

MPi
Messages postés
18
Date d'inscription
samedi 3 mars 2007
Statut
Membre
Dernière intervention
18 août 2007

Ca me paraissait à peu près simple comme routine, mais là je bloque dessus depuis un moment ...

En reprenant pas à pas je ne vois pas comment regrouper les 3 conditions :

Code :
Sub Recherche(Début As Long)  'Début = Ligne
 
    Dim x As Long
    Dim Found As Boolean
    Dim Reponse As Integer
     
    Button_Rechercher.Visible = False
    Button_Suivant.Visible = True
     
    Found = False
          
    For x = Début To Limite ' Début & Limite par rapport au Sub Button Rechercher 
    
    If UCase(Range("A" & x)) Like "*" & UCase(UserForm2.TextBox_Nom_Frn.Value) & "*" Then
    ' Ici je comprends que je dois saisir et rechercher tous caractères minuscules et majuscules dans mon TextBox si cette condition est vraie alors
    Found = True 'je confirme que c'est vrai
        Remplir ActiveSheet, x ' je rempli mon tableau
        Ligne = x + 1  'pour ne pas relire la même ligne
    Exit For ' On sort de la boucle ou la Sub pour utilisation de "Suivant"
    End If
        Next 'Prochaine Boucle
    
    If x = Limite + 1 Then ' Ici pour ma condition si je suis à Limite en sortie de boucle
        MsgBox "Recherche Terminé", vbOKOnly 'Je suis averti et demande l'actualisation de mes boutons.
    Button_Rechercher.Visible = True
    Button_Suivant.Visible = False
    Exit Sub


    End If
   
    If Not Found Then  'C'est ici que je bloque j'ai placé cette condition au cas ou la valeur de "x" saisie dans le TextBox n'existe pas dans ma colonne Range (Not Found en contradiction du Found= True) ; mais visiblement ça ne fonctionne pas...
Car elle est ignorée si je conserve le (normal on sort) et s'affiche en plus de la condition MsgBx Limite quand je supprime le Exit Sub . (normal on sort pas encore)

Je pourrais supprimer ce dernier car j'ai une routine convenable...

Mais je souhaite quand même avoir ce Msgbx Comme 3ème conditions enfin si il y a une solution.
  
Reponse = MsgBox("Requête non trouvée !", vbRetryCancel + vbExclamation)
        If Reponse = vbRetry Then
            Vider
            TextBox_Nom_Frn.SetFocus
        End If
    End If
End Sub
/Code
Messages postés
18
Date d'inscription
samedi 3 mars 2007
Statut
Membre
Dernière intervention
18 août 2007

C'est quand même étrange car les lignes sont déjà comptées
<hr />
Private Sub Button_Rechercher_Click()

Ligne =  4  'début de recherche à la ligne 4
   
 Limite = Cells(Rows.Count, "A").End(xlUp).Row
    Recherche Ligne

End Sub


<hr />
En plus si je retire le +1 dans la deuxième conditions je passe bien directement la dernière si la valeur demandé n'existe pas ???
<hr />
Dernière Condition :

If Not Found Then
Reponse  = MsgBox("Requête non trouvée !", vbRetryCancel + vbExclamation)
....


<hr />
Mais je suis obligé d'ajouter ce +1en 2ème Condit. sinon j'ai un "Bug" sur le comptage ???
<hr />
Deuxième Condition :

I
f x =   Limite   +1  Then
        MsgBox "Recherche Terminé", vbOKOnly
....


<hr />Bizarre ... Bizarre ...

Explication : Sur les lignes du tableau de travail actuelen Supprimant le +1 dans la 2ème condition
<colgroup> ----

TarteChampi, ----
Citron Pressé, ----
TarteCitron, ----
Tarte au Pomme, ----
Citron Confit, ----
citron

Le début du comptage se fait ligne 4 ; Lorsque je demande de rechercher ex: Citron je vais bien obtenir toutes les occurrences et à la fin, le message de la 2ème condition soit "Recherche Terminé". Ok

Si je demande une valeur qui n'existe pas ; Là je passe à la dernière condition soit "Requête non trouvée". Ok

Là ou c'est bizarre, c'est que si demande de rechercher une valeur autre que citron ex : Champiou même Tarte en fin d'occurences je ne tombe pas sur la 2ème condition "Rechercher Terminé" mais sur la dernière conditions "Requête non trouvée"??? Not Ok

J'ai essayé de modifier la ligne de début de comptage soit à ligne 3 voir même à la ligne 1; Mais ça ne change rien ...

Je suis donc obligé d'ajouter  If  x = Limite +1 pour que toutes demandes d'occurences aboutissent correctement en fin de recherche soit sur le Msgbx "Recherche Terminé" en 2ème conditions. Malheureusement ça me Zappe la dernière condition ...

Un vrai casse tête ...