Excel et VBA : opérations sur les Ranges

Fermé
Florian - 19 mars 2009 à 12:51
 Florian69 - 25 mars 2010 à 19:32
Bonjour,

Je souhaite masquer mes tableaux sur Excel (en utilisant VBA) de la manière suivante :
- Si toutes les cellules d'une colonne du tableau sont nulles alors je masque tous le tableau,
- Sinon je masque uniquement la ligne de la cellule qui est nulle (ça j'y arrive).

En VBA ça donne ça :

...
Private Sub CommandButton1_Click()
Dim plage As Range, c As Range, i As Integer
Set plage = Union([E9:E86], [E90:E128], [E275:E404])
i = 0
For Each c In plage
If c.Value = "0" Then
c.EntireRow.Hidden = True
i = i + 1
If i >= ((86 - 9) + 1) Then
[E8:E8].EntireRow.Hidden = True
[E7:E7].EntireRow.Hidden = True
Else
[E8:E8].EntireRow.Hidden = False
[E7:E7].EntireRow.Hidden = False
End If
Else
c.EntireRow.Hidden = False
End If
Next c
End Sub
...

Chaque tableau se compose de X lignes, ici vous pouvez voir qu'il y en a 3 :

([E9:E86], [E90:E128], [E275:E404])

Ces tableaux commencent respectivement à la ligne 7 (9 - 2, 2 lignes pour les titres du tableau) jusqu'à la ligne 86.
______________________________________
ligne 7 : Titre
ligne 8 : Titre
ligne 9 : Donnée (nulle ou non)
...
...
...
ligne 86 : Donnée (dernière ligne du tableau)
______________________________________

Le deuxième tableau de la ligne 88 jusqu'à la ligne 128 et enfin le troisième de la ligne 273 jusqu'à la ligne 404.

i compte ici le nombre de cellules du tableau qui sont nulles.
Si toutes les lignes du tableau sont nulles, alors je masque les 2 dernières lignes qui correspondent aux titres :

[E8:E8].EntireRow.Hidden = True
[E7:E7].EntireRow.Hidden = True

Sinon je masque uniquement la ligne dont la cellule EX est nulle.


Pour l'instant, j'arrive à masquer entièrement que mon premier tableau, avec cette partie du code :
[...]
i = i + 1
If i >= ((86 - 9) + 1) Then
[E8:E8].EntireRow.Hidden = True
[E7:E7].EntireRow.Hidden = True
Else
[E8:E8].EntireRow.Hidden = False
[E7:E7].EntireRow.Hidden = False
End If

[...]

Mais pour les 2 autres tableaux (et + à venir) je n'y arrive pas !!

Comment écrire cette partie du code pour qu'il traite tous les tableaux qui se trouvent dans mon Range "plage" sachant qu'ils ont toujours la même forme, c'est à dire 2 lignes pour les titres ?

En espérant avoir écrit quelque chose de compréhensible !

Merci d'avance,

Florian
A voir également:

2 réponses

naturel45 Messages postés 3 Date d'inscription jeudi 6 septembre 2007 Statut Membre Dernière intervention 24 mars 2010 1
24 mars 2010 à 23:25
Bonjour Florian,
il est, parait-il, jamais trop tard.

Dim MaPlage as Range

set MaPlage = Union([E9:E86], [E90:E128], [E275:E404])
'pour exploiter la nouvelle plage

debug.print MaPlage.Areas.Count ' =3
debug.print MaPlage.Areas(2).Row ' =90 num de la 1ère ligne
debug.print Maplage.Areas(2).Rows.Count ' = 39 donc dernière = 90 + 39 - 1
'idem pour les colonnes

j' espère que tu avais trouvé par ailleurs.

Laurent
1
Bonjour Laurent,

Je te remercie d'avoir prit le temps de lire mon message.
En effet j'ai trouvé une "solution" en utilisant la fonction filtre d'Excel.
Grâce à cela, je peux maquer les lignes où les cellules sont nulles. Les 2 lignes de titre ne sont, par-contre, jamais supprimées via cette méthode, ce qui ne me gène pas au final.

Je garde ce code de coté, il pourrait m'être utile dans le futur.

Encore merci,

Florian
0
Re,

Je viens rajouter quelques précisions pour être plus explicite.

Il y a 3 choses que je n'arrive pas à faire en fait :

- Pouvoir sélectionner le n ième Range dans Union (par un compteur par exemple), Est-ce possible ?
Par exemple je veux sélectionner le 3ième range de cette ligne :
plage = Union([E9:E86], [E90:E128], [E275:E404])

Je pourrais l'utiliser directement avec un For Each c in Range(E275:E404)

- Comment sélectionner la ligne de la première et de la dernière cellule du Range sélectionné dans Union ?
Par exemple je souhaite sélectionner le numéro de la ligne de la première cellule du "deuxième Range" :
plage = Union([E9:E86], [E90:E128], [E275:E404])

Ici le résultat serait : numéro de ligne = 90.

- Est-ce bien cela pour connaître le nombre de ligne comprit dans un Range ?
c.Rows.Count

qui remplace ((86 - 9) + 1) dans mon code ci-dessus.

Merci !

Florian
0