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 Sub

code 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 continue de mon côté à cherche la solution.

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 Sub

Bonsoir 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

Rechercher des sujets similaires à "optimiser entirerow hidden"