Cellules visibles après un filtre automatique en VBA

Le
olivier
Bonjour,



J'aimerai comprendre pourquoi avec la macro ci-dessous quand je mets un
critère de recherche sur une colonne, dans mon cas la colonne A, avec un
filtre automatique et que le résultat trouve rien, ma macro m'indique un
nombre de cellules visibles de plus 1670000 au lieu de 0 cellules visibles
comme je l'espérais . Le problème se pose uniquement dans ce cas sinon elle
fonctionne correctement si on peut dire.


Je ne souhaite pas une autre solution de votre part mais j'aimerai
comprendre mon erreur avant tout sur cette macro. Merci pour ceux qui m'ont
apporté une autre solution mais ce n'est pas ce que je souhaite aujourd'hui.


Merci d'avance pour votre aide.


Sub CellulesVisibles()
'
' Permet de savoir le nombre de cellules visibles suite au filtre
automatique
'

Dim Rng As Object

Dim NumRowsFiltre As Long

Set Rng = ActiveSheet.Range("A1:A" & Range("A" & Rows.Count).End(xlUp).Row)
NumRowsFiltre = Rng.SpecialCells(xlVisible).Count - 1

MsgBox "Il y a :" & NumRowsFiltre & " cellule(s) de visbile(s)"

Set Rng = Nothing

End Sub
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
gmlsteph
Le #18581151
Bonjour,

16777216
c'est 256*65536 soit le nombre de cellules de la feuille.
C'est ce qui est considéré lorsque rng ne correspond plus à rien du
fait que tout est masqué
car si rng compte au moins 1 ligne non masquée ça fonctionne
c'est bien rng dont le count est effectué.

Pourquoi c'est ainsi, c'est une autre histoire...

Cordialement.

--
lSteph
On 4 fév, 17:33, "olivier"
Bonjour,

    J'aimerai comprendre pourquoi avec la macro ci-dessous quand je m ets un
critère de recherche sur une colonne, dans mon cas la colonne A, avec u n
filtre automatique et que le résultat  trouve rien, ma macro m'indiqu e un
nombre de cellules visibles de plus 1670000 au lieu de 0 cellules visible s
comme je l'espérais . Le problème se pose uniquement dans ce cas sino n elle
fonctionne correctement si on peut dire.

    Je ne souhaite pas une autre solution de votre part mais j'aimera i
comprendre mon erreur avant tout sur cette macro. Merci pour ceux qui m'o nt
apporté une autre solution mais ce n'est pas ce que je souhaite aujourd 'hui.

Merci d'avance pour votre aide.

Sub CellulesVisibles()
'
' Permet de savoir le nombre de cellules visibles suite au filtre
automatique
'

Dim Rng As Object

Dim NumRowsFiltre As Long

Set Rng = ActiveSheet.Range("A1:A" & Range("A" & Rows.Count).End(xlUp). Row)
NumRowsFiltre = Rng.SpecialCells(xlVisible).Count - 1

MsgBox "Il y a :" & NumRowsFiltre & "  cellule(s) de visbile(s)"

Set Rng = Nothing

End Sub


michdenis
Le #18581861
Set Rng = ActiveSheet.Range("A1:A" & Range("A" & Rows.Count).End(xlUp).Row)
NumRowsFiltre = Rng.SpecialCells(xlVisible).Count - 1
***L'étendue de toute ta variable Rng est représentée par la première
cellule A1 jusqu'à la dernière cellule Ax
***Comme tu n'as pas d'enregistrement visible sur ta plage de données
Range("A1:A").....) se trouve à représenter toute la colonne A:A et en plus
tu demandes de retourner toutes les cellules visibles (une sorte d'union
entre A1:A65536 et toutes les cellules visibles)

Il t'aurait suffi d'écrire :
Set Rng = ActiveSheet.Range("A1:A" & Range("A" &
Rows.Count).End(xlUp).Row).SpecialCells(xlVisible)
NumRowsFiltre = Rng.Rows.Count - 1

Et là ça fait toute la différence ! ;-))
Non seulement tu limites l'étendue de la variable Rng à A1:Ax mais explicitement
aux cellules visibles de cette plage... c'est très "différent" de ton autre syntaxe !

seulement le nombre de cellules visibles dans ta plage Rng
tu as cette opportunité :
Msgbox ActiveSheet.AutoFilter.Range.SpecialCells(xlVisible).Count - 1

