OVH Cloud OVH Cloud

Cellules visibles

6 réponses
Avatar
anonymousA
Bonjour à tous,

J'ai un problème de compréhension du concept des cellules visibles vu par
Excel.

En effet, supposons que ma plage à filtrer soit contenue dans les cellules
allant de A1 à C17. Mes titres sont evidemment sur les cellules A1 à C1.
Je fais un filtre automatique

Puis je déclare une procédure

Set plagevisible = Range("A1:C17").SpecialCells(xlCellTypeVisible)
MsgBox plagevisible.Count
For I = 1 To plagevisible.Count
plagevisible(I).Select
MsgBox plagevisible(I).Address
Next

Logiquement, je m'attends à obtenir les adresses des cellules visibles
seulement. Eh bien pas du tout. j'obtiens bien le bon nombre de cellules
visibles par plagevisible.count mais pas les bonnes adresses. En fait
j'obtiens toutes les adresses allant de $A$1 jusqu'à $?$? cette dernière
adresse étant celle de la cellule correspondant à
plagevisible(plagevisible.count)

Si par contre, j'écris la procédure précédente en changeant le Range de
A1:C17 en A2:C17, alors là ca marche.

Mais ce n'est pas fini. Si j'écris une procédure

Set plagevisible = Range("A1:C17").SpecialCells(xlCellTypeVisible)
MsgBox plagevisible.Count
For Each c In plagevisible
c.Select
MsgBox c.Address
Next

alors là ça fonctionne dans tous les cas. J'obtiens à la fois le bon nombre
de cellules visibles et les bonnes addresses.

L'un d'entre vous pourrait-il m'éclairer sur cette différence de traitement ?

Merci d'avance.

6 réponses

Avatar
michdenis
Bonjour anonymousA,

Je t'invite à lire sur le concept de "Areas" dans l'aide d'excel.

En fait, ta sélection suite à ton filtre n'est pas nécessairement une plage continue. Comme il y a des lignes vides, tu
te retrouves avec plusieurs "Areas" dans l'ensemble de ta plage. Tu dois donc boucler sur l'ensemble des "Areas"

Voici un petit exemple :

