Filtre multi champ en VBA

Bonjour A tous.

Je cherche à afficher les filtrer les lignes d’une BDD contenant un mot situé n’importe où dans la plage de sélection. Exemple d’application : On veut filtrer les lignes contenant exclusivement des adresses mail qui ne sont pas inscrites toujours dans la même colonne.

Voici ma solution ci-dessous qui filtre le critère dans une seule colonne.

Sub FiltreMot()
' filtre un mot dans une seul colonne de la BDD

Dim texte As String, t As String
texte = InputBox("Saisir le mot à filtrer", "Filtre d'un Mot")
t = "=*" + texte + "*"
ActiveSheet.Range("$A$2:$I$500"). _
           AutoFilter Field:=1, Criteria1:=t

End Sub

Pourriez-vous m’aider à trouver une solution qui permette d’étendre ce filtre à un ensemble de colonnes ou a toute la plage de sélection.

Merci de votre aide.

Bonjour et bienvenue,

on peut filtrer avec une colonne temporaire supplémentaire

(avec formule NB.SI(...)

envoie un extrait du fichier pour régler la macro

Amicalement

Claude

Voici le fichier test pour mettre en place ma fonction.

le bouton "Filtre Mot" permet de sélection un mot et de lister les lignes de BD qui contiennent le mot dans la colonne A.

Je souhaite donc trouver toutes les lignes qui contiennent le mot quelque soit la colonne.

La macro s'appelle FiltreNom()

Merci pour votre aide

288vba-03.xlsm (34.86 Ko)

re,

Ton fichier en retour

Sub Filtre()
Dim texte As String, t As String
Dim Lg%
    Application.ScreenUpdating = False
    On Error Resume Next
        ActiveSheet.ShowAllData
    On Error GoTo 0
    Lg = Cells.Find("*", , , , xlByRows, xlPrevious).Row

    texte = InputBox("Saisir le mot à filtrer", "Filtre d'un Mot")
    Range("m1") = texte
    Range("n2:n" & Lg) = "=COUNTIF(a2:i2,""*""&$m$1&""*"")"

    Range("o2") = "=n2>0" 'critère
    Range("a1:n" & Lg).AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:= _
    Range("o1:o2"), Unique:=False
    Columns("n:o").Delete
    Application.Goto Range("a1"), Scroll:=True
End Sub
Sub AfficherTout()
    Application.ScreenUpdating = False
    On Error Resume Next
        ActiveSheet.ShowAllData
    On Error GoTo 0
    Range("m1").ClearContents
    Application.Goto Range("a1"), Scroll:=True
End Sub

à tester

Amicalement

Claude

Merci Claude pour le code que je cherche à comprendre.

Je n'ai pas précisé mais je suis novice en VBA.

J'ai une ancienne expérience de codage. Donc je cherche à comprendre le fonctionnement de ta macro pas à pas avec F8. Mon plus gros problème est de comprendre le mfonctionnement de AdvanceFilter et particulièrement de CriteriaRange

Si je veux pouvoir reproduire ce code et aller de l'avant il faut que je comprenne.

Voici des commentaires que j'ai rajouté en fonction de ce que j'ai compris.

Peux tu valider et les compléter

Merci d'avance.

Sub FiltreNom()

Dim texte As String, t As String

Dim Lg% ' Lg Interger

Application.ScreenUpdating = False '?

On Error Resume Next

ActiveSheet.ShowAllData '?

On Error GoTo 0

'Lg = nombre de ligne rempli

Lg = Cells.Find("*", , , , xlByRows, xlPrevious).Row '?

texte = InputBox("Saisir le mot à filtrer", "Filtre d'un Mot") 'saisie du texte à trié

Range("m1") = texte 'stock la chaine dans la cellule k1

'on remplit la colonne i à partir de i2 ; Chaque cellule contient le nb de fois que

'le texte k1 est détecté sur la ligne

Range("n2:n" & Lg) = "=COUNTIF(a2:i2,""*""&$m$1&""*"")" '?

Range("o2") = "=n2>0" 'critère stock dans la cellule l2

' Sur le tableau à partir de a1 jusqu'à la colonne i et sur Lg lignes

' on lance un filtre évolué qui affiche que les lignes dont le nb en i est >0

Range("a1:n" & Lg).AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:= _

Range("o1:o2"), Unique:=False

Columns("n:o").Delete

Application.Goto Range("a1"), Scroll:=True '?

End Sub

re,

avant de rentrer dans les explications, il faudrait déjà savoir

si le résultat est bien celui attendu !

en gros

il s'agit d'un filtre élaboré

j'utilise la colonne "N" pour ajouter la formule NB.SI

cette formule compte les occurrences du mot recherché de A à i

ensuite, je filtre cette colonne (>0), comme critère de filtre

mets une apostrophe devant cette ligne (à la fin), pour voir la formule (tu comprendras mieux)

'Columns("n:o").Delete

à noter que le langage VBA est en anglais, NB.SI s'écrit COUNTIF

Vois déjà çà

Claude

Bonjour

Ton aide m'est très utlie.

En premier cela marche très bien.

J'avais chercher à comprendre le fonctionnement de chaque ligne en utilisant le débugger. (Dans une autre vie j'avais travaillé avec Visual C)