Tu pourrais aussi utiliser :
ActiveSheet.Range("_FilterDataBase").SpecialCells(xlVisible).Count
("_FilterDataBase") est une plage nommée qu'excel crée au moment de
l'exécution du filtre de toute la plage sur laquelle le filtre prenait place.
Cette plage nommée est redéfini à chaque fois que le filtre est exécuté.

Ce nom "_FilterDatBase" n'est pas visible par l'interface de calcul, mais
exécute cette ligne de code et tu va le voir !
'------------------------------
For Each n In ActiveWorkbook.Names
MsgBox n.Name
Next
'-------------------------------
En VBA, tu peux créer un nom et le rendre non visible, regarde les
paramètres de "Add" dans Names.ADD...

Ou
Msgbox application.subtotal(.......)





NumRowsFiltre = Rng.SpecialCells(xlVisible).Count - 1




"olivier" 4989c359$0$4085$
Bonjour,



J'aimerai comprendre pourquoi avec la macro ci-dessous quand je mets un
critère de recherche sur une colonne, dans mon cas la colonne A, avec un
filtre automatique et que le résultat trouve rien, ma macro m'indique un
nombre de cellules visibles de plus 1670000 au lieu de 0 cellules visibles
comme je l'espérais . Le problème se pose uniquement dans ce cas sinon elle
fonctionne correctement si on peut dire.


Je ne souhaite pas une autre solution de votre part mais j'aimerai
comprendre mon erreur avant tout sur cette macro. Merci pour ceux qui m'ont
apporté une autre solution mais ce n'est pas ce que je souhaite aujourd'hui.


Merci d'avance pour votre aide.


Sub CellulesVisibles()
'
' Permet de savoir le nombre de cellules visibles suite au filtre
automatique
'

Dim Rng As Object

Dim NumRowsFiltre As Long

Set Rng = ActiveSheet.Range("A1:A" & Range("A" & Rows.Count).End(xlUp).Row)
NumRowsFiltre = Rng.SpecialCells(xlVisible).Count - 1

MsgBox "Il y a :" & NumRowsFiltre & " cellule(s) de visbile(s)"

Set Rng = Nothing

End Sub
olivier
Le #18582361
Merci pour votre aide.


"michdenis"
Set Rng = ActiveSheet.Range("A1:A" & Range("A" &
Rows.Count).End(xlUp).Row)
NumRowsFiltre = Rng.SpecialCells(xlVisible).Count - 1
***L'étendue de toute ta variable Rng est représentée par la première
cellule A1 jusqu'à la dernière cellule Ax
***Comme tu n'as pas d'enregistrement visible sur ta plage de données
Range("A1:A").....) se trouve à représenter toute la colonne A:A et en
plus
tu demandes de retourner toutes les cellules visibles (une sorte d'union
entre A1:A65536 et toutes les cellules visibles)

Il t'aurait suffi d'écrire :
Set Rng = ActiveSheet.Range("A1:A" & Range("A" &
Rows.Count).End(xlUp).Row).SpecialCells(xlVisible)
NumRowsFiltre = Rng.Rows.Count - 1

Et là ça fait toute la différence ! ;-))
Non seulement tu limites l'étendue de la variable Rng à A1:Ax mais
explicitement
aux cellules visibles de cette plage... c'est très "différent" de ton
autre syntaxe !

seulement le nombre de cellules visibles dans ta plage Rng
tu as cette opportunité :
Msgbox ActiveSheet.AutoFilter.Range.SpecialCells(xlVisible).Count - 1

Tu pourrais aussi utiliser :
ActiveSheet.Range("_FilterDataBase").SpecialCells(xlVisible).Count
("_FilterDataBase") est une plage nommée qu'excel crée au moment de
l'exécution du filtre de toute la plage sur laquelle le filtre prenait
place.
Cette plage nommée est redéfini à chaque fois que le filtre est exécuté.

Ce nom "_FilterDatBase" n'est pas visible par l'interface de calcul, mais
exécute cette ligne de code et tu va le voir !
'------------------------------
For Each n In ActiveWorkbook.Names
MsgBox n.Name
Next
'-------------------------------
En VBA, tu peux créer un nom et le rendre non visible, regarde les
paramètres de "Add" dans Names.ADD...

