Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

problème de filtre par VBA

8 réponses
Avatar
Circé
Rebonjour,

Je sais qu'on se fait avoir lorsqu'on a besoin de connaître le nombre
de ligne après un filtre automatique en VBA, et en fait, malgré
plusieurs méthodes, je suis pas du tout sûre d'avoir pris la bonne.

J'ai besoin :
- soit d'afficher la feuille filtrée à condition qu'elle ait au moins
une ligne qui correspond au filtre
- soit de supprimer les lignes filtrées sans afficher la feuille

Voilà mon code qui me sert à compter :

With feuille
.Unprotect
.Range("A4").AutoFilter Field:=3, Criteria1:=critere, Operator:=xlOr,
Criteria2:=critere2, visibleDropDown:=False
End With

'compte le nb filtrés
Set rg = feuille.Range("D3:D" & Range("D" & Rows.Count).End(xlUp).Row)

nombre =
feuille.AutoFilter.Range.Columns(3).SpecialCells(xlCellTypeVisible).Cells.Count-1


sachant que mes entêtes de colonne sont en ligne 3.

Merci.
Circé
http://faqword.com

8 réponses

Avatar
Daniel.C
Essaie cà (non testé) :

With feuille
Set rg = .AutoFilter.Range.Columns(3).SpecialCells(xlCellTypeVisible)
If rg.Cells.Count - 1 > 0 Then
.Select
Else
.AutoFilter.Range.Columns(3).EntireRow.Delete
End If
End With

Daniel

Rebonjour,

Je sais qu'on se fait avoir lorsqu'on a besoin de connaître le nombre de
ligne après un filtre automatique en VBA, et en fait, malgré plusieurs
méthodes, je suis pas du tout sûre d'avoir pris la bonne.

J'ai besoin :
- soit d'afficher la feuille filtrée à condition qu'elle ait au moins une
ligne qui correspond au filtre
- soit de supprimer les lignes filtrées sans afficher la feuille

Voilà mon code qui me sert à compter :

With feuille
.Unprotect
.Range("A4").AutoFilter Field:=3, Criteria1:=critere, Operator:=xlOr,
Criteria2:=critere2, visibleDropDown:úlse
End With

'compte le nb filtrés
Set rg = feuille.Range("D3:D" & Range("D" & Rows.Count).End(xlUp).Row)

nombre =
feuille.AutoFilter.Range.Columns(3).SpecialCells(xlCellTypeVisible).Cells.Count-1


sachant que mes entêtes de colonne sont en ligne 3.

Merci.
Circé
http://faqword.com
Avatar
michdenis
Bonjour,

Cette procédure applique un filtre sur la colonne 3 sur
l'ensemble des données contenues dans la feuille

'---------------------------------------
Sub test()

Dim DerLig As Long, DerCol As Integer, NbEng As Long
Dim Critere As Variant, Critere2 As Variant, Champ As Integer

'************Variables à définir*****************
'No du Field où le filtre s'appliquera
Champ = 3
'La valeur des 2 critères
Critere = 1: Critere2 = 5
'**************************************************
With Feuille
.Unprotect
DerLig = .Cells.Find(What:="*", _
LookIn:=xlFormulas, _
SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious).Row
DerCol = .Cells.Find(What:="*", _
LookIn:=xlFormulas, _
SearchOrder:=xlByColumns, _
SearchDirection:=xlPrevious).Column

With .Range("A4", .Cells(DerLig, DerCol))
.AutoFilter Field:=Champ, Criteria1:=Critere, _
Operator:=xlOr, _
Criteria2:=Critere2, visibleDropDown:úlse
NbEng = Application.Subtotal(3, Range(.Columns(Champ).Address)) - 1
End With
End With
MsgBox NbEng & " enregistrements de trouver."
End Sub
'---------------------------------------
Avatar
michdenis
Si tu veux afficher la feuille si plus d'un enregistrement
J'ai oublié cette ligne de code ;

if enreg >1 then
Feuille.Select
end if

Si aucun enregistrement n'est trouvé, que veux-tu supprimer ?
C'est toute ta plage de données qui est masquée.
Je n'ai pas compris ta demande !




"michdenis" a écrit dans le message de groupe de discussion :

Bonjour,

