Filtre sur plusieurs colonnes ( VBA excel 2010 ) [Résolu]

- - Dernière réponse :  leguedin67 - 12 févr. 2013 à 11:42
Bonjour à tous,

je suis nouveau en VBA.
je suis actuellement entraint de créer une interface pour ma boite.
Je dois réaliser un filtre suivant certain critère de recherche ici pour la recherhce d'un nom où prénom entré dans la inputbox
Voici le code :

Private Sub cmdNom_Click()

Recherche.Hide

'***************************************************
' pour effectuer une recherche avec un nom où prénom
'***************************************************

Dim Nom As String

Nom = InputBox("Saisissez un nom", "Recherche par Nom :", "Tapez votre recherche")

ColNom = 7 ' le numéro de la colonne Nom où Prénom du tableau
Ligne = 4 ' numéro de la premiere ligne à lire

' boucle tant que la cellule Nom comporte quelque chose
While Cells(Ligne, ColNom) <> ""

' If Cells(Ligne, ColNom).Value <> Nom Then

' premet de filtré suivant le nom où le prénom
If InStr(1, LCase(Cells(Ligne, ColNom).Value), LCase(Nom)) = 0 Then
Rows(Ligne).Select
Selection.EntireRow.Hidden = True
End If
Ligne = Ligne + 1
Wend ' fin boucle

End Sub

Je suis bloqué à ce niveau, je sais pas comment je pourrais réalisé le filtre sur 2 voir 30 colonnes avec mon code
Il sera pour des personnes non formé à excel donc c'est pour cela que je préfère que la recherche se passe via une inputbox sans passé par les filtres de excel
En vous remerciant beaucoup

Le_Guedin
Afficher la suite 

Votre réponse

11 réponses

Meilleure réponse
3
Merci
Merci à toi Jack !!!
j'avais trouvé une autre méthode pour pouvoir effectuer un trie suivant la cellule qu'on souhaite :

ColNom = [A3:Z3].Find(What:="Problem Owner", LookIn:=xlFormulas, LookAt:=xlWhole, SearchOrder:=xlByColumns).Column


Et celui fonctionne bien


Par contre j'ai vu un autre soucis
Lorsque la 1ère cellule qui est a filtré et vide rien ne ce passe ... est-il possible de remplir les cellules vide avec une action comme un bouton et de les remplir avec / ??

Merci de votre aide

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 106 internautes ce mois-ci

Commenter la réponse de leguedin67
Messages postés
14289
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
14 décembre 2018
0
Merci
Hello,
Je déplace ta demande dans la section adéquate


@+
Buno, Admin CS
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Commenter la réponse de BunoCS
Messages postés
14010
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
0
Merci
Salut

Pour commencer, on va présenter le code correctement, sans quoi il est impossible/difficile de s'y retrouver / de le présenter pour donner envie de s'intéresser à ton problème.
Private Sub cmdNom_Click()
    Recherche.Hide
    ' pour effectuer une recherche avec un nom où prénom
    Dim Nom As String
    Nom = InputBox("Saisissez un nom", "Recherche par Nom :", "Tapez votre recherche")
    ColNom = 7 ' le numéro de la colonne Nom où Prénom du tableau
    Ligne = 4 ' numéro de la premiere ligne à lire
    ' boucle tant que la cellule Nom comporte quelque chose
    While Cells(Ligne, ColNom) <> ""
        ' premet de filtré suivant le nom où le prénom
        If InStr(1, LCase(Cells(Ligne, ColNom).Value), LCase(Nom)) = 0 Then
            Rows(Ligne).Select
            Selection.EntireRow.Hidden = True
        End If
        Ligne = Ligne + 1
    Wend ' fin boucle
End Sub

Instr n'a pas besoin de travailler avec LCase ou UCase : il suffit de lui dire de comparer du texte en ajoutant le paramètre final
If InStr(1, Cells(Ligne, ColNom).Value, Nom,vbTextCompare) = 0 Then

Actuellement, si la cellule ne comporte pas le nom, tu rends la ligne invisible : Il va donc falloir être sûr que la recherche ne donne rien dans toutes les colonnes d'une même ligne avant de décider de la rendre invisible.

While-Wend est obsolète : Utiliser Do While-Loop

Mieux vaut ne pas utiliser l'objet Selection dans les macros : Si quelqu'un clique quelque part pendant l'exécution, c'est le bug assuré.

Voilà le code 'corrigé' qui va aller faire la recherche sur les 30 colonnes à droite de celle du début.
Pense à rebalayer toutes tes données pour remettre à False le Hidden de tes lignes !
Private Sub cmdNom_Click()
    Recherche.Hide
    ' pour effectuer une recherche avec un nom où prénom
    Dim Nom As String
    Dim Ligne As Long
    Dim ColNom As Long
    Dim bFound As Boolean
    Dim oRange1 As Range
    Dim oRange2 As Range
    Nom = InputBox("Saisissez un nom", "Recherche par Nom :", "Tapez votre recherche")
    If Nom = "" Then Exit Sub ' au cas où
    ColNom = 7 ' le numéro de la colonne Nom où Prénom du tableau
    Ligne = 4 ' numéro de la premiere ligne à lire
    ' boucle tant que la cellule Nom comporte quelque chose
    For Each oRange1 In Range(Range("G7"), Range("G7").End(xlDown))
        bFound = False ' par défaut, pas encore trouvé
        For Each oRange2 In Range(oRange1, oRange1.Offset(0, 30))
            If InStr(1, oRange2.Text, Nom, vbTextCompare) <> 0 Then
                ' On a trouvé
                bFound = True
                Exit For
            End If
        Next oRange2
        If Not bFound Then Rows(oRange1).Hidden = True
    Next oRange1
