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 :

Formulaire VBA Excel - recherche sur plusieurs critères et affichage des résultats [XL-2007]


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Homme Profil pro
    Ingénieur matériaux
    Inscrit en
    Juillet 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Ingénieur matériaux
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2011
    Messages : 26
    Points : 13
    Points
    13
    Par défaut Formulaire VBA Excel - recherche sur plusieurs critères et affichage des résultats
    Bonjour à toutes et tous,

    j'ai besoin d'aide pour mettre au point un formulaire de recherche sur plusieurs critères...

    Je ne sais pas comment m'y prendre... il y a des codes déjà existant mais je ne les comprends pas... où ils ne font pas ce que je voudrais bien qu'ils fassent.

    J'ai mis en PJ mon fichier, j'aimerais dans la mesure du possible avoir un formulaire (cf. ébauche de mon formulaire Alt+F11 ==> useform1) permettant à l'utilisateur de faire une recherche sur un ou plusieurs critères et d'afficher les résultats dans une box.

    Merci par avance,

    Je continue à cherche de mon côté mais je coince...

    kl1ft
    Fichiers attachés Fichiers attachés

  2. #2
    Invité
    Invité(e)
    Par défaut
    Salut Kl1ft

    Tu peux essayer ce code
    Bouton Clear
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Private Sub Clear_Click()
    ' Clear the form
      For Each ctl In Me.Controls
        If TypeName(ctl) = "TextBox" Or TypeName(ctl) = "ComboBox" Then
          ctl.Value = ""
        ElseIf TypeName(ctl) = "CheckBox" Then
          ctl.Value = False
        End If
      Next ctl
      Me.ListBox1.Clear
    End Sub
    Bouton Search
    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
    Private Sub Search_Click()
      Dim Ind As Integer, DLig As Long, Lig As Long
      Dim TabCrit() As String, FlgFind As Boolean
      ' Tableau des champs pas rapport au sens des colonnes
      TabCrit = Split("Title,Type_Document,Date_publication,Author,Subject,Keywords", ",")
      ' Mettre le flag de valeur trouvée à FAUX
      FlgFind = False
      ' Effacer la ListBox avant
      Me.ListBox1.Clear
      ' Avec la feuille
      With Sheets("Gestion des documents")
        ' Mémoriser la dernière ligne remplie du tableau
        DLig = .Range("B" & Rows.Count).End(xlUp).Row
        ' Pour chaque ligne
        For Lig = 2 To DLig
          ' Pour chaque critère
          For Ind = 0 To 5
            ' Si le critère de recherche a été renseigné
            If Me.Controls(TabCrit(Ind)) <> "" Then
              ' Si le critère ressemble au contenu de la cellule
              If UCase(.Cells(Lig, 2 + Ind)) Like UCase("*" & Me.Controls(TabCrit(Ind)) & "*") Then
                ' Mettre le Flag trouvé à VRAI
                FlgFind = True
              Else
                ' Sinon mettre le Flag trouvé à FAUX
                FlgFind = False
              End If
            End If
          Next Ind
          ' Si le flag valeurs trouvées est toujours à vrai, on a trouvé une correspondance
          If FlgFind = True Then
            ' Ajouter l'item
            Me.ListBox1.AddItem .Cells(Lig, 2)
            ' Pour chaque colonne
            For Ind = 1 To 5
              ' Ajouter les valeurs correspondantes
              Me.ListBox1.List(Me.ListBox1.ListCount - 1, Ind) = .Cells(Lig, 2 + Ind)
            Next Ind
          End If
        Next Lig
      End With
    End Sub
    Qui selon le nombre de critères renseignés, inscrit les valeurs des lignes correspondantes

    Attention ta combobox doit avoir la propriété : ColumnCount = 8

    A+
    Dernière modification par Invité ; 04/08/2011 à 23h04.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Ingénieur matériaux
    Inscrit en
    Juillet 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Ingénieur matériaux
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2011
    Messages : 26
    Points : 13
    Points
    13
    Par défaut
    J'ai testé le code dans mon ébauche de useform que j'ai joint à la première discussion.

    Ca fonctionne, mais (il y a un toujours un mais...)
    Lorsque je sélectionne un ou 2 critères seulement, cela me renvoie pas les données comme il faut. J'ai lu ton code, je débute avec les macros de recherche;

    J'ai vu des macro utilisant les "flag", ça à l'air incontournable pour ce genre de code.

    Dans l'absolue, j'aimerai pouvoir faire une recherche sur 1, 2, 3 ... ou encore sir tous les critères peu importe ceux que j'aurais choisi et que cela me renvoie dans la fenêtre le Title et le lien (si possible actif pour cliquer dessus)...

    Et pouvoir faire plusieurs recherches à la suite les unes des autres. La listbox ne se rafraichit plus après la première recherche.

    J'aimerais pouvoir t'aider plus sur le développement de la chose mais je suis actuellement en "mode" apprentissage !

    J'essaye de comprendre le fonctionnement des codes des moteurs de recherche VBA.

    A mon avis on tient le bon bout, manque plus qu'à peaufiner.

    Merci encore pour ton aide si précieuse !!

  4. #4
    Invité
    Invité(e)
    Par défaut
    Re,

    Après plusieurs test il s'avère effectivement que j'ai un problème dans mon code, j'ai donc fait totalement autrement

    Je comptabilise le nombre de critères remplis et le nombre de valeurs qui correspondent, si les 2 chiffres sont équivalent, on ajoute à la liste
    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
    Private Sub Search_Click()
      Dim Ind As Integer, DLig As Long, Lig As Long
      Dim TabCrit() As String, NbCrit As Integer, NbFind As Integer
      ' Tableau des champs pas rapport au sens des colonnes
      TabCrit = Split("Title,Type_Document,Date_publication,Author,Subject,Keywords", ",")
      ' Effacer la ListBox avant
      Me.ListBox1.Clear
      ' Avec la feuille
      With Sheets("Gestion des documents")
        ' Mémoriser la dernière ligne remplie du tableau
        DLig = .Range("B" & Rows.Count).End(xlUp).Row
        ' Pour chaque ligne
        For Lig = 2 To DLig
          ' Mettre le nombre de critères et le nombre de valeurs trouvées à ZERO
          NbCrit = 0: NbFind = 0
          ' Pour chaque critère
          For Ind = 0 To 5
            ' Si le critère de recherche a été renseigné
            If Me.Controls(TabCrit(Ind)) <> "" Then
              NbCrit = NbCrit + 1
              ' Si le critère ressemble au contenu de la cellule
              If UCase(.Cells(Lig, 2 + Ind)) Like UCase("*" & Me.Controls(TabCrit(Ind)) & "*") Then
                ' Comptabiliser le nombre de valeurs correspondantes
                NbFind = NbFind + 1
              End If
            End If
          Next Ind
          ' Si le nombre de critères rempli = le nombre de valeurs trouvées
          If NbCrit = NbFind Then
            ' Ajouter l'item
            Me.ListBox1.AddItem .Cells(Lig, 2)
            ' Pour chaque colonne
            For Ind = 1 To 5
              ' Ajouter les valeurs correspondantes
              Me.ListBox1.List(Me.ListBox1.ListCount - 1, Ind) = .Cells(Lig, 2 + Ind)
            Next Ind
          End If
        Next Lig
      End With
    End Sub
    En revanche pour le rafraichissement, il suffit d'effacer la Listbox avant

    Ci-joint ton fichier avec le code modifié également pour le double clique dans la listbox qui ouvre le lien de la colonne I si celui-ci existe

    A+
    Fichiers attachés Fichiers attachés
    Dernière modification par Invité ; 04/08/2011 à 23h45.

  5. #5
    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
    Bonsoir
    Une proposition en utilisant un filtre automatique
    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
    Private Sub Search_Click()
    Dim Plage As Range, c As Range
    Dim LastLig As Integer
    Dim TbCrit, TbCol
    Dim i As Byte
     
    Application.ScreenUpdating = False
    TbCrit = Array(Me.Title, Me.Date_publication, Me.Type_Document, Me.Author, Me.Subject, Me.Keywords)
    TbCol = Array(1, 3, 2, 4, 5, 6)
    With Sheets("Gestion des documents")
        .AutoFilterMode = False
        LastLig = .Cells(.Rows.Count, "A").End(xlUp).Row
        Set Plage = .Range("B1:G" & LastLig)
        For i = 0 To 5
            If TbCrit(i) <> "" Then
                If i = 1 Then
                    If TbCrit(1) <> "N/A" Then Plage.AutoFilter field:=3, Criteria1:=">=" & CLng(DateValue("1/1/" & TbCrit(1))), Criteria2:="<=" & CLng(DateValue("31/12/" & TbCrit(1)))
                Else
                    Plage.AutoFilter field:=TbCol(i), Criteria1:=IIf(i = 5, "*" & TbCrit(i) & "*", TbCrit(i))
                End If
            End If
        Next i
        With Me.ListBox1
            .ColumnCount = 6
            .Clear
        End With
        If .Range("B1:B" & LastLig).SpecialCells(xlCellTypeVisible).Count > 1 Then
            Set Plage = .Range("B2:B" & LastLig).SpecialCells(xlCellTypeVisible)
            For Each c In Plage
                Me.ListBox1.AddItem c
                For i = 1 To 5
                    Me.ListBox1.List(Me.ListBox1.ListCount - 1, i) = c.Offset(0, i)
                Next i
            Next c
            Set Plage = Nothing
        End If
        .AutoFilterMode = False
    End With
    End Sub
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

  6. #6
    Membre à l'essai
    Homme Profil pro
    Ingénieur matériaux
    Inscrit en
    Juillet 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Ingénieur matériaux
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2011
    Messages : 26
    Points : 13
    Points
    13
    Par défaut
    Bonjour à vous deux

    Merci pour vos contributions !!

    Bruno ça fontionne du tonnerre pour l'instant
    J'ai testé ton code, il fait ce que je voulais !


    Mercatog, je n'ai pas encore eu l'occasion de tester le tien mais je vais m'y coller.

    Merci à vous deux encore une fois !


  7. #7
    Membre à l'essai
    Homme Profil pro
    Ingénieur matériaux
    Inscrit en
    Juillet 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Ingénieur matériaux
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2011
    Messages : 26
    Points : 13
    Points
    13
    Par défaut
    Mercatog,

    J'ai testé ton code, mais il ne fonctionne qu'en partie... les recherches auteur et titre ne donnent rien.

    Merci,

    Kl1ft


    Citation Envoyé par mercatog Voir le message
    Bonsoir
    Une proposition en utilisant un filtre automatique
    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
    Private Sub Search_Click()
    Dim Plage As Range, c As Range
    Dim LastLig As Integer
    Dim TbCrit, TbCol
    Dim i As Byte
     
    Application.ScreenUpdating = False
    TbCrit = Array(Me.Title, Me.Date_publication, Me.Type_Document, Me.Author, Me.Subject, Me.Keywords)
    TbCol = Array(1, 3, 2, 4, 5, 6)
    With Sheets("Gestion des documents")
        .AutoFilterMode = False
        LastLig = .Cells(.Rows.Count, "A").End(xlUp).Row
        Set Plage = .Range("B1:G" & LastLig)
        For i = 0 To 5
            If TbCrit(i) <> "" Then
                If i = 1 Then
                    If TbCrit(1) <> "N/A" Then Plage.AutoFilter field:=3, Criteria1:=">=" & CLng(DateValue("1/1/" & TbCrit(1))), Criteria2:="<=" & CLng(DateValue("31/12/" & TbCrit(1)))
                Else
                    Plage.AutoFilter field:=TbCol(i), Criteria1:=IIf(i = 5, "*" & TbCrit(i) & "*", TbCrit(i))
                End If
            End If
        Next i
        With Me.ListBox1
            .ColumnCount = 6
            .Clear
        End With
        If .Range("B1:B" & LastLig).SpecialCells(xlCellTypeVisible).Count > 1 Then
            Set Plage = .Range("B2:B" & LastLig).SpecialCells(xlCellTypeVisible)
            For Each c In Plage
                Me.ListBox1.AddItem c
                For i = 1 To 5
                    Me.ListBox1.List(Me.ListBox1.ListCount - 1, i) = c.Offset(0, i)
                Next i
            Next c
            Set Plage = Nothing
        End If
        .AutoFilterMode = False
    End With
    End Sub

  8. #8
    Membre à l'essai
    Homme Profil pro
    Ingénieur matériaux
    Inscrit en
    Juillet 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Ingénieur matériaux
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2011
    Messages : 26
    Points : 13
    Points
    13
    Par défaut
    J'ai mis en pj le fichier sur lequel je travaille actuellement.

    J'ai modifié le formulaire, il y a 4 onglets pour 4 actions (Ajouter / Modifier / Supprimer / Rechercher)

    J'ai tout copier-coller à la lettre, essayé de comprendre la macro mais je n'arrive pas à comprendre ce qui fait que cela ne fonctionne plus... j'ai pourtant rien changé.

    Une petite explication serait la bienvenue que je comprennes mon oublie

    Merci à vous
    Fichiers attachés Fichiers attachés

  9. #9
    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
    Remplace la ligne 19 par celle ci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Plage.AutoFilter field:=TbCol(i), Criteria1:="*" & TbCrit(i) & "*"
    En fait, le code précédent recherchait les expressions exactes (sauf pour le champs Keywords)
    Avec cette modification, tu auras les lignes contenant l'expression de recherche.
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

  10. #10
    Membre à l'essai
    Homme Profil pro
    Ingénieur matériaux
    Inscrit en
    Juillet 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Ingénieur matériaux
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2011
    Messages : 26
    Points : 13
    Points
    13
    Par défaut
    Merci mercatog !!

    Ca fonctionne

    Encore une petite chose, comment faire pour que lorsque l'on clique sur le résultat on accéde au document voulu via le lien ?

    Merci,

    Tout est impec sinon !!



  11. #11
    Candidat au Club
    Femme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Hello kl1ft !

    Une petite question qui peut paraître idiote mais comment as-tu rempli tes combobox date de publication et type de document ?

    Merci d'avance pour ta réponse !

  12. #12
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Points : 24 327
    Points
    24 327
    Par défaut
    Bonjour,

    Cette discussion date de 2011 et kl1ft n'a plus eu d'activité sur le forum depuis 2013.
    N'oubliez pas de cliquer sur quand vous avez obtenu ou trouvé vous-même la réponse à votre question.
    Si vous trouvez seul, pensez à poster votre solution. Elle peut servir à d'autres!
    Pensez aussi à voter pour les réponses qui vous ont aidés.
    ------------
    Je dois beaucoup de mes connaissances à mes erreurs!

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

Discussions similaires

  1. [VBA/Excel]recherche sur 2 colonnes
    Par rodrigue62 dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 27/03/2007, 17h35
  2. [VBA Excel] Filtre sur plusieurs critères
    Par tazmania dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 06/12/2006, 11h12
  3. [VBA-E] Recherche sur plusieurs colonnes ?
    Par Kokito dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 14/11/2006, 13h27
  4. [VBA-Excel]recherche sur plusiers feuilles
    Par salim_kwada dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 23/08/2006, 16h38
  5. [VBA-E]filtre sur plusieurs Critères avec Excel
    Par Diablo_22 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 29/05/2006, 20h34

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