Optimiser plusieurs EntireRow.Hidden
Bonsoir,
Mon classeur devenant de plus en plus lourd au fur et à mesure que j'ajoute du code dedans, je cherche à éliminer certaines redondances.
J'ai une forte redondance de if Rows("X:Y").EntireRow.Hidden = True/false dans l'interface originale de mon classeur qui permet de cacher/montrer 10 sous actions de 10 actions, ca fait un long code qui ralenti inutilement l'éxécution.
J'ai refais le bout de code pour que ce soit plus propre, je cherche à écrire en une seule boucle l'ouverture et fermeture
des cellules boutons et avec for next ca le fait mais toutes en même temps et je ne vois pas la bonne boucle à utiliser pour en gros écrire ceci en une seule fois genre :
Le vrai code présent dans la feuille :
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Dim axe_y As Integer
If Not Application.Intersect(Target, Range("A2")) Is Nothing Then
Application.ScreenUpdating = False
'-----------------------------------------------------------------------------
If Rows("3:6").EntireRow.Hidden = True Then
For axe_y = 3 To 6
Cells(axe_y, 1).EntireRow.Hidden = False
Next axe_y
Else
For axe_y = 3 To 6
Cells(axe_y, 1).EntireRow.Hidden = True
Next axe_y
End If
Application.ScreenUpdating = True
Cancel = True
End If
'-----------------------------------------------------------------------------
If Not Application.Intersect(Target, Range("A7")) Is Nothing Then
Application.ScreenUpdating = False
If Rows("8:11").EntireRow.Hidden = True Then
For axe_y = 8 To 11
Cells(axe_y, 1).EntireRow.Hidden = False
Next axe_y
Else
For axe_y = 8 To 11
Cells(axe_y, 1).EntireRow.Hidden = True
Next axe_y
End If
Application.ScreenUpdating = True
Cancel = True
End If
'-----------------------------------------------------------------------------
End Subcode théorique
If Not Application.Intersect(Target, Range("A2, A7,A...")) Is Nothing Then
For...variable = x to y
If Rows("x:y").EntireRow.Hidden = True Then
For axe_y = x To y
Cells(axe_y, 1).EntireRow.Hidden = False
Next axe_y
Else
For axe_y = x To y
Cells(axe_y, 1).EntireRow.Hidden = True
Next axe_y
End If
Next...
End if
Ce code écrit pour de vrai ouvre et ferme tous les boutons d'un coup et c'est logique vous me direz.
Merci d'avance pour la lecture de ce post.
Je joins le fichier ▼
Bonsoir
Pour simplifier ton code
Attention c'est la cellule A2 qui sert de référence
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
If Target.Column = 1 And Target = Range("A2") Then
Application.ScreenUpdating = False
Cancel = True
Rows(Target.Row + 1 & ":" & Target.Row + 4).Hidden = Not Rows(Target.Row + 1).Hidden
End If
End SubBonsoir Banzai64,
Ca c'est de l'optimisation
J'ai joins le fichier modifié avec ce code sur 10 lignes et non plus sur 4, ll marche super bien mais c'est étrange il permet d'ajouter autant de boutons sans modifier le code.? Je rêve ?
Je ne comprends comment c'est possible :
If Target.Column = 1 And Target = Range("A2") Then Si la cible est la colonne 1 et la cible range est a2 OK
Rows(Target.Row + 1 & ":" & Target.Row + 10).Hidden = Not Rows(Target.Row + 1).Hidden'Cibler la ligne en dessous de A2(+1) ":" jusqu'à ligne 10 qui sont cachées, NOT, Effectue une négation logique,...
Oui mais il est capable de répéter cette action toutes les 11 lignes sans que je comprenne comment
Bonsoir
L'explication est compliquée mais la réalisation est très simple
Lors du double clic on vérifie
Si on est dans la colonne 1 Target.Column = 1
C'est la partie suivante qui peut prêter à confusion
Si la cellule est égale à A2 ( Si le contenu de la cellule cliquée est égal au contenu de la cellule A2) Target = Range("A2")
Ne pas interpréter : La cellule cliquée EST la cellule A2
Cette vérification est valable pour n'importe quelle cellule de la colonne A, pourvue qu'elle contienne la même chose que la cellule A2
Ensuite on vérifie la ligne suivante Rows(Target.Row + 1).Hidden
On inverse le résultat Not
On masque/démasque les lignes Rows(Target.Row + 1 & ":" & Target.Row + 4).Hidden =
On remet tout dans l'ordre ce qui donne
Rows(Target.Row + 1 & ":" & Target.Row + 4).Hidden = Not Rows(Target.Row + 1).Hidden
Au fait tu as renvoyé le même fichier
J'ai édité le précédant post.
Alors là je suis ému et bluffé.
La magie s'opère au niveau du contenu de la cellule cible et ce sur toute la colonne ^^
Je l'ai testé en apostrophant : Cancel = True pour pouvoir rééditer les cellules au double clique.
Effectivement, il y avait une réaction des cellules si le contenu était comme celui de Range("A2")donc "▼▲" partout en A:A
1. Rows(Target.Row + 1).Hidden
2. Not
3. Rows(Target.Row + 1 & ":" & Target.Row + 10).Hidden
Cette partie du code est fort aussi, pas deif, elseif, else, end if.... juste Not pour inverser...
EDIT : Oui enfin si en début et fin de code, je me suis emballé sur le moment.
J'ai compris, va falloir que je le test dans des conditions différentes pour bien saisir toute la portée de
ce raisonnement qui va me faire gagner un temps précieux et fortement alléger mon code
Un très très grand merci Banzai64
Variable