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 :

.Find multicritères + résultats multiples


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Profil pro
    Technicien maintenance
    Inscrit en
    Juin 2013
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2013
    Messages : 20
    Par défaut .Find multicritères + résultats multiples
    Bonjour à tous !

    Je cherche à faire une recherche dans un fichier excel afin d'exploiter les résultats, jusque là rien de trop compliqué.
    Le problème est que dans un cas, j'ai besoin de faire une recherche sur 2 critères d'une même ligne.

    Exemple :

    Col 1 Col2 Col3

    X 05/08/13 Blabla

    Il faut que toutes les lignes comportant un X et la date 05/08/13 soient insérées dans un combobox (je pense que cette partie ne me posera pas de problème).

    Je coince vraiment sur la partie de recherche multicritères. De ce que j'ai pu voir sur le net, c'est pas possible mais peut être que quelqu'un a une solution...

    Je n'ai pas de début de code à vous présenter puisque tout ce que j'ai pu essayer jusqu'à présent ne fonctionne pas... Si vous avez une proposition, je ferai un bout de code pour le présenter ici.

  2. #2
    Expert éminent 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
    Par défaut
    Un filtre automatique fera l'affaire

  3. #3
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 609
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 609
    Par défaut
    Sinon, tu peux peut-être incorporer une colonne et y concaténer les valeurs de recherche.

  4. #4
    Membre expérimenté
    Inscrit en
    Juillet 2007
    Messages
    239
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 239
    Par défaut
    Tu peux avoir plusieurs conditions ( ou critéres mais on est en VBA ):


    tu peux utiliser la structure suivante:

    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
     
    'le critére 1 s'applique à une plage colonne 1
    with range ("A1:A5" )
      set c= = .Find("toto", LookAt:=xlPart ) 
     
     If Not c Is Nothing Then
        first_row = c.Row
       Do
     
           'traitement
      'tu testes le critere suivant , exemple la valeur  colonne 3 = "toto3"
     
    if cells ( c.row , 3).value =   "toto3"  then 
     
               tu enrichis le combobox avec la valeur trouvée dans cellule ( A et c.row )   et  cellule ( C et c.row )
    end if 
     
           Set c = .FindNext(c)
        Loop While Not c Is Nothing And <> first_row
     end if 
     
    end with
    'tu peux mettre autant de if que de critére.
    et pour avoir un résultat le plus rapide tu fais le find sur la colonne qui est la plus discriminante.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Il suffit de filtrer les deux colonnes en question avec un simple filtre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Option Explicit
     
    Public Sub TriDonnees()
     
      With ActiveSheet
        If .FilterMode = True Then .AutoFilterMode = False
        .UsedRange.AutoFilter Field:=1, Criteria1:="X"
        .UsedRange.AutoFilter Field:=2, Criteria1:=CDate("5/8/2013")
      End With
     
    End Sub
    Dernière modification par Invité ; 07/08/2013 à 19h13.

  6. #6
    Membre expérimenté
    Inscrit en
    Juillet 2007
    Messages
    239
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 239
    Par défaut
    D'accord mais c'est pas avec un filtre que l'on remplit la Combo.
    Pour moi la solution passe par VBA ( on est dans le forum VBA)..

  7. #7
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par CodeFacile Voir le message
    D'accord mais c'est pas avec un filtre que l'on remplit la Combo.
    Pour moi la solution passe par VBA ( on est dans le forum VBA)..
    Il faut que toutes les lignes comportant un X et la date 05/08/13 soient insérées dans un combobox (je pense que cette partie ne me posera pas de problème).

    Je coince vraiment sur la partie de recherche multicritères.
    Je n'ai fait que répondre à la question initiale.

  8. #8
    Membre averti
    Profil pro
    Technicien maintenance
    Inscrit en
    Juin 2013
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2013
    Messages : 20
    Par défaut
    Je suis d'accord avec CodeFacile.

    La solution du filtre ne convient pas à ce que je cherche à faire. Là je cherche à trouver les lignes correspondant à mes critères pour les insérer par la suite dans un combobox.

    Mais malgré tout merci pour vos propositions.

    Je vais tester la méthode que m'a proposé CodeFacile et je vous présenterai un code.

  9. #9
    Invité
    Invité(e)
    Par défaut
    Dans ce cas:
    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
    Option Explicit
     
    Public Sub Main()
     
      Call TriDonnees
      Call RemplirCombobox
     
    End Sub
     
    Private Sub TriDonnees()
     
      With ActiveSheet
        If .FilterMode = True Then .AutoFilterMode = False
        .UsedRange.AutoFilter Field:=1, Criteria1:="X"
        .UsedRange.AutoFilter Field:=2, Criteria1:="=05/08/2013"
      End With
     
    End Sub
     
    Private Sub RemplirCombobox()
     
      Dim rngC As Range
     
      With ActiveSheet
        .cmbTest.Clear
        For Each rngC In .UsedRange.SpecialCells(xlCellTypeVisible).Rows
          If rngC.Row > 1 Then
            .cmbTest.AddItem .Cells(rngC.Row, 3)
          End If
        Next rngC
      End With
     
    End Sub
    Avec 'cmbTest' le 'ComboBox' présent sur la feuille Excel.
    Un exemple est donné en PJ.
    Dernière modification par Invité ; 12/08/2013 à 14h44.

  10. #10
    Membre Expert

    Homme Profil pro
    Technicien Métrologie R&D
    Inscrit en
    Janvier 2007
    Messages
    1 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien Métrologie R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 610
    Billets dans le blog
    1
    Par défaut
    ceci avec une liste en feuille 2 trois colonnes ABC
    un Userform avec 2 textbox , 1 combobox et un command bouton
    le code dans le commandbutton
    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
    Private Sub CommandButton1_Click()
    Dim alim() As Variant
    i = 1
    With Sheets(2)
    Tbl = .Range("a1:c" & .Range("a1").End(xlDown).Row)
    End With
    For t = 1 To UBound(Tbl, 1)
    If Tbl(t, 1) = TextBox1.Value And Str(Tbl(t, 2)) = TextBox2.Value Then
    ReDim Preserve alim(i)
    alim(i) = Tbl(t, 3)
    End If
    Next
    With ComboBox1
    For t = 1 To UBound(alim, 1)
    .AddItem alim(t)
    Next
    End With
    End Sub

  11. #11
    Membre averti
    Profil pro
    Technicien maintenance
    Inscrit en
    Juin 2013
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2013
    Messages : 20
    Par défaut
    En utilisant la méthode de CodeFacile, voici un bout de code qui fait exactement ce que je veux et qui prend à peine 1s de traitement.

    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
    With Workbooks(AppelsXXXX).Worksheets("Appels")
     
            Set c = .Range("B3:B" & Dlg).Find(NumTermRech.Value, LookAt:=xlPart)
     
            If Not c Is Nothing Then
     
                first_row = c.Row
     
                Do
     
                    If .Cells(c.Row, 6) = DateFormat Then
     
                        ConcatChxIncidt = .Range("H" & c.Row) + " | " + .Range("J" & c.Row)
     
                        ChoixIncident.AddItem ConcatChxIncidt
     
                    End If
     
                Set c = .Range("B3:B" & Dlg).FindNext(c)
     
                Loop While Not c Is Nothing And c.Row <> first_row
     
            End If
     
        End With
    Il est également possible d'utiliser un filtre comme proposé mais dans ce cas il faudra détecter la première ligne du filtre et la dernière pour pouvoir utiliser une liste pour l'ajout dans la comboxbox.

    Merci à tous pour vos propositions !

  12. #12
    Invité
    Invité(e)
    Par défaut
    Ma méthode est plus rapide car elle ne boucle par sur l'ensemble des lignes.
    Mais bon la différence doit être minime.

  13. #13
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut heu
    Bonjour

    si tu fait une recherche dans les contributions tu en trouvera une qui fait exactement ce que tu cherche j'en suis l'auteur
    le theme est de trier les doublons sur plusieur colonne

    il y a les deux methodes (avec dictionnaire ,avec variables tableaux )

    au plaisir
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  14. #14
    Membre averti
    Profil pro
    Technicien maintenance
    Inscrit en
    Juin 2013
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2013
    Messages : 20
    Par défaut
    Citation Envoyé par patricktoulon Voir le message
    Bonjour

    si tu fait une recherche dans les contributions tu en trouvera une qui fait exactement ce que tu cherche j'en suis l'auteur
    le theme est de trier les doublons sur plusieur colonne

    il y a les deux methodes (avec dictionnaire ,avec variables tableaux )

    au plaisir
    Bonjour, j'utilise déjà ta méthode avec dictionnaire lors de l'initialisation de mon UserForm pour remplir certains combobox. Je dois avouer avoir cherché la meilleure façon de charger des combobox en le moins de temps possible et je n'ai pas trouvé mieux !
    La seule méthode qui est plus rapide est d'utiliser une liste, mais ce n'était pas exploitable dans mon cas...

    Si je ne me trompe pas, tu parles de ce code (adapté à une autre partie de mon code) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    With CreateObject("Scripting.Dictionary")
        .CompareMode = vbTextCompare
        For Each v In Worksheets("NumTerm").Range("A5:A" & DlgNumTerm)
            If Not IsEmpty(v.Value) And Not .exists(v.Value) Then
                .Add v, Nothing
                Me.CodeAgence.AddItem v
            End If
        Next v
    End With

  15. #15
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    bonjour
    c'est une solution mais incomplète

    pour remplir ta liste tu boucle sur une plage de cellules hors dans mon exemple on boucle sur un tableau contenant la plage désignée ce qui accélère de 80% la rapidité d'exécution du tri ,ce qui n'est pas négligeable quand on a un listing avec beaucoup de lignes

    retourne voir mon exemple et analyse le code tu comprendra mieux

    Au plaisir
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  16. #16
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 184
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Je sais cette discussion résolue mais voici une autre approche basée sur le filtre avancé d"excel et en utilisant la propriété RowSource du ComboBox.
    Cette procédure nécessite une feuille (qui peut-être cachée) et qui contiendra le résultat de la sélection et qui servira de référence pour la propriété RowSource.
    Code à lancer par exemple à l'ouverture du UserForm ou lors d'un changement de sélection. Il faudra alors paramétrer la formule contenue dans la variable myFormula qui elle même pour le besoin de la démonstration est figée.
    La formule placée par le programme en cellule A2 (zone des critères) est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =ET(db!D2="H";MOIS(db!E2)=1;ANNEE(db!E2)=2013)
    Code VBA
    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
    Sub AlimenteCombobox()
     Dim rngData As Range, rngExport As Range, rngCriteria As Range
     Dim myFormula As String
     Set rngData = ThisWorkbook.Worksheets("db").Range("A1").CurrentRegion
     With shtExport ' CodeName de la feuille Export
      Set rngExport = .Range("C1")
      Set rngCriteria = .Range("A1:A2")
     End With
     myFormula = "=AND(db!RC[3]=""H"",MONTH(db!RC[4])=1,YEAR(db!RC[4])=2013)"
     With rngCriteria ' Placement des critères
     .Cells(1).Value = "critère": .Cells(2).Formula = myFormula
     End With
     ' Exportation suivant critères
     rngData.AdvancedFilter xlFilterCopy, rngCriteria, rngExport
     ' Affectation nouvelle valeur rngExport pour RowSource
     With rngExport.CurrentRegion
      Set rngExport = .Offset(1).Resize(.Rows.Count - 1)
     End With
     ' Alimentation du ComboBox
     With rngExport
      Me.cbFiltre.RowSource = .Worksheet.Name & "!" & .Address
     End With
    End Sub
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  17. #17
    Membre averti
    Profil pro
    Technicien maintenance
    Inscrit en
    Juin 2013
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2013
    Messages : 20
    Par défaut
    Citation Envoyé par patricktoulon Voir le message
    bonjour
    c'est une solution mais incomplète

    pour remplir ta liste tu boucle sur une plage de cellules hors dans mon exemple on boucle sur un tableau contenant la plage désignée ce qui accélère de 80% la rapidité d'exécution du tri ,ce qui n'est pas négligeable quand on a un listing avec beaucoup de lignes

    retourne voir mon exemple et analyse le code tu comprendra mieux

    Au plaisir
    Si tu peux me redonner le lien ce serait sympa, j'étais tombé dessus lors d'une recherche mais je ne me souviens plus laquelle. Et en plus, ça aidera certainement d'autres personnes de passage sur ce post

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

Discussions similaires

  1. Jointure aux résultats multiples
    Par samspitz dans le forum Zend_Db
    Réponses: 1
    Dernier message: 24/06/2010, 19h11
  2. recherche multicritère résultat vide
    Par csophie49 dans le forum VBA Access
    Réponses: 5
    Dernier message: 17/08/2007, 14h50
  3. Recherchev poussée avec résultats multiples
    Par solorac dans le forum Excel
    Réponses: 13
    Dernier message: 22/06/2007, 12h14
  4. [SQL] Recherche à résultats multiples SQL - PHP
    Par Paradise01 dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 15/08/2006, 15h52
  5. selection simple mais résultat multiple dans combobox
    Par forzaxelah dans le forum Bases de données
    Réponses: 1
    Dernier message: 12/06/2006, 15h21

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