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

Cellules visibles après un filtre automatique en VBA

6 réponses
Avatar
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

6 réponses

Avatar
gmlsteph
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" wrote:
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


Avatar
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" a écrit dans le message de groupe de 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
Avatar
olivier
Merci pour votre aide.


"michdenis" a écrit dans le message de 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" a écrit dans le message de groupe de
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



Avatar
michdenis
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" a écrit dans le message de
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" a écrit dans le message de groupe de
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



Avatar
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
Avatar
michdenis
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" a écrit dans le message de groupe de discussion :

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