Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Excel > Macros et VBA Excel
Macros et VBA Excel Vos questions relatives aux macros Excel, à l'utilisation de VBA et à l'automatisation de vos classeurs Excel.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 21/10/2011, 12h18   #1
Invité de passage
 
Inscription : octobre 2011
Messages : 5
Détails du profil
Informations forums :
Inscription : octobre 2011
Messages : 5
Points : 0
Points : 0
Par défaut Recherche d'une donnée en Boucle

Bonjour,

Je viens chercher de la compétence sur ce forum parce que ma petite mémoire ne répond plus. Cela fait très,très longtemps que je n'ai pas fait de macro ....
Hier, je me suis lancé dessus pour réaliser une recherche de nom sur une base Excel après sur un CommandButton_Click. Malheureusement, je n'arrive pas à faire ma boucle.
Le but est de controler la présence d'un même nom dans une cellule sur la même feuille et de l'afficher dans des TextBox avec d'autres informations.
La fonction marche une fois .... il me manque la boucle.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
Private Sub CommandButton2_Click()
  nomtrouve = Cells.Find(what:=strChaine)
  valeursuivant = ActiveCell.Row
  nomrecherche = Cells(valeursuivant, 2)
  nomsuivant = Cells(valeursuivant + 1, 2)
 
      If nomrecherche = nomsuivant Then
        i = valeursuivant + 1
        TextBox2 = nomrecherche
        TextBox3 = Cells(i, 3)
        TextBox4 = Cells(i, 4)
        TextBox5 = Cells(i, 5)
      Else
        MsgBox "Plus de nom correspondant"
      End If
 End Sub

Est-ce quelqu'un aurait un peu de temps pour regarder mon bout de code et ainsi me rafraîchir la mémoire ?
Merci.
RetourVBA est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/10/2011, 15h48   #2
Membre expérimenté
 
Homme
Enseignant
Inscription : novembre 2009
Messages : 350
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Algérie

Informations professionnelles :
Activité : Enseignant

Informations forums :
Inscription : novembre 2009
Messages : 350
Points : 500
Points : 500
Bonjour à tous,

Essayes avec le code suivant:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
Private Sub CommandButton2_Click()
  nomtrouve = Cells.Find(what:=strChaine)
  nomrecherche = Cells(ActiveCell.Row, 1)
   For i = ActiveCell.Row To 50
       nomsuivant = Cells(i+1, 1)
     If nomrecherche <> nomsuivant Then GoTo 1
       TextBox2 = nomrecherche
       TextBox3 = Cells(i, 3)
       TextBox4 = Cells(i, 4)
       TextBox5 = Cells(i, 5)
1  Next i
     MsgBox "Plus de nom correspondant"
End Sub
La valeur 50 dans le code peut être changée par la valeur de la dernière ligne non vide...
Cordialement
hben1961 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/10/2011, 16h22   #3
Invité de passage
 
Inscription : octobre 2011
Messages : 5
Détails du profil
Informations forums :
Inscription : octobre 2011
Messages : 5
Points : 0
Points : 0
Merci hben1961 pour l'aide ...
Mon problème perdure .... Je me suis peut être mal exprimé.
J'essaye mon explication
J'ai une table avec x noms dans une feuille Excel. J'ai une maco qui recherche le nom souhaité et je voudrais faire un bouton qui permet de chercher les noms x identiques sur la même feuille pour afficher les valeurs des cellules dans les TextBox.
Donc faire un suivant-suivant tant que le même nom est identique.
Je ne vous enbrouille pas trop ?
Merci.
RetourVBA est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/10/2011, 17h47   #4
Rédacteur
 
Avatar de Ormonth
 
Homme Didier GONARD
Formateur Développeur Office - indépendant
Inscription : février 2008
Messages : 2 353
Détails du profil
Informations personnelles :
Nom : Homme Didier GONARD
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Formateur Développeur Office - indépendant

Informations forums :
Inscription : février 2008
Messages : 2 353
Points : 4 685
Points : 4 685
Bonjour,

A toutes fin utiles, je te met, brut de fonderie, un code que j'avais fait pour une vieille gestion de DVDthèque (très vieux code donc pas top ) et qui fonctionne dans son environnement d'une façon approchante à ce que tu demandes.

Ce ne devrait pas être trop dur à décrypter, le but était de s'arrêter sur chaque occurrence trouvée, de la sélectionner, de demander à l'utilisateur s'il voulait continuer et de signaler à chaque feuille si rien n'avait été trouvé pour en fin de course signaler que toutes les feuilles avaient été parcourues.