Cette procédure applique un filtre sur la colonne 3 sur
l'ensemble des données contenues dans la feuille

'---------------------------------------
Sub test()

Dim DerLig As Long, DerCol As Integer, NbEng As Long
Dim Critere As Variant, Critere2 As Variant, Champ As Integer

'************Variables à définir*****************
'No du Field où le filtre s'appliquera
Champ = 3
'La valeur des 2 critères
Critere = 1: Critere2 = 5
'**************************************************
With Feuille
.Unprotect
DerLig = .Cells.Find(What:="*", _
LookIn:=xlFormulas, _
SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious).Row
DerCol = .Cells.Find(What:="*", _
LookIn:=xlFormulas, _
SearchOrder:=xlByColumns, _
SearchDirection:=xlPrevious).Column

With .Range("A4", .Cells(DerLig, DerCol))
.AutoFilter Field:=Champ, Criteria1:=Critere, _
Operator:=xlOr, _
Criteria2:=Critere2, visibleDropDown:úlse
NbEng = Application.Subtotal(3, Range(.Columns(Champ).Address)) - 1
End With
End With
MsgBox NbEng & " enregistrements de trouver."
End Sub
'---------------------------------------
Avatar
Circé
Bonjour,

J'étais sous la vague et je n'avais pas eu le temps de tester... Mais
c'est encore un truc que je ne comprends pas... Mon problème n'était
pas de supprimer ou non la ligne mais juste de connaître le nombre de
ligne trouvée après un filtre auto.

Cette fois, j'ai bien pris le temps de tout regarder et finalement mon
code est le seul à donner un résultat correct ! :D

A titre indicatif, j'ai testé tous les cas suivants :

- aucune donnée dans la base
- 1 ligne dans la base - 1 ligne trouvée
- pls lignes dans la base - pls (3) lignes trouvées"
- pls lignes dans la base - 1 ligne trouvée
- pls lignes dans la base - 0 ligne trouvée
- 1 ligne dans la base - 0 ligne trouvée

le code de michdenis donne : 0 0 2 0 0 -1
donc il ne faut pas ôter le 1

le code de Daniel donne : 1 2 4 2 1 1
donc il suffirait d'ôter 1 au nombre
le problème dans ca cas est que si on ne trouve rien, le code affiche 1
pas bien compris... :(

En fait, Daniel, tu utilises à peu près le même code que le mien sauf
que tu n'as pas déterminé la range avant... Et donc, je me rends compte
que mon Set Rg ne sert à rien !

OK, je considère mon problème résolu. Merci.
Circé
http://faqword.com
Avatar
michdenis
| Cette fois, j'ai bien pris le temps de tout regarder et finalement mon
| code est le seul à donner un résultat correct ! :D

Évidemment, dans mon code, j'ai utilisé A4 au lieu de A3
comme ligne d'en-tête, pas surprenant qu'on arrive pas au
même résultat.

'Ligne de code responsable !
With .Range("A4", .Cells(DerLig, DerCol))

Et j'ai ajouté la référence à la feuille "feuille", selon le module
où tu copies le code dans cette ligne de code :
NbEng = Application.Subtotal(3, feuille.Range(.Columns(Champ).Address)) - 1

L'important, c'est que tu as trouvé ce que tu cherchais.

;-)

Pour les archives, le code :

Sub test()

Dim DerLig As Long, DerCol As Integer, NbEng As Long
Dim Critere As Variant, Critere2 As Variant, Champ As Integer

'************Variables à définir*****************
'No du Field où le filtre s'appliquera
Champ = 1
'La valeur des 2 critères
Critere = 3: Critere2 = 5
'**************************************************
With feuille
.Unprotect
DerLig = .Cells.Find(What:="*", _
LookIn:=xlFormulas, _
SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious).Row
DerCol = .Cells.Find(What:="*", _
LookIn:=xlFormulas, _
SearchOrder:=xlByColumns, _
SearchDirection:=xlPrevious).Column

With .Range("A3", .Cells(DerLig, DerCol))
.AutoFilter Field:=Champ, Criteria1:=Critere, _
Operator:=xlOr, _
Criteria2:=Critere2, visibleDropDown:úlse
NbEng = Application.Subtotal(3, feuille.Range(.Columns(Champ).Address)) - 1
End With
End With
MsgBox NbEng & " enregistrements de trouver."
End Sub
'---------------------------------------
Avatar
Circé
Je me suis un peu emberlificotée les pinceaux avec ce post !

