IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

problème avec la méthode find et find next


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Femme Profil pro
    agente administrative
    Inscrit en
    Décembre 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Canada

    Informations professionnelles :
    Activité : agente administrative
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2014
    Messages : 3
    Par défaut problème avec la méthode find et find next
    Bonjour,

    Mon problème est que je suis incapable de comprendre le find et le find next.

    J'ai une petite base de donnée avec des noms et leur adresses, no téléphone etc.
    J'aimerais que lorsque j'appuie sur le bouton "recherche" les infos se place dans mes textBox ou comboBox et si le nom est ok je peux faire les modification du profil du client sinon, je passe au suivant.

    Le code si dessous me donne le nom que je veux, mais j'aimerais être capable de passer au suivant, car souvent il existe des noms qui sont identiques.

    Voici le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Private Sub CommandButton_cherche_Click()
     
    Dim rngTrouve As Range
    Dim lig As Integer
    lig = Columns(2).Cells.Find(TextBox_Nom).Row
    Set rngTrouve = ActiveSheet.Columns(2).Cells.Find(what:=TextBox_Nom)
        If rngTrouve Is Nothing Then
     
        MsgBox "Inexistant"
     
        Else
            Cells.Find(what:=TextBox_Nom).Activate
            TextBox_Nom.Value = Cells(lig, 2)
            TextBox_Prenom.Value = Cells(lig, 3)
            TextBox_conjoint.Value = Cells(lig, 4)
            TextBox_Adresse.Value = Cells(lig, 5)
            TextBox_Ville.Value = Cells(lig, 6)
            TextBox_Province.Value = Cells(lig, 7)
            TextBox_CP.Value = Cells(lig, 8)
            TextBox_Tel1.Value = Cells(lig, 9)
            TextBox_Tel2.Value = Cells(lig, 10)
            TextBox_Adressecourriel.Value = Cells(lig, 11)
            CheckBox_CHEL.Value = Cells(lig, 12)
            CheckBox_CHJAP.Value = Cells(lig, 13)
            CheckBox_CHT.Value = Cells(lig, 14)
            CheckBox_Rdvmed.Value = Cells(lig, 18)
            CheckBox_Myosotis.Value = Cells(lig, 15)
            CheckBox_Finvie.Value = Cells(lig, 17)
            CheckBox_Pastorale.Value = Cells(lig, 16)
            CheckBox_comres.Value = Cells(lig, 19)
     
     
    End If
     
    Set rngTrouve = Nothing
    End Sub
    Merci

  2. #2
    Membre chevronné
    Homme Profil pro
    Ingénieur Industrialisation
    Inscrit en
    Mai 2015
    Messages
    222
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur Industrialisation
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2015
    Messages : 222
    Par défaut
    Bonsoir Sylvie,



    EDIT !!!

    En fait je suis parti un peu loin, j'ai oublié la question même qui était le findnext et qui marche très bien... honte à moi

    En fait le FindNext fonctionne ainsi :
    - Tu as une range en mémoire (tu la trouves avec Find, par exemple)
    - Tu cherches la suivante dans le tableau que tu as désigné
    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Dim rngTrouve as Range ' à placer tout en haut du code de ton formulaire
     
    Sub RechercheNom
    If RngTrouve.text <> TextBox_Nom.text 
        Set rngTrouve = ActiveSheet.Columns(2).Cells.Find(what:=TextBox_Nom)
        If rngTrouve Is Nothing Then MsgBox "Inexistant" : Exit Sub
    else
        Set rngTrouve = ActiveSheet.Columns(2).Cells.FindNext(rngTrouve)
    end if
    End Sub
    Ceci devrait fonctionner... La suite peut aussi te donner d'autres moyens de traiter le problème, mais ça risque de t'embrouiller !
    FIN DE L'EDIT :p

    Je pense à une solution simple : pourquoi ne pas stocker la ligne trouvée puis lors de la prochaine recherche, partir à lig + 1 et non dans toute la colonne "B"...

    Déplace ton
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim lig As Integer
    Private Sub CommandButton_cherche_Click() '...
    tout en haut du code du UserForm et le tour est joué, il faudra juste scanner à partir de cette ligne et plus dans toute la colonne 2...

    Tu pourrais également déclarer un tableau à 2 dimensions (index du résultat de la recherche,Valeur à mémoriser)

    Par Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Dim Résultats() 'on déclare une variable de type array que l'on ne dimensionne pas encore, tout en haut du code du formulaire
    Private Sub CommandButton_cherche_Click()
     
    Dim Cell As Range
    Dim NbRésultats As Integer
    Dim IndexRésultat As Byte
    Dim Recherche As String
     
    Recherche = "*" & TextBox_Nom.Text & "*"
    IndexRésultat = 0 'ira jusqu'à NbRésultats
     
    ChoixRésultat.Clear 'ComboBox à ajouter
     
    NbRésultats = Application.WorksheetFunction.CountIf(Columns(2), Recherche) 'on scanne le nombre de résultats que l'on va trouver
     
    If NbRésultats = 0 Then MsgBox "Aucun résultat", vbInformation: Exit Sub 'si on trouve 0, on l'indique et on quitte la macro
     
    ReDim NbRésultats(1 To NbRésultats, 0 To 17) 'on redimensionne le tableau, le 0 to 17 est pour les offsets vers la droite par rapport à la cellule trouvée
     
    For Each Cell In Columns(2).SpecialCells(xlCellTypeConstants).Cells 'on scanne les cellules de la colonne 2 qui sont des constantes (on peut adapter pour les formules également)
     
        If Cell.Text Like Recherche Then    'si on trouve une correspondance
            IndexRésultat = IndexRésultat + 1  'on incrémente l'index
            ChoixRésultat.AddItem IndexRésultat 'on l'ajoute dans la combobox pour pouvoir le sélectionner plus tard
            For i = 0 To 17                     'on ajoute tous les offsets que l'on veut utiliser (nom, prénom, conjoint...)
                Résultats(IndexRésultat, i) = Cell.Offset(0, i) 'dans la seconde dimension du tableau des Résultats
            Next i
        End If
    End If
     
    End Sub
     
    Private Sub ChoixRésultat_Change() 'ceci serait par exemple une ComboBox
            TextBox_Nom.Value = Résultats(ChoixRésultat.Value, 0)
            TextBox_Prenom.Value = Résultats(ChoixRésultat.Value, 1)
            TextBox_conjoint.Value = Résultats(ChoixRésultat.Value, 2)
            TextBox_Adresse.Value = Résultats(ChoixRésultat.Value, 3)
            TextBox_Ville.Value = Résultats(ChoixRésultat.Value, 4)
            TextBox_Province.Value = Résultats(ChoixRésultat.Value, 6)
            TextBox_CP.Value = Résultats(ChoixRésultat.Value, 6)
            TextBox_Tel1.Value = Résultats(ChoixRésultat.Value, 7)
            TextBox_Tel2.Value = Résultats(ChoixRésultat.Value, 8)
            TextBox_Adressecourriel.Value = Résultats(ChoixRésultat.Value, 9)
            CheckBox_CHEL.Value = Résultats(ChoixRésultat.Value, 10)
            CheckBox_CHJAP.Value = Résultats(ChoixRésultat.Value, 11)
            CheckBox_CHT.Value = Résultats(ChoixRésultat.Value, 12)
            CheckBox_Rdvmed.Value = Résultats(ChoixRésultat.Value, 16)
            CheckBox_Myosotis.Value = Résultats(ChoixRésultat.Value, 13)
            CheckBox_Finvie.Value = Résultats(ChoixRésultat.Value, 15)
            CheckBox_Pastorale.Value = Résultats(ChoixRésultat.Value, 14)
            CheckBox_comres.Value = Résultats(ChoixRésultat.Value, 17)
    End Sub

    Avec ceci, tu scannes une fois puis tu navigues parmi les résultats... Je pense que ça peut-être intéressant à faire.
    Par contre, c'est plus simple de simplement faire une recherche qui commence à "lig + 1" comme je disais plus tôt... voire si tu ne veux pas stocker la ligne, à ActiveCell.row + 1
    Je pense que cela devrait fonctionner, je n'ai pas le fichier donc je n'ai pas pu essayer...

    En espérant que ça marche

    Quentin

    EDIT : Je n'ai pas pris en compte le fait que tu as besoin de modifier le profil du client et donc d'écrire dans la feuille Excel, pas juste de la consulter... Pour cela tu peux dimensionner le tableau comme suit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Redim Résultats(1 To NbRésultats, 0 To 17, 0 to 1)
    Ainsi, en troisième dimension, tu peux entrer l'adresse de la cellule, donc dans le For i = 1 to 20 tu pourrais glisser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
            For i = 0 To 17                     'on ajoute tous les offsets que l'on veut utiliser (nom, prénom, conjoint...)
                Résultats(IndexRésultat, i, 0) = Cell.Offset(0, i) 'dans la seconde dimension du tableau des Résultats
                Résultats(IndexRésultat, i, 1) = Cell.Offset(0, i).Address 'Par exemple...  
            Next i
    *
    Sinon Set Résultats(IndexRésultat, i, 1) = Cell.Offset(0, i) ?? À voir, je suis un peu fatigué, là

    Ensuite, pour écrire dans la cellule, il suffira de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range(Résultats(IndexRésultat, 0, 1)) = "NouvelleDonnée" 'Pour le cas du nom du client
    Bon, je regarderai ça de nouveau demain... Si tu peux me partager ton fichier alors j'y jetterai un oeil avec plaisir

    Quentin

  3. #3
    Membre Expert Avatar de Thautheme
    Homme Profil pro
    salarié
    Inscrit en
    Août 2014
    Messages
    1 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : salarié

    Informations forums :
    Inscription : Août 2014
    Messages : 1 373
    Par défaut
    Bonsoir le fil, bonsoir le forum,

    Avec le FindNext :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Private Sub CommandButton_cherche_Click()
    Dim R As Range 'déclare la varialbe R (Recherche)
    Dim PA As String 'déclare la variable PA (Première Adresse)
    Dim LI As Integer 'déclare la variable LI (LIgne)
     
    Set R = ActiveSheet.Columns(2).Find(TextBox_Nom, , xlValues, xlWhole) 'définit la recherche R (arguments à adapter)
    If R Is Nothing Then 'condition : si aucune occurrence trouvée
        MsgBox "Inexistant" 'message
    Else 'sinon
        PA = R.Address 'définit l'adresse de la première occurrence trouvée
        Do 'exécute
            LI = R.Row 'définit la ligne LI
            TextBox_Nom.Value = Cells(LI, 2)
            TextBox_Prenom.Value = Cells(LI, 3)
            TextBox_conjoint.Value = Cells(LI, 4)
            TextBox_Adresse.Value = Cells(LI, 5)
            TextBox_Ville.Value = Cells(LI, 6)
            TextBox_Province.Value = Cells(LI, 7)
            TextBox_CP.Value = Cells(LI, 8)
            TextBox_Tel1.Value = Cells(LI, 9)
            TextBox_Tel2.Value = Cells(LI, 10)
            TextBox_Adressecourriel.Value = Cells(LI, 11)
            CheckBox_CHEL.Value = Cells(LI, 12)
            CheckBox_CHJAP.Value = Cells(LI, 13)
            CheckBox_CHT.Value = Cells(LI, 14)
            CheckBox_Rdvmed.Value = Cells(LI, 18)
            CheckBox_Myosotis.Value = Cells(LI, 15)
            CheckBox_Finvie.Value = Cells(LI, 17)
            CheckBox_Pastorale.Value = Cells(LI, 16)
            CheckBox_comres.Value = Cells(LI, 19)
     
            If MsgBox("Suivant ?", vbYesNo) = vbYes Then 'si "Oui" au message
                Set R = ActiveSheet.Columns(2).FindNext(R) 'redéfinit la recherche R (occurrence suivante)
            Else 'sinon
                Exit Sub 'sort de la procédure
            End If 'fin de la condition
     
        Loop While Not R Is Nothing And R.Address <> PA 'boucle tant qu'il existe de nouvelles occurrences ailleurs qu'en PA
    End If 'fin de la condition
    Set R = Nothing 'initialise la variable R (pas vraiment utile puisque elle va se vider à la fin de la procédure)
    End Sub
    Le principe est relativement simple :
    • Tu définis une recherche (R par exemple).
    • Si tu trouves une première occurrence,
    • Tu définis l'adresse de cette première occurrence trouvée (PA par exemple) puis
    • Tu initialises la boucle avec un DO qui te permet d'exécuter ton code. Ensuite
    • Tu cherches l'occurrence suivante FindNext et
    • Tu fais boucler tant qu'il existe de nouvelles occurrences ailleurs qu'en PA.

    Dans ton cas, un message avant la boucle te demandant si tu veux continuer la boucle ou pas...


    L'aide VBA est très explicite sur ce pont.

  4. #4
    Futur Membre du Club
    Femme Profil pro
    agente administrative
    Inscrit en
    Décembre 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Canada

    Informations professionnelles :
    Activité : agente administrative
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2014
    Messages : 3
    Par défaut Un gros merci pour votre aide
    Merci pour vos explications le tout fonctionne comme je le voulais.

    Sylvie

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème avec la méthode find
    Par Heuvanek dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 29/06/2015, 09h42
  2. Problème avec ma méthode Find
    Par cdurep dans le forum Excel
    Réponses: 2
    Dernier message: 04/03/2014, 10h30
  3. [XL-2010] Problème avec la méthode find d'un objet Range dans une zone filtrée
    Par stargates01 dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 28/02/2014, 23h27
  4. problème avec la commande sed et find
    Par Botfounast dans le forum Shell et commandes GNU
    Réponses: 7
    Dernier message: 22/08/2011, 19h19
  5. Réponses: 6
    Dernier message: 17/04/2005, 10h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo