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 :

Recherche avancée multi-colonne


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé Avatar de Neutthsch
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Janvier 2016
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2016
    Messages : 105
    Par défaut Recherche avancée multi-colonne
    Salut le forum,

    L'objectif c'est de créer un moteur de recherche multi-critères géré comme suit :

    Nom : Moteur recherche.JPG
Affichages : 290
Taille : 23,9 Ko
    1. 1 ListBox qui est alimenté sans doublons sur la colonne 3 et qui sert à filtrer sur cette colonne
    2. 1 ListBox qui est alimenté sans doublons sur la colonne 4 et qui sert à filtrer sur cette colonne
    3. 3 OptionButton qui doivent renvoyer des filtres sur les colonnes 7 et 12
      • Si All est coché, il n'y a pas de filtre sur 7 et 12
      • Si Metro est coché, il filtre les non vide sur 7 et pas de filtre sur 12
      • Si Maintenance est coché, il filtre les non vide sur 12 et pas de filtre sur 7
    4. Et pour finir on a une TextBox que l'opérateur peut remplir au besoin

    5. Toutes les lignes trouvées sont répertoriées dans un combobox


    Bon tout va bien pour l'instant, ça fonctionne bien avec des fonctions AutoFilter
    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
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    rivate Sub Filter_Procedure()
     
    Dim FirstAddress As String
    Dim FoundRange As Range
     
    If AvailableClick = True Then
        If ServButton1 = True Then
            InitData.Columns("A:P").AutoFilter field:=7
            InitData.Columns("A:P").AutoFilter field:=12
        ElseIf ServButton2 = True Then
            InitData.Columns("A:P").AutoFilter field:=7, Criteria1:="<>"
            InitData.Columns("A:P").AutoFilter field:=12
        ElseIf ServButton3 = True Then
            InitData.Columns("A:P").AutoFilter field:=7
            InitData.Columns("A:P").AutoFilter field:=12, Criteria1:="<>"
        End If
     
        If ZoneComboBox <> "" Then
            InitData.Columns("A:P").AutoFilter field:=3, Criteria1:=ZoneComboBox.Text
        Else
            InitData.Columns("A:P").AutoFilter field:=3
        End If
     
        If LocalComboBox <> "" Then
            InitData.Columns("A:P").AutoFilter field:=4, Criteria1:=LocalComboBox.Text
        Else
            InitData.Columns("A:P").AutoFilter field:=4
        End If
     
        ReDim EquipRowList(0)
     
        Me.EquipListBox.Clear  'On nettoie les Combobox avant de les réalimenter - ceci active le EquipListBox_Change()
        Me.PieComboBox.Clear   '- ceci active le PiecomboBox_Change()
        If SearchTextBox.Text <> "" Then
     
            Set FoundRange = InitData.Columns("A:P").Find(What:=SearchTextBox.Text, After:=InitData.Cells(2, 1), LookIn:=xlFormulas, _
                SearchOrder:=xlByRows, SearchDirection:=xlNext, _
                MatchCase:=False, SearchFormat:=False)
     
            If FoundRange Is Nothing Then
                MsgBox "Votre recherche n'a donnée aucun résultat"
            ElseIf Not FoundRange Is Nothing Then
     
                FirstAddress = FoundRange.Address
     
                Do
                    If InitData.Cells(FoundRange.Row, 10) = "Supprimé" Then
                        Me.EquipListBox.AddItem InitData.Cells(FoundRange.Row, 2) & Chr(9) & "SUPPRIME"
                    Else
                        Me.EquipListBox.AddItem InitData.Cells(FoundRange.Row, 2) & Chr(9) & InitData.Cells(FoundRange.Row, 1)
                    End If
                    ReDim Preserve EquipRowList(UBound(EquipRowList) + 1) 'on alimente une variable tableau qui va stocker les numéros de ligne de Initdata
                    EquipRowList(UBound(EquipRowList)) = FoundRange.Row
     
                    Set FoundRange = InitData.Columns("A:P").Cells.FindNext(FoundRange)
                Loop While Not FoundRange Is Nothing And FoundRange.Address <> FirstAddress
            End If
        Else
            For VarInc = 2 To LastEquipment
                If InitData.Cells(VarInc, 2).EntireRow.Hidden = False Then
                    If InitData.Cells(VarInc, 10) = "Supprimé" Then
                        Me.EquipListBox.AddItem InitData.Cells(VarInc, 2) & Chr(9) & "SUPPRIME"
                    Else
                        Me.EquipListBox.AddItem InitData.Cells(VarInc, 2) & Chr(9) & InitData.Cells(VarInc, 1)
                    End If
                        ReDim Preserve EquipRowList(UBound(EquipRowList) + 1) 'on alimente une variable tableau qui va stocker les numéros de ligne de Initdata
                        EquipRowList(UBound(EquipRowList)) = VarInc
                End If
            Next  
     
     
        End If
        Me.EquipListBox.ListIndex = 0
    End If
     
    End Sub
    Sauf que j'aimerais le faire sans filtrer physiquement les colonnes, ce qui est pas très "propre" à mon gout et qui fait ramer pas mal quand même. le pied se serait de lancer un bon gros .find mais bon je vois difficilement comment réaliser ça.

    Tout est dit je crois
    D'avance merci,

  2. #2
    Membre Expert Avatar de Gado2600
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Mai 2013
    Messages
    909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Office VBA

    Informations forums :
    Inscription : Mai 2013
    Messages : 909
    Par défaut
    Bonjour,

    Si le problème de ton filtrage "physique" est que tu filtres ton principal onglet, duplique celui-ci et sers de ton onglet copié comme source.

    Sinon, en idée de tri, tu peux avoir la manipulation via des tableaux numériques ou alors en SQL.

    Cordialement,

  3. #3
    Membre éprouvé Avatar de Neutthsch
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Janvier 2016
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2016
    Messages : 105
    Par défaut SQL
    Merci pour cette réponse,

    J'ai encore jamais mis de SQL sous excel, je savais même pas que c'était possible. Je vais aller jeter un coup d’œil dans ce sens, en plus va falloir que je me fasse une petite piqûre de rappel parce que ça date ça

  4. #4
    Membre éprouvé Avatar de Neutthsch
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Janvier 2016
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2016
    Messages : 105
    Par défaut
    Bon ma question n'ayant pas fait des émules, je vais m'auto répondre :

    J'ai utilisé une boucle For-Next qui court sur toutes les lignes de mon tableau et si au moins une des conditions de recherche n'ai pas remplie, une boolean devient fausse.
    Si ma valeur est resté vrai jusqu'à la fin de ma boucle alors je la récupère.
    En faite, c'est une solution simple et rapide
    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
        For VarInc = 2 To LastEquipment
            FoundInfo = 1
     
            If ServButton2 = True And InitData.Cells(VarInc, 7) <> "<>" Then
                    FoundInfo = 0
                    GoTo NextRow
            ElseIf ServButton3 = True And InitData.Cells(VarInc, 12) <> "<>" Then
                    FoundInfo = 0
                    GoTo NextRow
            End If
     
            If ZoneComboBox <> "" And InitData.Cells(VarInc, 3) <> ZoneComboBox Then
                FoundInfo = 0
                GoTo NextRow
            End If
     
            If LocalComboBox <> "" And InitData.Cells(VarInc, 4) <> LocalComboBox Then
                FoundInfo = 0
                GoTo NextRow
            End If
     
            If SearchTextBox.Text <> "" And InitData.Cells(VarInc, 1) Like SearchTextBox.Text Then
                FoundInfo = 0
            End If
     
            If FoundInfo = 1 Then 'Si tout les paramètres ont été trouvé sur la ligne en cours alors on peut alimenter EquipListBox
                If InitData.Cells(VarInc, 10) = "Supprimé" Then
                    Me.EquipListBox.AddItem InitData.Cells(VarInc, 2) & Chr(9) & "SUPPRIME"
                Else
                    Me.EquipListBox.AddItem InitData.Cells(VarInc, 2) & Chr(9) & InitData.Cells(VarInc, 1)
                End If
                    ReDim Preserve EquipRowList(UBound(EquipRowList) + 1) 'on alimente une variable tableau qui va stocker les numéros de ligne de Initdata
                    EquipRowList(UBound(EquipRowList)) = VarInc
            End If
     
    NextRow:
        Next
    EDIT : j'utilise un Goto pour accélérer la boucle, mais je pourrais m'en passer normalement (je sais pas si ça accélère à dire vrai

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

Discussions similaires

  1. [WD17] Recherche dans combo multi colonne
    Par Nhaps dans le forum WinDev
    Réponses: 1
    Dernier message: 05/06/2013, 10h01
  2. [XL-2007] recherche VBA multi-colonnes
    Par kineton dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 05/01/2011, 01h11
  3. un trombinoscope multi colonne en xsl
    Par philou44 dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 08/10/2004, 15h38

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