Parce que pour le code de Daniel, il suffit effectivement d'ôter 1 et
c'est bon.

donc la phrase "le problème dans ce cas est que si on ne trouve rien,
le code affiche 1
pas bien compris... "

était pour ton code, MichDenis.
Je viens de réessayer avec tes corrections, mais ce n'est pas mieux...
Pour une ligne trouvée, je trouve -1...
Bon, comme tu dis, le principal est que mon souci soit réglé...

Par contre, j'aime bien ta façon de compter les colonnes et comme c'est
quelque chose que j'utilise beaucoup, je conserve bien au chaud dans
mes nombreuses archives.

Circé
http://faqword.com


michdenis a pensé très fort :
Cette fois, j'ai bien pris le temps de tout regarder et finalement mon
code est le seul à donner un résultat correct ! :D



Évidemment, dans mon code, j'ai utilisé A4 au lieu de A3
comme ligne d'en-tête, pas surprenant qu'on arrive pas au
même résultat.

'Ligne de code responsable !
With .Range("A4", .Cells(DerLig, DerCol))

Et j'ai ajouté la référence à la feuille "feuille", selon le module
où tu copies le code dans cette ligne de code :
NbEng = Application.Subtotal(3, feuille.Range(.Columns(Champ).Address)) - 1

L'important, c'est que tu as trouvé ce que tu cherchais.

;-)

Pour les archives, le code :

Sub test()

Dim DerLig As Long, DerCol As Integer, NbEng As Long
Dim Critere As Variant, Critere2 As Variant, Champ As Integer

'************Variables à définir*****************
'No du Field où le filtre s'appliquera
Champ = 1
'La valeur des 2 critères
Critere = 3: Critere2 = 5
'**************************************************
With feuille
.Unprotect
DerLig = .Cells.Find(What:="*", _
LookIn:=xlFormulas, _
SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious).Row
DerCol = .Cells.Find(What:="*", _
LookIn:=xlFormulas, _
SearchOrder:=xlByColumns, _
SearchDirection:=xlPrevious).Column

With .Range("A3", .Cells(DerLig, DerCol))
.AutoFilter Field:=Champ, Criteria1:=Critere, _
Operator:=xlOr, _
Criteria2:=Critere2, visibleDropDown:úlse
NbEng = Application.Subtotal(3,
feuille.Range(.Columns(Champ).Address)) - 1 End With
End With
MsgBox NbEng & " enregistrements de trouver."
End Sub
'---------------------------------------
Avatar
michdenis
Un fichier exemple : http://cjoint.com/?eqpyucH5iR



"Circé" a écrit dans le message de groupe de discussion :

Je me suis un peu emberlificotée les pinceaux avec ce post !

Parce que pour le code de Daniel, il suffit effectivement d'ôter 1 et
c'est bon.

donc la phrase "le problème dans ce cas est que si on ne trouve rien,
le code affiche 1
pas bien compris... "

était pour ton code, MichDenis.
Je viens de réessayer avec tes corrections, mais ce n'est pas mieux...
Pour une ligne trouvée, je trouve -1...
Bon, comme tu dis, le principal est que mon souci soit réglé...

Par contre, j'aime bien ta façon de compter les colonnes et comme c'est
quelque chose que j'utilise beaucoup, je conserve bien au chaud dans
mes nombreuses archives.

Circé
http://faqword.com


michdenis a pensé très fort :
Cette fois, j'ai bien pris le temps de tout regarder et finalement mon
code est le seul à donner un résultat correct ! :D



Évidemment, dans mon code, j'ai utilisé A4 au lieu de A3
comme ligne d'en-tête, pas surprenant qu'on arrive pas au
même résultat.

'Ligne de code responsable !
With .Range("A4", .Cells(DerLig, DerCol))

Et j'ai ajouté la référence à la feuille "feuille", selon le module
où tu copies le code dans cette ligne de code :
NbEng = Application.Subtotal(3, feuille.Range(.Columns(Champ).Address)) - 1

