Rechercher : dans
Par :

Excel et VBA : opérations sur les Ranges

Dernière réponse le 19 mar 2009 à 17:10:28 Florian, le 19 mar 2009 à 12:51:57 
 Signaler ce message aux modérateurs

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

Configuration: Windows XP Pro
Pack Office 2003
Firefox 3.0.7

1

 Florian, le 19 mar 2009 à 17:10:28

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

Répondre à Florian