Du coup il suffit de recueillir les adresses au fur et à mesure...Le code est plus compliqué car on parcourait les feuilles voulues en sélectionnant l'item recherché pour une visualisation directe.

Ce qui t’intéressera est la méthode de passage "au suivant" basée sur les méthodes Find et FindNext.

la ligne :

Code :
If Feuill2.Name <> ("Données") And Feuill2.Name <> ("PassNews") Then
est destinée à ne pas tenir comptes de certaines feuilles ( hors de la base de données proprement dite).
Sinon, c'est pas très compliqué et facilement adaptable vu qu'il y a un arrêt à chaque occurrence

Code :
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
 
Sub Recherche()
Dim Feuill2 As Object
Dim NR As String
Dim IJ As Byte
Dim Rep3 As Byte
Dim Prem1 As String
Dim Prem2 As String
 
Call NoProtect
Call AttriNom
IJ = 0   'variable de compteur
NR = InputBox("Mot recherché", "Recherche")
If NR = "" Or Left(NR, 1) = "*" Or Left(NR, 1) = "?" Then MsgBox " Une recherche sans nom est impossible !", vbExclamation: Call Protect: Exit Sub     'mot recherché
 
    For Each Feuill2 In Worksheets
        If Feuill2.Name <> ("Données") And Feuill2.Name <> ("PassNews") Then
            IJ = IJ + 1
            Feuill2.Activate
            Range("A6").CurrentRegion.Offset(1).Select
            Selection.Resize(Selection.Rows.Count - 1).Select
            If Selection.Find(NR) Is Nothing Then
                MsgBox "Inexistant dans cette feuille", 0, "Home DVD application"
                Range("A6").Select
                Worksheets(F1Nom).Activate
                Range("A6").Select
                Else
                Selection.Find(NR, after:=ActiveCell, LookIn:=xlFormulas, LookAt:=xlPart, _
                    SearchOrder:=xlByRows, SearchDirection:=xlNext).Activate
                    Rep3 = MsgBox("Autre recherche ?", vbYesNo + vbQuestion, "Home DVD application")
                    Prem1 = ActiveCell.Address
                        If Rep3 = vbNo Then
                            Range("A6").Select
                            Call Protect
                            Exit Sub
                        End If
                    While Rep3 = vbYes
                        Selection.FindNext(after:=ActiveCell).Activate
                        Prem2 = ActiveCell.Address
                            If Prem2 <> Prem1 Then
                                Rep3 = MsgBox("Autre recherche ?", vbYesNo + vbQuestion, "Home DVD application")
                                If Rep3 = vbNo Then
                                    Range("A6").Select
                                    Call Protect
                                    Exit Sub
                                End If
                            Else
                                    If IJ = Nbf Then
                                    MsgBox "Toutes les feuilles ont été parcourues !", vbInformation, "Home DVD application"
                                    End If
                                Range("A6").Select
                                Rep3 = vbNo
                            End If
                    Wend
            End If
        End If
    Next Feuill2
 Call Protect
End Sub
Protect est une routine de protection avec son inverse sinon....

cordialement,

Didier
__________________
Didier Gonard

Ps :
Pour noter positivement ou négativement un post, vous pouvez cliquer sur les pouces en bas à droite !
Tutoriels : Voir la liste de mes tutoriels et mon site pro sur ma Page DVP
N'oubliez pas de mettre : ..quand c'est le cas !
Ormonth est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 22/10/2011, 09h07   #5
Invité de passage
 
Inscription : octobre 2011
Messages : 5
Détails du profil
Informations forums :
Inscription : octobre 2011
Messages : 5
Points : 0
Points : 0
Merci pour la réponse.
Snifff, j'ai toujours autant de mal ....
RetourVBA est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/10/2011, 10h11   #6
Membre Expert
 
Homme
Retraité
Inscription : avril 2011
Messages : 692
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Retraité

Informations forums :
Inscription : avril 2011
Messages : 692
Points : 1 443
Points : 1 443
Bonjour,

Voici un exemple avec un Userform, 4 TextBox et 1 CommanButton.
Les données sont en colonnes B, C, D et E.
Le nom est cherché en colonne B.
Le tableau comporte une ligne d’en-tête.