J'ai à peu près identifié l'usage de chaque ligne sans pour autant tout comprendre. Par exemple, la programmation n'est pas classique. Est ce de l'orienté objet?

Je comprends aussi que VBA se programme en anglais. Je n'avais pas fait le rapprochement ente COUNTIF et NB.SI .

Ne sachant rien de VBA, j'apprends par mimétisme. J'ai créé des macros en enregistrant des séquences d'actions et j'étudie de code VBA généré. Cela me permet de reproduire des processus et de les adapter dans la mesure du possible. Toutefois je ne comprends pas vraiment pas la structure du code, surtout si c'est de l'orienté objet.

De plus je ne peux pas y passer tout mon temps. Je fais cela pour apprendre à utiliser Excel dans le cas particulier d'une BDD que je remplis dans le cadre de mon travail.

Merci pour tout et si tu as encore un peu de temps à me consacrer je veux bien comprendre comme ton code fonctionne.

Je vais avoir d'autres questions sur l'utilisation de VBA. Est ce que pour chaque question dont je n'aurais pas trouver de réponse à une première recherche perso, je dois poster un nouveau message?

Bonne Journée

Laurent

Bonjour,

Tentative d'explications des codes, voir feuille "Explications"

J'ai créé des macros en enregistrant des séquences d'actions et j'étudie de code VBA généré.

c'est la meilleure méthode pour démarrer, utilise aussi la touche F1 (aide) en te positionnant sur

un mot du code.

Je vais avoir d'autres questions sur l'utilisation de VBA. Est ce que pour chaque question dont je n'aurais pas trouver de réponse à une première recherche perso, je dois poster un nouveau message?

si c'est sur ce fichier, continue sur ce fil, sinon ouvre un nouveau poste.

Bonne journée

Claude

Merci pour les commentaires. Je ne comprends pas tout mais je progresse.

J'ai fait des essais de modifications. Mais je ne suis pas parvenu à faire fonctionner le code en prenant les deux premières lignes comme en tête.

En fait : N3= 1ère ligne sous les en-têtes

Comment faut il modifier le code en conséquence?

merci de ton aide

Laurent

re,

il ne peut y avoir qu'une seule ligne d'en-têtes

tu as du fusionner les cellules des lignes 1 et 2, non ?

dans ce cas la ligne d'en-tête est toujours en ligne 1

et la 1ère ligne sous les en-têtes reste la ligne 2

le code n'est donc pas à modifier

Range("o2") = "=n2>0" 'critère oK

Range("o2") = "=n3>0" 'critère serait Faux

sinon, envoie ce que tu as fait

Claude

Claude,

J'ai fais différents essais infructueux en faisant des décalages de cellules. Mais je ne comprends pas tout. Les tests ne marchent pas.

J'utilise les deux premières lignes comme en tête pour de positionner des boutons , des stats avec un double panel dont le premier reste toujours visible... Donc la BDD démarre à la ligne 3. Le filtre commençant à partir de la ligne 2 les boutons présents et les valeurs de stat se retrouvent en dessous. Ils sont illisibles.

Laurent

re,

Donc la BDD démarre à la ligne 3. Le filtre commençant à partir de la ligne 2

non ! je répète:

la BDD commence à la ligne d'en-têtes

le critère filtre commence à la ligne en dessous

régler la macro en conséquence

si les en-têtes sont en ligne 3

    Range("n4:n" & Lg) = "=COUNTIF(a4:i4,""*""&$m$1&""*"")"

    Range("o2") = "=n4>0" 'critère
    Range("a3:n" & Lg).AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:= _
    Range("o1:o2"), Unique:=False

l'emplacement du critère Range("o1:o2") est indépendant de la BDD

Claude

Les modif fonctionnent et n'altèrent pas l'entête de 2 lignes

Je prendrai plus tard le temps d'étudier les commentaires que tu m'as donné.

Merci pour ton aide

Laurent

Mon problème est résolu.

Merci Claude pour ton aide.

Ok, n'oublie pas la petite formalité

a resolu3

à une prochaine. Claude

Rechercher des sujets similaires à "filtre multi champ vba"