Ou
Msgbox application.subtotal(.......)





NumRowsFiltre = Rng.SpecialCells(xlVisible).Count - 1




"olivier" discussion :
4989c359$0$4085$
Bonjour,



J'aimerai comprendre pourquoi avec la macro ci-dessous quand je mets un
critère de recherche sur une colonne, dans mon cas la colonne A, avec un
filtre automatique et que le résultat trouve rien, ma macro m'indique un
nombre de cellules visibles de plus 1670000 au lieu de 0 cellules visibles
comme je l'espérais . Le problème se pose uniquement dans ce cas sinon
elle
fonctionne correctement si on peut dire.


Je ne souhaite pas une autre solution de votre part mais j'aimerai
comprendre mon erreur avant tout sur cette macro. Merci pour ceux qui
m'ont
apporté une autre solution mais ce n'est pas ce que je souhaite
aujourd'hui.


Merci d'avance pour votre aide.


Sub CellulesVisibles()
'
' Permet de savoir le nombre de cellules visibles suite au filtre
automatique
'

Dim Rng As Object

Dim NumRowsFiltre As Long

Set Rng = ActiveSheet.Range("A1:A" & Range("A" &
Rows.Count).End(xlUp).Row)
NumRowsFiltre = Rng.SpecialCells(xlVisible).Count - 1

MsgBox "Il y a :" & NumRowsFiltre & " cellule(s) de visbile(s)"

Set Rng = Nothing

End Sub



michdenis
Le #18583881
Et sur la raison du pourquoi pour que ce soit plus clair...
dans la fenêtre de l'éditeur de code, tu ouvres la fenêtre
"Exécution" par le raccourci clavier Ctrl + G
et tu transforme ton code ainsi :
'-----------------------------
Set rng = ActiveSheet.Range("A1:A" & Range("A" & Rows.Count).End(xlUp).Row)
Debug.Print rng.Address
NumRowsFiltre = rng.SpecialCells(xlVisible).Count - 1
Debug.Print rng.Address
'-----------------------------
Dans la fenêtre Exécution, on va inscrire le résultat des Debug.Print

Si le filtre avait 1 enregistrement en A4
Rng.Address = Range("A1:A4")
Si le filtre a 0 enregistrement répondant au critère
Rng.Address = $1:$1,$10:$65536 en supposant
que ta plage intiale du filtre était de A1:A9

Ce qui devient problématique, c'est SpecialCells(xlVisible) qui fait
référence aux cellules, tu aurais pu simplement écrire :
NumRowsFiltre = rng.SpecialCells(xlVisible).Rows.Count - 1
et tu aurais eu le bon résultat.



"michdenis" news:
Set Rng = ActiveSheet.Range("A1:A" & Range("A" &
Rows.Count).End(xlUp).Row)
NumRowsFiltre = Rng.SpecialCells(xlVisible).Count - 1
***L'étendue de toute ta variable Rng est représentée par la première
cellule A1 jusqu'à la dernière cellule Ax
***Comme tu n'as pas d'enregistrement visible sur ta plage de données
Range("A1:A").....) se trouve à représenter toute la colonne A:A et en
plus
tu demandes de retourner toutes les cellules visibles (une sorte d'union
entre A1:A65536 et toutes les cellules visibles)

Il t'aurait suffi d'écrire :
Set Rng = ActiveSheet.Range("A1:A" & Range("A" &
Rows.Count).End(xlUp).Row).SpecialCells(xlVisible)
NumRowsFiltre = Rng.Rows.Count - 1

Et là ça fait toute la différence ! ;-))
Non seulement tu limites l'étendue de la variable Rng à A1:Ax mais
explicitement
aux cellules visibles de cette plage... c'est très "différent" de ton
autre syntaxe !

seulement le nombre de cellules visibles dans ta plage Rng
tu as cette opportunité :
Msgbox ActiveSheet.AutoFilter.Range.SpecialCells(xlVisible).Count - 1

Tu pourrais aussi utiliser :
ActiveSheet.Range("_FilterDataBase").SpecialCells(xlVisible).Count
("_FilterDataBase") est une plage nommée qu'excel crée au moment de
l'exécution du filtre de toute la plage sur laquelle le filtre prenait
place.
Cette plage nommée est redéfini à chaque fois que le filtre est exécuté.

