Excel et VBA : opérations sur les Ranges
Florian
-
Florian69 -
Florian69 -
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
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:
- Excel et VBA : opérations sur les Ranges
- Word et excel gratuit - Guide
- Liste déroulante excel - Guide
- Si et excel - Guide
- Déplacer colonne excel - Guide
- Excel compter cellule couleur sans vba - Guide
2 réponses
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
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
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
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
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