Code :
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
Dim Ligne As Long
Private Sub Commandbutton2_Click()
Dim DerLg As Long
Dim strChaine As String
With Worksheets("Feuil1") 'A adapter
    strChaine = "Toto" 'Nom à chercher
    'Recherche de la dernière ligne renseignée dans la colonne B
    DerLg = .Range("B" & .Rows.Count).End(xlUp).Row
    'Recherche du nom
    Set c = .Range(.Cells(Ligne, 2), .Cells(DerLg + 1, 2)).Find(strChaine, LookIn:=xlValues)
    'Si le nom est trouvé
    If Not c Is Nothing Then
        'Copie dans les TextBox
        TextBox2 = Cells(c.Row, 2) 'Nom de recherche
        TextBox3 = Cells(c.Row, 3)
        TextBox4 = Cells(c.Row, 4)
        TextBox5 = Cells(c.Row, 5)
        Ligne = c.Row + 1
    Else
        MsgBox "Plus de nom correspondant"
    End If
End With
End Sub
Private Sub UserForm_Initialize()
    Ligne = 1
End Sub
Cordialement.
gFZT82 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/10/2011, 11h04   #7
Rédacteur
 
Avatar de Ormonth
 
Homme Didier GONARD
Formateur Développeur Office - indépendant
Inscription : février 2008
Messages : 2 353
Détails du profil
Informations personnelles :
Nom : Homme Didier GONARD
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Formateur Développeur Office - indépendant

Informations forums :
Inscription : février 2008
Messages : 2 353
Points : 4 685
Points : 4 685
Bonjour,

@RetourVBA ça demande un minimum d'efforts et d’essais, faire un copié-collé moins, mais ce n'est pas le but premier du forum, les contributeurs font l'effort gracieux de répondre et de détailler, en retour il est logique que l'autre côté fasse de même. Nous ne sommes pas dans une société de services

@gFZT82, sauf erreur...
On n'aura pas tous les résultats ainsi

Sinon :
c n'est pas déclarée contrairement aux autres variables
Tu indiques 4 colonnes, mais ne te fies qu'à la B pour DerLg

---

Lire l'aide VBA à FInd et FindNext en prenant en compte le paramètre de mémorisation signalé.

cordialement,

Didier
__________________
Didier Gonard

Ps :
Pour noter positivement ou négativement un post, vous pouvez cliquer sur les pouces en bas à droite !
Tutoriels : Voir la liste de mes tutoriels et mon site pro sur ma Page DVP
N'oubliez pas de mettre : ..quand c'est le cas !
Ormonth est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/10/2011, 11h22   #8
Membre Expert
 
Homme
Retraité
Inscription : avril 2011
Messages : 692
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Retraité

Informations forums :
Inscription : avril 2011
Messages : 692
Points : 1 443
Points : 1 443
Bonjour Ormonth,

Citation:
@gFZT82, sauf erreur...
On n'aura pas tous les résultats ainsi
En fait, on aura bien tous les résultats .
L’idée, c’est d’utiliser une variable globale (Ligne) qui permet d’enregistrer la dernière ligne scrutée.
A chaque clic, une nouvelle recherche Find est effectuée sur le restant de la liste, à partir de cette ligne enregistrée.

Cordialement.
gFZT82 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/10/2011, 11h57   #9
Rédacteur
 
Avatar de Ormonth
 
Homme Didier GONARD
Formateur Développeur Office - indépendant
Inscription : février 2008
Messages : 2 353
Détails du profil
Informations personnelles :
Nom : Homme Didier GONARD
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Formateur Développeur Office - indépendant

Informations forums :
Inscription : février 2008
Messages : 2 353
Points : 4 685
Points : 4 685
Ok,

Il faut renouveler les clics

FindNext est construit natif pour ça sinon justement...

cordialement,

Didier
__________________
Didier Gonard

Ps :
Pour noter positivement ou négativement un post, vous pouvez cliquer sur les pouces en bas à droite !
Tutoriels : Voir la liste de mes tutoriels et mon site pro sur ma Page DVP
N'oubliez pas de mettre : ..quand c'est le cas !
Ormonth est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/10/2011, 12h24   #10
Membre Expert
 
Homme
Retraité
Inscription : avril 2011
Messages : 692
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Retraité

Informations forums :
Inscription : avril 2011
Messages : 692
Points : 1 443
Points : 1 443
Effectivement, on aurait pu obtenir un résultat global avec FindNext, mais la demande de RetourVBA était d’obtenir une commande pas à pas.
Ton code lui permettra d’envisager les deux approches .

Cordialement.
gFZT82 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/10/2011, 14h14   #11
Rédacteur
 
