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 :

Combobox de recherche


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 163
    Par défaut Combobox de recherche
    Bonjour,
    J'ai un petit souci avec une combox, en fait j'avais à la base une texbox de recherche qui marchait bien et là j'ai voulu changer la texbox de recherche en combobox de recherche, c'est a dire que le critère de recherche est ce que l'utilisateur a choisi dans la combobox.
    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
    Sub affiche_result_Click()
    combo = combobox1   'textbox1.text ou autre
    ligne = Worksheets("résultats de la recherche").Range("A65536").End(xlUp).Row     'modifier le nom de la feuille qui reçoit. On admet que cellule de la colonne A est toujours remplie
    With Worksheets("analyse").Range("E1:E5000")     'modifier le nom de la feuille origine
        Set c = .Find(combo, LookIn:=xlValues)
        If Not c Is Nothing Then
            firstAddress = c.Address
            Do
                i = i + 1
                maligne = c.Row
                Worksheets("résultats de la recherche").Range("A" & i + ligne & ":p" & i + ligne).Value = Worksheets("analyse").Range("A" & maligne & ":p" & maligne).Value     'modifier le nom des lfeuilles
                Set c = .FindNext(c)
            Loop While Not c Is Nothing And c.Address <> firstAddress
        End If
    End With
    End Sub
    De plus j'aimerai integrer également unenouvelle contrainte dans la recherche, c'est à dire le choix d'une combobox 2. Les résultats seraient alors l'intersection des resultats de la combobox1 et 2.Voilà.
    Merci beaucoup pour votre aide.
    Bonne soirée

  2. #2
    Membre émérite
    Avatar de fred65200
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    901
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 901
    Par défaut
    bonsoir,

    essaie
    dans ton code, combobox1 est en minuscules et devrait s'écrire ComboBox1
    est ce que ta combobox1 existe?

    cordialement

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 163
    Par défaut
    Ok. Merci.en fait j'ai trouvé la réponse, j'avais juste à selectionner la feuille avant de faire la macro. Par contre il reste la deuxième partie de la question qui consite a prendre le résultat des deux combobox pour lancer la recherche....

  4. #4
    Membre chevronné

    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    453
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 453
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Dim maValeur1 As String
    Dim maValeur2 As String
     
    maValeur1 = ComboBox1.List(ComboBox1.ListIndex)
    maValeur2 = ComboBox2.List(ComboBox2.ListIndex)

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 163
    Par défaut
    Merci, en fait çà je l'avais mon problème est de savoir comment prendre en compte ces deux conditions dans la fonction find.

  6. #6
    Membre chevronné

    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    453
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 453
    Par défaut
    Citation Envoyé par arnold95 Voir le message
    ... Les résultats seraient alors l'intersection des resultats de la combobox1 et 2.Voilà. ...
    Que veux tu dire par "l'intersection"?

    Veux tu trouver une cellule contenant la valeur de ComboBox1 ET celle de ComboBox2?

    Veux tu trouver une ligne contenant la valeur de ComboBox1 dans une cellule ET celle de ComboBox2 dans une autre cellule?

    Dand le premier cas, une fois que Find a trouvé une cellule contenant la valeur de ComboBox1, on doit tester:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ' Si cette ligne est vraie, c.Vlaue contient aussi la valeur de ComboBox2
    If InStr(1, c.Value, ComboBox2.List(ComboBox2.ListIndex)) > 0 Then
    Dans le deuxième cas, une fois que Find a trouvé une cellule contenant la valeur de ComboBox1, on doit interroger chaque cellule à sa droite dans une boucle:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Dim cln As Long
    For cln = 1 To wksAnalyse.UsedRange.Columns.Count - 1
        If InStr(1, c.Offset(0, cln).Value, ComboBox2.List(ComboBox2.ListIndex)) > 0 Then
            ' Ligne contenant les deux est trouvée
        End If
    Next cln

  7. #7
    Membre chevronné

    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    453
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 453
    Par défaut
    En passant, j'ai pris la liberté de reformuler ton code pour qu'il soit:

    1.- plus clair, en faisant une indentation plus systématique
    2.- plus rapide, en évitant les résolutions d'appels de membres des objet par le stockage dans des variable comme wksAnalyse et wksResultat
    3.- plus facile à déboguer, en déclarant toutes les variables en début de procédure et avec des types spécifiques
    4.- plus facile à modifier, en créant des constantes qui permettent de remplacer des valeur en un seul endroit sans les rechercher partout dans 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
    Sub affiche_result_Click()
        Const COL As String = "A"
        Dim wksAnalyse As Worksheet
        Dim wksResultat As Worksheet
        Dim c As Range
        Dim cln As Long
        Dim i As Long
        Dim ligne As Long
        Dim maligne As Long
        Dim firstAddress As String
     
        Set wksAnalyse = Worksheets("analyse")
        Set wksResultat = Worksheets("résultats de la recherche")
     
        'modifier le nom de la feuille qui reçoit. On admet que cellule de la colonne A est toujours remplie
        ligne = wksResultat.Range(COL & ":" & COL).Cells( _
                                                        wksResultat.Range(COL & ":" & COL).Cells.Count _
                                                        ).End(xlUp).Row
        'modifier le nom de la feuille origine
        With wksAnalyse.Range("E1:E5000")
            Set c = .Find(ComboBox1.List(ComboBox1.ListIndex), LookIn:=xlValues)
            If Not c Is Nothing Then
                firstAddress = c.Address
                Do
                    i = i + 1
                    maligne = c.Row
                    wksResultat.Range(COL & i + ligne & ":p" & i + ligne).Value = wksAnalyse.Range(COL & maligne & ":p" & maligne).Value     'modifier le nom des lfeuilles
                    Set c = .FindNext(c)
                    If c Is Nothing Then Exit Do     ' Cette ligne est séparée du While suivant pour rapidité et
                Loop While c.Address <> firstAddress '   éviter le plantage de l'appel c.Address quand c = Nothing
            End If
        End With
    End Sub
    Ça devrait faire exactement ce que ça faisait auparavant, quoiqu'une ligne comme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    wksResultat.Range(COL & i + ligne & ":p" & i + ligne).Value = wksAnalyse.Range(COL & maligne & ":p" & maligne).Value     'modifier le nom des lfeuilles
    n'assignera pas les valeurs de toutes les cellules comme tu semble le vouloir. Pour ça, il faudrait faire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    wksAnalyse.Range(COL & maligne & ":p" & maligne).Copy
    wksResultat.Range(COL & i + ligne).PasteSpecial
    Voilà!

Discussions similaires

  1. ComboBox avec recherche au milieu du texte
    Par Melodie dans le forum Composants VCL
    Réponses: 0
    Dernier message: 04/10/2010, 20h37
  2. combobox pour recherche
    Par nianko dans le forum IHM
    Réponses: 2
    Dernier message: 18/08/2010, 10h33
  3. combobox et recherche dynamique
    Par Aeltith dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 04/08/2008, 15h04
  4. ComboBox - Colonne "Recherche"
    Par Pascool dans le forum SharePoint
    Réponses: 0
    Dernier message: 26/03/2008, 16h56
  5. [VBA-E] Parcourir les Items d'un ComboBox à la recherche d'une string
    Par Jipété dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 01/12/2006, 19h23

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