Set Rg = Range("_FilterDatabase).SpecialCells(xlCellTypeVisible)

Are = Chacune des plages discontinues
C = Chacune des cellules dans chacune des plages discontinues
For each Are in rg
For each C In are

Next
Next


Salutations!

"anonymousA" a écrit dans le message de news:

Bonjour à tous,

J'ai un problème de compréhension du concept des cellules visibles vu par
Excel.

En effet, supposons que ma plage à filtrer soit contenue dans les cellules
allant de A1 à C17. Mes titres sont evidemment sur les cellules A1 à C1.
Je fais un filtre automatique

Puis je déclare une procédure

Set plagevisible = Range("A1:C17").SpecialCells(xlCellTypeVisible)
MsgBox plagevisible.Count
For I = 1 To plagevisible.Count
plagevisible(I).Select
MsgBox plagevisible(I).Address
Next

Logiquement, je m'attends à obtenir les adresses des cellules visibles
seulement. Eh bien pas du tout. j'obtiens bien le bon nombre de cellules
visibles par plagevisible.count mais pas les bonnes adresses. En fait
j'obtiens toutes les adresses allant de $A$1 jusqu'à $?$? cette dernière
adresse étant celle de la cellule correspondant à
plagevisible(plagevisible.count)

Si par contre, j'écris la procédure précédente en changeant le Range de
A1:C17 en A2:C17, alors là ca marche.

Mais ce n'est pas fini. Si j'écris une procédure

Set plagevisible = Range("A1:C17").SpecialCells(xlCellTypeVisible)
MsgBox plagevisible.Count
For Each c In plagevisible
c.Select
MsgBox c.Address
Next

alors là ça fonctionne dans tous les cas. J'obtiens à la fois le bon nombre
de cellules visibles et les bonnes addresses.

L'un d'entre vous pourrait-il m'éclairer sur cette différence de traitement ?

Merci d'avance.
Avatar
docm
Bonjour anonymousA.

Seule la formulation
For Each c In plagevisible
fait référence uniquement aux cellules faisant partie de plagevisible.

Les autres formulations font référence à toute la feuille.
La formulation plagevisible.range("E1").address
fait référence à toute la feuille, mais en considérant que la cellule "A1"
correspond à la première cellule de plagevisible et non pas à la cellule
"A1" de la feuille.

La formulation plagevisible(3000).address
fait référence à toute la feuille mais en ne considérant que les colonnes
faisant partie de plagevisible.

Sous toutes réserves.

"anonymousA" wrote in message
news:
Bonjour à tous,

J'ai un problème de compréhension du concept des cellules visibles vu par
Excel.

En effet, supposons que ma plage à filtrer soit contenue dans les cellules
allant de A1 à C17. Mes titres sont evidemment sur les cellules A1 à C1.
Je fais un filtre automatique

Puis je déclare une procédure

Set plagevisible = Range("A1:C17").SpecialCells(xlCellTypeVisible)
MsgBox plagevisible.Count
For I = 1 To plagevisible.Count
plagevisible(I).Select
MsgBox plagevisible(I).Address
Next

Logiquement, je m'attends à obtenir les adresses des cellules visibles
seulement. Eh bien pas du tout. j'obtiens bien le bon nombre de cellules
visibles par plagevisible.count mais pas les bonnes adresses. En fait
j'obtiens toutes les adresses allant de $A$1 jusqu'à $?$? cette dernière
adresse étant celle de la cellule correspondant à
plagevisible(plagevisible.count)

Si par contre, j'écris la procédure précédente en changeant le Range de
A1:C17 en A2:C17, alors là ca marche.

Mais ce n'est pas fini. Si j'écris une procédure

Set plagevisible = Range("A1:C17").SpecialCells(xlCellTypeVisible)
MsgBox plagevisible.Count
For Each c In plagevisible
c.Select
MsgBox c.Address
Next

alors là ça fonctionne dans tous les cas. J'obtiens à la fois le bon
nombre

de cellules visibles et les bonnes addresses.

L'un d'entre vous pourrait-il m'éclairer sur cette différence de
traitement ?


Merci d'avance.


Avatar
anonymousA
je vous remercie tous les 2 de votre réponse. Et j'en profite pour faire un
réponse commune.

Pour mich denis, je vois bien ce que tu entends quand tu parles d'Areas et
suis entièrement d'accord sur l'aspect non contigu des plages de cellules.
Ceci dit , dans ce cas , comment expliquer que la procédure for each c in
plagevisible fonctionne (j'ai essayé pour voir) sans jamais faire mention
d'Areas ?

Pour docm, je n'ai pas réussi à reproduire p.e
plagevisible.range("E1").address car VBA se plante en raison de
l'incompatibilité de plagevisible avec la propriété .range.adress.
Par ailleurs quand je la déclare, la définition de plagevisible fait bien
référence aux seules cellules visibles de la plage (A1:C17) non ?

Merci de vos réponses


Bonjour à tous,

J'ai un problème de compréhension du concept des cellules visibles vu par
Excel.

En effet, supposons que ma plage à filtrer soit contenue dans les cellules
allant de A1 à C17. Mes titres sont evidemment sur les cellules A1 à C1.
Je fais un filtre automatique

Puis je déclare une procédure

Set plagevisible = Range("A1:C17").SpecialCells(xlCellTypeVisible)
MsgBox plagevisible.Count
For I = 1 To plagevisible.Count
plagevisible(I).Select
MsgBox plagevisible(I).Address
Next

Logiquement, je m'attends à obtenir les adresses des cellules visibles
seulement. Eh bien pas du tout. j'obtiens bien le bon nombre de cellules
visibles par plagevisible.count mais pas les bonnes adresses. En fait
j'obtiens toutes les adresses allant de $A$1 jusqu'à $?$? cette dernière
adresse étant celle de la cellule correspondant à
plagevisible(plagevisible.count)

Si par contre, j'écris la procédure précédente en changeant le Range de
A1:C17 en A2:C17, alors là ca marche.

Mais ce n'est pas fini. Si j'écris une procédure

Set plagevisible = Range("A1:C17").SpecialCells(xlCellTypeVisible)
MsgBox plagevisible.Count
For Each c In plagevisible
c.Select
MsgBox c.Address
Next

alors là ça fonctionne dans tous les cas. J'obtiens à la fois le bon nombre
de cellules visibles et les bonnes addresses.

L'un d'entre vous pourrait-il m'éclairer sur cette différence de traitement ?

Merci d'avance.


Avatar
docm

Pour docm, je n'ai pas réussi à reproduire p.e
plagevisible.range("E1").address car VBA se plante en raison de
l'incompatibilité de plagevisible avec la propriété .range.adress.


address prend s'écrit avec 2 "d" en anglais.

Par ailleurs quand je la déclare, la définition de plagevisible fait bien
référence aux seules cellules visibles de la plage (A1:C17) non ?


Relire mes explications qui illustrent que plagevisible fait référence à
plus que les cellules visibles, selon la formulation utilisée.

La syntaxe suivante ne cause aucune erreur chez moi:

Sub tt3()
Set plagevisible = Range("A1:C17").SpecialCells(xlCellTypeVisible)
For I = 1 To plagevisible.Count
a = plagevisible(I).Address
b = plagevisible.Range("E1").Address
Next

End Sub

Avatar
anonymousA
oups, j'ai effectivement raté un "d".
j'ai essayé ta procédure.
elle donne le résultat effectivement que plagevisible contient autre chose
que les cellulles visibles ce que j'avais bien constaté mais que je ne
m'explique pas car plagevisible.count donne toujours le bon nombre de
cellules visibles.
En te relisant attentivement, je ne suis pas sur d'avoir bien compris ton
argumentation dans le message précédent.
Un peu d'aide est le bienvenu. Merci encore





Pour docm, je n'ai pas réussi à reproduire p.e
plagevisible.range("E1").address car VBA se plante en raison de
l'incompatibilité de plagevisible avec la propriété .range.adress.


address prend s'écrit avec 2 "d" en anglais.

Par ailleurs quand je la déclare, la définition de plagevisible fait bien
référence aux seules cellules visibles de la plage (A1:C17) non ?


Relire mes explications qui illustrent que plagevisible fait référence à
plus que les cellules visibles, selon la formulation utilisée.

La syntaxe suivante ne cause aucune erreur chez moi:

Sub tt3()
Set plagevisible = Range("A1:C17").SpecialCells(xlCellTypeVisible)
For I = 1 To plagevisible.Count
a = plagevisible(I).Address
b = plagevisible.Range("E1").Address
Next

End Sub








Avatar
anonymousA
Bon, ca y est j'ai trouvé.

En fait ca marche quand on utilise la procédure for each c in plagevisible
sans se préoccuper des areas car par défaut Excel détecte qu'il y des plages
non contigues et ne s'interesse du coup qu'aux cellules que ces fameuses
plages contiennent.
Par contre ca ne marche pas quand on fait référence à plagevisible (I) sans
précaution car dans ce cas bien qu'Excel soit capable de détecter qu'il ya
plusieurs zones non contigues et d'en donner le nombre de cellules les
composant ( cf propriété précédénte), il n'est pas en mesure de séparer de la
collection les cellules intermédiaires aux zones non contigues. Pour ce
faire, il faut se mettre à utiliser les Areas et écrire la procédure suivante
qui elle fonctionne

Dim plagevisible As Range

Set plagevisible = Range("A1:C17").SpecialCells(xlCellTypeVisible)
MsgBox plagevisible.Count

For J = 1 To plagevisible.Areas.Count
For I = 1 To plagevisible.Areas(J).Cells.Count
MsgBox plagevisible.Areas(J).Cells(I).Address
Next
Next

Magie d'Excel !!.

Merci à tous pour vos contributions et à bientot.


Bonjour à tous,

J'ai un problème de compréhension du concept des cellules visibles vu par
Excel.

En effet, supposons que ma plage à filtrer soit contenue dans les cellules
allant de A1 à C17. Mes titres sont evidemment sur les cellules A1 à C1.
Je fais un filtre automatique

Puis je déclare une procédure

Set plagevisible = Range("A1:C17").SpecialCells(xlCellTypeVisible)
MsgBox plagevisible.Count
For I = 1 To plagevisible.Count
plagevisible(I).Select
MsgBox plagevisible(I).Address
Next

Logiquement, je m'attends à obtenir les adresses des cellules visibles
seulement. Eh bien pas du tout. j'obtiens bien le bon nombre de cellules
visibles par plagevisible.count mais pas les bonnes adresses. En fait
j'obtiens toutes les adresses allant de $A$1 jusqu'à $?$? cette dernière
adresse étant celle de la cellule correspondant à
plagevisible(plagevisible.count)

Si par contre, j'écris la procédure précédente en changeant le Range de
A1:C17 en A2:C17, alors là ca marche.

Mais ce n'est pas fini. Si j'écris une procédure

Set plagevisible = Range("A1:C17").SpecialCells(xlCellTypeVisible)
MsgBox plagevisible.Count
For Each c In plagevisible
c.Select
MsgBox c.Address
Next

alors là ça fonctionne dans tous les cas. J'obtiens à la fois le bon nombre
de cellules visibles et les bonnes addresses.

L'un d'entre vous pourrait-il m'éclairer sur cette différence de traitement ?

Merci d'avance.