L'important, c'est que tu as trouvé ce que tu cherchais.

;-)

Pour les archives, le code :

Sub test()

Dim DerLig As Long, DerCol As Integer, NbEng As Long
Dim Critere As Variant, Critere2 As Variant, Champ As Integer

'************Variables à définir*****************
'No du Field où le filtre s'appliquera
Champ = 1
'La valeur des 2 critères
Critere = 3: Critere2 = 5
'**************************************************
With feuille
.Unprotect
DerLig = .Cells.Find(What:="*", _
LookIn:=xlFormulas, _
SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious).Row
DerCol = .Cells.Find(What:="*", _
LookIn:=xlFormulas, _
SearchOrder:=xlByColumns, _
SearchDirection:=xlPrevious).Column

With .Range("A3", .Cells(DerLig, DerCol))
.AutoFilter Field:=Champ, Criteria1:=Critere, _
Operator:=xlOr, _
Criteria2:=Critere2, visibleDropDown:úlse
NbEng = Application.Subtotal(3,
feuille.Range(.Columns(Champ).Address)) - 1 End With
End With
MsgBox NbEng & " enregistrements de trouver."
End Sub
'---------------------------------------
Avatar
Circé
Ah cette fois ça y est !!! C'est du solide, ça marche...

Parce que, entre temps, j'ai réessayé mon code, et il y a avait encore
des cas où le résultat était mauvais...

Mon dossier d'archives grossit aujourd'hui !!! ;))

Merci encore et à bientôt probablement,
Circé

michdenis a formulé ce vendredi :
Un fichier exemple : http://cjoint.com/?eqpyucH5iR



"Circé" a écrit dans le message de groupe de discussion :

Je me suis un peu emberlificotée les pinceaux avec ce post !

Parce que pour le code de Daniel, il suffit effectivement d'ôter 1 et
c'est bon.

donc la phrase "le problème dans ce cas est que si on ne trouve rien,
le code affiche 1
pas bien compris... "

était pour ton code, MichDenis.
Je viens de réessayer avec tes corrections, mais ce n'est pas mieux...
Pour une ligne trouvée, je trouve -1...
Bon, comme tu dis, le principal est que mon souci soit réglé...

Par contre, j'aime bien ta façon de compter les colonnes et comme c'est
quelque chose que j'utilise beaucoup, je conserve bien au chaud dans
mes nombreuses archives.

Circé
http://faqword.com


michdenis a pensé très fort :
Cette fois, j'ai bien pris le temps de tout regarder et finalement mon
code est le seul à donner un résultat correct ! :D



Évidemment, dans mon code, j'ai utilisé A4 au lieu de A3
comme ligne d'en-tête, pas surprenant qu'on arrive pas au
même résultat.

'Ligne de code responsable !
With .Range("A4", .Cells(DerLig, DerCol))

Et j'ai ajouté la référence à la feuille "feuille", selon le module
où tu copies le code dans cette ligne de code :
NbEng = Application.Subtotal(3, feuille.Range(.Columns(Champ).Address)) - 1

L'important, c'est que tu as trouvé ce que tu cherchais.

;-)

Pour les archives, le code :

Sub test()

Dim DerLig As Long, DerCol As Integer, NbEng As Long
Dim Critere As Variant, Critere2 As Variant, Champ As Integer

'************Variables à définir*****************
'No du Field où le filtre s'appliquera
Champ = 1
'La valeur des 2 critères
Critere = 3: Critere2 = 5
'**************************************************
With feuille
.Unprotect
DerLig = .Cells.Find(What:="*", _
LookIn:=xlFormulas, _
SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious).Row
DerCol = .Cells.Find(What:="*", _
LookIn:=xlFormulas, _
SearchOrder:=xlByColumns, _
SearchDirection:=xlPrevious).Column

With .Range("A3", .Cells(DerLig, DerCol))
.AutoFilter Field:=Champ, Criteria1:=Critere, _
Operator:=xlOr, _
Criteria2:=Critere2, visibleDropDown:úlse
NbEng = Application.Subtotal(3,
feuille.Range(.Columns(Champ).Address)) - 1 End With
End With
MsgBox NbEng & " enregistrements de trouver."
End Sub
'---------------------------------------