End Sub

Rappel de la méthode de débogage :
- F9 sur une ligne de code; elle change de couleur
Le programme s'y arrêtera au prochain passage.
Lors de l'arrêt, survole avec la souris tes variables pour visualiser leur contenu, ou va dans la fenêtre de debogage (Ctrl-G) et tape
? maVariable
pour qu'elle s'inscrive dans la fenêtre.
- F8 (VB6) ou F10 (.Net) pour avancer d'une ligne de code
- F5 pour continuer normalement

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on le partage (Socrate)
Commenter la réponse de cs_Jack
Messages postés
14010
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
0
Merci
PS : C'est G4 et pas G7
Commenter la réponse de cs_Jack
Messages postés
14010
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
0
Merci
Ton programme recherche la première cellule vide pour stopper.
Normal donc qu'il ne se passe rien.
Tu peux éventuellement jumeler ce test de cellule vide avec un numéro de ligne au moins égal à 10 pour palier aux cellules vides en tête de liste (bricolage)
Commenter la réponse de cs_Jack
0
Merci
ok Jack est au pire des cas lui faire lire la colonne A qui comporte toujours du texte pour pouvoir effectuer le trie ! possible de faire comme ça ??

Si oui je suis preneur pour de l'aide ^^
Commenter la réponse de leguedin67
0
Merci
Je suis actuellement en mode test pour ma boite qui me demande de créer une listbox jusque la tout est ok ^^

Par contre je sais pas comment lui faire chercher ( VBA ) la colonne attibué c'est à dire de pas tapé en dur la colonne à afficher dans la listbox

voici mon code :

'**********************************************
' Pour les noms dans la colonne Problem Owner '
'**********************************************
    Worksheets("Feuil1").Activate 'à défaut d'instancier la feuille
    tablo = Range("e3:e" & Range("e" & Rows.Count).End(xlUp).Row).Value
    'tablo = [A2:DV2].Find(What:="Problem Owner", LookIn:=xlFormulas, LookAt:=xlWhole, SearchOrder:=xlByColumns).Column
    
'triAlphabétique
    For i = 1 To UBound(tablo)
        For j = 1 To UBound(tablo)
            If tablo(i, 1) < tablo(j, 1) Then
                Tempo = tablo(i, 1)
                tablo(i, 1) = tablo(j, 1)
                tablo(j, 1) = Tempo
            End If
        Next j
    Next i
'Remplissage excluant les doublons
    ListBoxDate.AddItem tablo(1, 1)
    For i = 2 To UBound(tablo)
        If tablo(i, 1) <> tablo(i - 1, 1) Then ListBoxDate.AddItem tablo(i, 1)
    Next


En gros je voudrais modifié cette ligne
tablo = Range("e3:e" & Range("e" & Rows.Count).End(xlUp).Row).Value
par
tablo = [A2:DV2].Find(What:="Problem Owner", LookIn:=xlFormulas, LookAt:=xlWhole, SearchOrder:=xlByColumns).Column
et la je suis encore entrain de galéré pour y arrivé

Je vous remercie à nouveau pour votre aide
Commenter la réponse de leguedin67
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Contributeur
Dernière intervention
11 avril 2018
0
Merci
Bonjour,
Déjà :
For i = 1 To UBound(tablo)
        For j =  1 To UBound(tablo)

met en exergue une incompréhension de ce que sont les limites (et comment elles s'expriment) d'un tableau dynamique à plusieurs dimensions !
Je refuse de corriger. Je veux te voir le faire toi-même après avoir consulté la rubrique Ubound dans ton aide VBA (fort claire et avec un exemple non moins clair)
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
Commenter la réponse de ucfoutu
0
Merci
J'ai passé toute la matinée de hier à trouver ma solution je suis allé même sur le site de Microsoft pour voir plus clair Ubound

Je suis toujours entrain de chercher ... je Veux aussi le trouver par moi même mais si cela dur un moment je reviendrai pour de l'aide alors
Commenter la réponse de leguedin67
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Contributeur
Dernière intervention
11 avril 2018
0
Merci
J'ai passé toute la matinée de hier à trouver ma solution je suis allé même sur le site de Microsoft pour voir plus clair Ubound

et moi, je viens d'ouvrir la rubrique Ubound, directement sur ma machine, dans l'aide VBA !
Et ne persiste et signe :
Je veux te voir le faire toi-même après avoir consulté la rubrique Ubound dans ton aide VBA (fort claire et avec un exemple non moins clair)

A moins que tu ne saches pas comprendre ce qui y est écrit en français !
Prends un bon café, réveille-toi ... ou laisse tout tomber
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
Commenter la réponse de ucfoutu
0
Merci
C'est bon le soucis est réglé !!!
En faite j'avais bien fait des modifications du genre Ubound(tablo,1) et ça na jamais fonctionné avec mon code mais le soucis venai plus haut j'ai du lui faire commprendre où il devait regarder pour trouver la bonne colonne
Commenter la réponse de leguedin67

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.