Ce nom "_FilterDatBase" n'est pas visible par l'interface de calcul, mais
exécute cette ligne de code et tu va le voir !
'------------------------------
For Each n In ActiveWorkbook.Names
MsgBox n.Name
Next
'-------------------------------
En VBA, tu peux créer un nom et le rendre non visible, regarde les
paramètres de "Add" dans Names.ADD...

Ou
Msgbox application.subtotal(.......)





NumRowsFiltre = Rng.SpecialCells(xlVisible).Count - 1




"olivier" discussion :
4989c359$0$4085$
Bonjour,



J'aimerai comprendre pourquoi avec la macro ci-dessous quand je mets un
critère de recherche sur une colonne, dans mon cas la colonne A, avec un
filtre automatique et que le résultat trouve rien, ma macro m'indique un
nombre de cellules visibles de plus 1670000 au lieu de 0 cellules visibles
comme je l'espérais . Le problème se pose uniquement dans ce cas sinon
elle
fonctionne correctement si on peut dire.


Je ne souhaite pas une autre solution de votre part mais j'aimerai
comprendre mon erreur avant tout sur cette macro. Merci pour ceux qui
m'ont
apporté une autre solution mais ce n'est pas ce que je souhaite
aujourd'hui.


Merci d'avance pour votre aide.


Sub CellulesVisibles()
'
' Permet de savoir le nombre de cellules visibles suite au filtre
automatique
'

Dim Rng As Object

Dim NumRowsFiltre As Long

Set Rng = ActiveSheet.Range("A1:A" & Range("A" &
Rows.Count).End(xlUp).Row)
NumRowsFiltre = Rng.SpecialCells(xlVisible).Count - 1

MsgBox "Il y a :" & NumRowsFiltre & " cellule(s) de visbile(s)"

Set Rng = Nothing

End Sub



Daniel.C
Le #18583161
> Il t'aurait suffi d'écrire :
Set Rng = ActiveSheet.Range("A1:A" & Range("A" &
Rows.Count).End(xlUp).Row).SpecialCells(xlVisible)
NumRowsFiltre = Rng.Rows.Count - 1



Bonsoir Denis.
J'ai un problème avec ton code. je pense qu'il ne résoud pas le
problème (au moins avec XL2007); car, si le résultat est juste quand il
n'y a rien de sélectionné, il peut être faux s'il y a plusieurs lignes
non sélectionnées discontinues; essaie, avec aucune sélection :

Set Rng = ActiveSheet.Range("A1:A" & Range("A" &
Rows.Count).End(xlUp).Row).SpecialCells(xlVisible)
MsgBox Rng.Address
MsgBox Rng.Cells.Count
Rng.Select
NumRowsFiltre = Rng.Areas(2).Rows.Count

De plus, XL2007 ne peut pas afficher le nombre de cellules de sa
feuille, tellement il y en a !
Cordialement.
Daniel
michdenis
Le #18588811
Effectivement, si la plage n'est pas triée, le ".Row" crée
des "areas" et le résultat retourné n'est pas celui attendu.

D'ailleurs, il eut été plus sage d'inscrire ceci
NumRowsFiltre = rng.SpecialCells(xlVisible).Count - 1
puisque la propriété "Cells" est attribué à la plage par défaut.

Merci d'avoir soulevé cette coquille.


"Daniel.C"
Il t'aurait suffi d'écrire :
Set Rng = ActiveSheet.Range("A1:A" & Range("A" &
Rows.Count).End(xlUp).Row).SpecialCells(xlVisible)
NumRowsFiltre = Rng.Rows.Count - 1



Bonsoir Denis.
J'ai un problème avec ton code. je pense qu'il ne résoud pas le
problème (au moins avec XL2007); car, si le résultat est juste quand il
n'y a rien de sélectionné, il peut être faux s'il y a plusieurs lignes
non sélectionnées discontinues; essaie, avec aucune sélection :

Set Rng = ActiveSheet.Range("A1:A" & Range("A" &
Rows.Count).End(xlUp).Row).SpecialCells(xlVisible)
MsgBox Rng.Address
MsgBox Rng.Cells.Count
Rng.Select
NumRowsFiltre = Rng.Areas(2).Rows.Count

De plus, XL2007 ne peut pas afficher le nombre de cellules de sa
feuille, tellement il y en a !
Cordialement.
Daniel
Publicité
Poster une réponse
Anonyme