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 :

Chercher mot dans une feuille, afficher résultat sur listBox [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Décembre 2013
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations forums :
    Inscription : Décembre 2013
    Messages : 79
    Points : 53
    Points
    53
    Par défaut Chercher mot dans une feuille, afficher résultat sur listBox
    Bonjour;

    Je tiens vous remercie d’avance de votre soutien habituel,
    La problématique est que: mon bouton recherche, cherche que la première colonne A, je voudrais que ma recherche soit dans toute la feuille BDD, merci.


    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
    Private Sub CommandButton4_Click()
        i = 0
        Me.ListBox1.Clear
        Me.ListBox1.ColumnCount = 2
        Me.ListBox1.BoundColumn = 2
        Me.ListBox1.ColumnWidths = "0;150"
        With Sheets("BDD")
            .AutoFilterMode = False
            Set plage = .Range(.[A2], .Cells(.Rows.Count, 1).End(xlUp)).Resize(, 1)
            plage.AutoFilter 1, "*" & Me.TextBox14 & "*"
            Set plage = plage.Offset(1).Resize(plage.Rows.Count - 1)
            If Application.Subtotal(103, plage) > 0 Then
                Set plage = plage.Resize(, 1).SpecialCells(xlCellTypeVisible)
                For Each C In plage
                    Me.ListBox1.AddItem C.Row
                    Me.ListBox1.List(i, 1) = C.Value
                    i = i + 1
                Next C
            End If
            .AutoFilterMode = False
        End With
        Me.TextBox12 = ""
        Me.TextBox14 = ""
        Me.TextBox15 = ""
        Me.TextBox16 = ""
        Me.TextBox8 = ""
        Me.OptionButton9.Value = False
        Me.OptionButton10.Value = False
        Me.OptionButton8.Value = False
        Me.OptionButton7.Value = False
        Me.OptionButton1.Value = False
        Me.OptionButton2.Value = False
        Me.OptionButton4.Value = False
     
        For i = 0 To N - 1
            If ListBox.Selected(i) Then
                MsgBox "la valeur suivante est sélectionnée : " & ListBox.List(i)
            End If
        Next i
     
        If ListBox1.ListCount = 0 Then
            MsgBox "Ce matériel n'existe pas dans la base de données"
        End If
     
        End Sub

    Merci encor, salutations.

  2. #2
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Développeur VBA/C#/VB.Net/Power Platform
    Inscrit en
    Juillet 2007
    Messages
    14 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur VBA/C#/VB.Net/Power Platform
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 594
    Points : 34 266
    Points
    34 266
    Par défaut
    Salut,


    au lieu de faire des filtres, passe directement par une boucle avec la fonction Find :
    par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    With Sheets("BDD")
           Set tmprange = .UsedRange.Find(what:=Me.TextBox14, LookIn:=xlFormulas, lookat:=xlPart)
                Do Until tmprange Is Nothing
                      'ta manipulation
                      Set tmprange = .UsedRange.Find(what:=Me.TextBox14, LookIn:=xlFormulas, lookat:=xlPart)
                Loop
    End With
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  3. #3
    Membre du Club
    Homme Profil pro
    Inscrit en
    Décembre 2013
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations forums :
    Inscription : Décembre 2013
    Messages : 79
    Points : 53
    Points
    53
    Par défaut
    Bonjour

    lmerci pour la repense jpcheck,

    a recherche prend un temps infini

  4. #4
    Membre éprouvé
    Homme Profil pro
    Programmeur analyste
    Inscrit en
    Février 2009
    Messages
    546
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Canada

    Informations professionnelles :
    Activité : Programmeur analyste
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2009
    Messages : 546
    Points : 1 116
    Points
    1 116
    Par défaut
    Bonjour,

    C'est parce que il ne sort jamais de la boucle
    Voici comment sortir,
    Il faut mettre dans une variable le numéro de la première ligne trouvé (First_No_Ligne)
    ensuite dans une autre variable on met le No de ligne à chaque fois qu'il trouve votre mot (No_Ligne)
    et avec un do loop until First_No_Ligne =No_Ligne

    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
    Dim First_No_Ligne As Integer
     Dim No_Ligne As Integer
        On Error Resume Next
         'votre mot apparaît dans ligne suivante
     
        Cells.Find(What:=TextBox14.text, After:=ActiveCell, LookIn:=xlFormulas, LookAt:= _
            xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _
            , SearchFormat:=False).Activate
        First_No_Ligne = ActiveCell.Row
        No_Ligne = First_No_Ligne + 1
        If Err.Number Then
            On Error GoTo 0
            Exit Sub
        End If
        On Error GoTo 0
        ListBox1.AddItem ActiveCell.Row
        Do
            Cells.FindNext(After:=ActiveCell).Activate
            No_Ligne = ActiveCell.Row
            ListBox1.AddItem  ActiveCell.Row
     
        Loop Until No_Ligne = First_No_Ligne

  5. #5
    Membre du Club
    Homme Profil pro
    Inscrit en
    Décembre 2013
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations forums :
    Inscription : Décembre 2013
    Messages : 79
    Points : 53
    Points
    53
    Par défaut
    Bonsoir et merci gnain

    À vrai dire ; je débute sur vba, je vais te demander un peu trop, si tu acceptes d’adapter ton code dans le fichier que j’ai envoyé sur le premier message (UserForm1, CommandButton4),

    Le but est de chercher un mot dans la feuille BDD, est afficher le résultat sur ListBox1.
    ListBox1 affiche = que la cellule de la colonne A de la même ligne du mot trouver.

    Merci encor

  6. #6
    Membre éprouvé
    Homme Profil pro
    Programmeur analyste
    Inscrit en
    Février 2009
    Messages
    546
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Canada

    Informations professionnelles :
    Activité : Programmeur analyste
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2009
    Messages : 546
    Points : 1 116
    Points
    1 116
    Par défaut
    Bonjour nacereddine.mourad
    Copier tout ceci dans votre commandbutton4

    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
    Private Sub CommandButton4_Click()
        Dim First_No_Ligne As Integer
        Dim No_Ligne As Integer
     
        Me.ListBox1.Clear
     
        On Error Resume Next
         'votre mot apparaît dans ligne suivante
     
        Cells.Find(What:=TextBox14.Text, After:=ActiveCell, LookIn:=xlFormulas, LookAt:= _
            xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _
            , SearchFormat:=False).Activate
        First_No_Ligne = ActiveCell.Row
        No_Ligne = First_No_Ligne + 1
        If Err.Number Then
            On Error GoTo 0
            Exit Sub
        End If
        On Error GoTo 0
        ListBox1.AddItem Cells(ActiveCell.Row, 1)
        Do
            Cells.FindNext(After:=ActiveCell).Activate
            No_Ligne = ActiveCell.Row
            ListBox1.AddItem Cells(ActiveCell.Row, 1)
     
        Loop Until No_Ligne = First_No_Ligne
     
        Me.TextBox12 = ""
        Me.TextBox14 = ""
        Me.TextBox15 = ""
        Me.TextBox16 = ""
        Me.TextBox8 = ""
        Me.OptionButton9.Value = False
        Me.OptionButton10.Value = False
        Me.OptionButton8.Value = False
        Me.OptionButton7.Value = False
        Me.OptionButton1.Value = False
        Me.OptionButton2.Value = False
        Me.OptionButton4.Value = False
     
        If ListBox1.ListCount = 0 Then
            MsgBox "Ce matériel n'existe pas dans la base de données"
        End If
    End Sub

  7. #7
    Membre du Club
    Homme Profil pro
    Inscrit en
    Décembre 2013
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations forums :
    Inscription : Décembre 2013
    Messages : 79
    Points : 53
    Points
    53
    Par défaut
    Bonjour gnain :

    Le code ne marche pas, quand j’écris un mot à chercher dans TextBox14, et je click sur recherche (CommandButton4), rien ne se passe.
    Essaye sur le fichier envoyé pour plus de détaille.

    Merci encore pour vos efforts

  8. #8
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    L'aide sur la méthode Find de l'objet Range te donne un exemple concret

    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
    Dim Prem As String
    Dim c As Range
     
    With Me.ListBox1
        .Clear
        .ColumnCount = 2
        .BoundColumn = 2
        .ColumnWidths = "0;150"
    End With
     
    With Worksheets("BDD").UsedRange
        Set c = .Find(Me.TextBox14, LookIn:=xlValues, Lookat:=xlPart)
        If Not c Is Nothing Then
            Prem = c.Address
            Do
                With Me.ListBox1
                    .AddItem c.Row
                    .List(.ListCount - 1, 1) = c.Value
                End With
                Set c = .FindNext(c)
            Loop While Not c Is Nothing And c.Address <> Prem
        End If
    End With
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

  9. #9
    Membre du Club
    Homme Profil pro
    Inscrit en
    Décembre 2013
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations forums :
    Inscription : Décembre 2013
    Messages : 79
    Points : 53
    Points
    53
    Par défaut
    On se rapproche, la recherche est parfaite, merci mercatog;

    mais le résultat sur la listebox1, doit affichait que la colonne A, qui correspond à la ligne du mot trouvé

    merci encor

  10. #10
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .List(.ListCount - 1, 1) = Worksheets("BDD").Range("A" & c.Row)

    Edit

    ou plus élégament
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .List(.ListCount - 1, 1) = c.Offset(, 1 - c.Column)
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

  11. #11
    Membre du Club
    Homme Profil pro
    Inscrit en
    Décembre 2013
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations forums :
    Inscription : Décembre 2013
    Messages : 79
    Points : 53
    Points
    53
    Par défaut
    Merci mercatog, merci à tous, c’est exactement ce que je cherche

  12. #12
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Par contre tu peux toujours ajouter une condition sur TextBox14

    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
    Dim Prem As String
    Dim c As Range
     
    With Me.ListBox1
        .Clear
        .ColumnCount = 2
        .BoundColumn = 2
        .ColumnWidths = "0;150"
    End With
     
    If Me.TextBox14 <> "" Then
        With Worksheets("BDD").UsedRange
            Set c = .Find(Me.TextBox14, LookIn:=xlValues, Lookat:=xlPart)
            If Not c Is Nothing Then
                Prem = c.Address
                Do
                    With Me.ListBox1
                        .AddItem c.Row
                        .List(.ListCount - 1, 1) = c.Offset(, 1 - c.Column)
                    End With
                    Set c = .FindNext(c)
                Loop While Not c Is Nothing And c.Address <> Prem
            End If
        End With
        '...
    End If
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

  13. #13
    Membre du Club
    Homme Profil pro
    Inscrit en
    Décembre 2013
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations forums :
    Inscription : Décembre 2013
    Messages : 79
    Points : 53
    Points
    53
    Par défaut
    Oui sa marcha aussi, merci
    et bonne continuation

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 17/10/2014, 18h23
  2. Macro pour compter le nombre de fois qu'apparait un mot dans une feuille
    Par arno1975 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 11/02/2014, 09h27
  3. Rechercher un mot dans une feuille
    Par vincmer28 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 09/05/2012, 11h52
  4. chercher/remplacer dans une feuille excel
    Par pointe dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 11/02/2010, 14h38
  5. Réponses: 2
    Dernier message: 19/10/2009, 23h19

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