Avatar de Ormonth
 
Homme Didier GONARD
Formateur Développeur Office - indépendant
Inscription : février 2008
Messages : 2 353
Détails du profil
Informations personnelles :
Nom : Homme Didier GONARD
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Formateur Développeur Office - indépendant

Informations forums :
Inscription : février 2008
Messages : 2 353
Points : 4 685
Points : 4 685
@ RetourVBA

essaies de mettre en place et reviens si tu bloques sur u point particulier avec ton nouveau code...

cordialement,

Didier
__________________
Didier Gonard

Ps :
Pour noter positivement ou négativement un post, vous pouvez cliquer sur les pouces en bas à droite !
Tutoriels : Voir la liste de mes tutoriels et mon site pro sur ma Page DVP
N'oubliez pas de mettre : ..quand c'est le cas !
Ormonth est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/10/2011, 15h43   #12
Invité de passage
 
Inscription : octobre 2011
Messages : 5
Détails du profil
Informations forums :
Inscription : octobre 2011
Messages : 5
Points : 0
Points : 0
Bonjour,

Merci aux différents contributeurs.
Ormonth, je n'ai pas fait qu'un copie-collé te ton travail. Je n'arrête pas de l'étudier depuis que tu l'as mis grâcieusement à disposition. Je t'en remercie.
Simplement pour avoir d'autres avis et méthodes j'ai signalé ou j'en étais.
Il y a quelques années, je réalisais sans problème des macros et je n'ai jamais attendu que l'on me les ponde. Mais maintenant je l'ai l'impression d'être devenu un débutant voir un zéro. C'est pour cela que je compte sur les compétences de chacun pour me rafraîchir cette idée.
Je vais maintenant étudier ce que me propose gFZT82.
Au moins avec vos deux contributions ma mémoire reviendra un peu.
Encore merci pour votre aide. Et je n'ai pas l'attention de critiquer vos travaux ou vos interventions.
RetourVBA est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/10/2011, 16h12   #13
Expert Confirmé
 
Avatar de patricktoulon
 
patrick
Inscription : avril 2009
Messages : 1 829
Détails du profil
Informations personnelles :
Nom : patrick
Âge : 42
Localisation : France, Var (Provence Alpes Côte d'Azur)

Informations professionnelles :
Secteur : Bâtiment

Informations forums :
Inscription : avril 2009
Messages : 1 829
Points : 2 857
Points : 2 857
Envoyer un message via MSN à patricktoulon
bonjours
je suis d'accord avec ormonth "find next répond a ta demande

maintenant si il doit y avoir une condition du genre suivant

mettre une boucle do loop entre les deux find avec une condition et un msgbox

"oui ou non" pour continuer la recherche


au plaisir

bonjour

Citation:
Envoyé par RetourVBA Voir le message
Le but est de controler la présence d'un même nom dans une cellule sur la même feuille et de l'afficher dans des TextBox avec d'autres informations.
La fonction marche une fois .... il me manque la boucle.
je suppose que tu doit avoir autant de textbox que d'éléments trouvés

ca me semble un peu compliqué

pour quoi ne pas faire une simple boucle sur la plage avec "find et find next"

et inscrire dans un listbox les nom et dans la deuxieme collone de la listbox le numero de ligne pour pouvoir récupérer les données annexes au nom
ainsi en cliquand sur la listbox tu a le nom et le numero de ligne

j'avais mis au point avec grisan29 un formulaire client qui utilise cette methode
regarde ICI!


au plaisir
__________________
mes fichiers dans les contributions:
mon formulaire mail avec CDO en vba et mon formulaire mail avec CDO en vbs dans un HTA
mon nouveau mouse in out pour les boutons dans un userform
mon addin pour prendre un cliché de selection de cellules

si ton problème est résolu n'oublie pas de pointer :résolu:ça peut servir aux autres
et n'oublie pas de voter
patricktoulon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/10/2011, 19h41   #14
Invité de passage
 
Inscription : octobre 2011
Messages : 5
Détails du profil
Informations forums :
Inscription : octobre 2011
Messages : 5
Points : 0
Points : 0
Bonjour,

Merci PatrickToulon pour le lien. Je vais étudier cela.
C'est vrai qu'avant de poster sur le forum j'avais envisagé de changer de fusil d'épaule en utilisant une ListBox. Mais je voulais l'avis d'expert sur ma première idée.
Je vous tiens au courant.
RetourVBA est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 07h37.


 
 
 
 
Partenaires

Hébergement Web