Rows(target.row.....).Hidden

Bonjour à tous,

Ce petit bout de code permet de montrer/cacher des bloques de 9 lignes en partant de la condition suivant : Si le contenu de la cellule cliquée est égale à A1 et faisant partie de la colonne 1 cacher les lignes +1:9.

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

  If Target = Range("A1") Then
    Application.ScreenUpdating = True
    Cancel = True
    Rows(Target.Row + 1 & ":" & Target.Row + 9).Hidden = Not Rows(Target.Row + 1).Hidden
  End If

End Sub

Ca fonctionne bien quand le nombre de lignes à cacher est fixe, mais j'aimerais l'adapter sans trop le massacrer pour qu'il ferme les lignes jusqu'à ce qu'il trouve le contenu de a1 plus bas dans la colonne ce qui permettrait d'avoir des bloques de lignes variables en nombre comme dans la feuille 2 du fichier simplifier que je vous ai soumis.

Je ne vous demande pas de me donner le code tout fait, mais une piste de réflexion si vous voulez bien, je vous remercie

35forum-r5.xlsm (14.41 Ko)

Bonsoir,

Cela reste plus rapide à écrire qu'à expliquer (et il n'y a pas d'explications particulière à ajouter, un petit examen du code suffit...)

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    Dim i%, n%, nn%
    If Target = Me.Range("A1") Then
        n = Target.Row + 1: i = 1
        Do Until Me.Range("A" & n + i + 1) = Me.Range("A1")
            i = i + 1
            If i = 100 Then Exit Do
        Loop
        If i < 100 Then
            nn = n + i
            Me.Rows(n & ":" & nn).Hidden = Not Me.Rows(n).Hidden
        End If
        Cancel = True
    End If
End Sub

Ca fonction vraiment bien, cependant, je laisse ce topic non solutionné le temps que j'étudie ton code pour le comprendre et j'aurai probablement une ou deux questions en rapport à celui-ci. Du temps de bonzail64 je faisais ca aussi si je comprenais pas.

L'autre fois Eriic m'avait donné une partie du code et j'avais du écrire le reste ca m'avait fait réfléchir.

Merci MFerrand je reviens avec ton code commenté pour voir si j'ai bien tout capté.

Bonjour,

il faudrait prévoir une valeur Asc = 63 en fin de tableau

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
n = Range("A:A").Find(What:=Target, After:=Cells(Target.Row + 1, 1), LookIn:=xlFormulas, LookAt:=xlWhole).Row
Application.ScreenUpdating = False
  If Target.Column = 1 And Asc(Target) = 63 Then
    If Rows(Target.Row + 1 & ":" & n - 1).EntireRow.Hidden Then
      Rows(Target.Row + 1 & ":" & n - 1).EntireRow.Hidden = False
    Else
      Rows(Target.Row + 1 & ":" & n - 1).EntireRow.Hidden = True
    End If
  End If
Application.ScreenUpdating = True
Cancel = True
End Sub

Bonsoir sabV,

J'ai prévu la chose... mais autrement !

Bonjour MFerrand,

j'avais aussi pensé comme ceci,

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Dim n As Long, plg As Range
n = Range("A:A").Find(What:=Target, After:=Cells(Target.Row + 1, 1), LookIn:=xlFormulas, LookAt:=xlWhole).Row
Set plg = Rows(Target.Row + 1 & ":" & n - 1)
  If Target.Column = 1 And Asc(Target) = 63 Then
    If plg.EntireRow.Hidden Then
      plg.EntireRow.Hidden = False
    Else
      plg.EntireRow.Hidden = True
    End If
  End If
Cancel = True
End Sub

mais là vous m'intriguez, allez dites-moi!

Simple : la dernière cellule marquée identiquement à A1 en A marque la fin... Le double-clic restera sans effet.

Ce qui laisse le tableau évolutif, si on ajoute une marque plus bas, elle deviendra la dernière et le double-clic aura un effet désormais sur la précédente...

Cordialement.

ok je comprend, alors un petit plus,

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
n = Range("A:A").Find(What:=Target, After:=Cells(Target.Row + 1, 1), LookIn:=xlFormulas, LookAt:=xlWhole).Row
LastRow = Cells(Rows.Count, 1).End(xlUp).Row
  If Target.Column = 1 And Asc(Target) = 63 And Target.Row <> LastRow Then
    If Rows(Target.Row + 1 & ":" & n - 1).EntireRow.Hidden Then
      Rows(Target.Row + 1 & ":" & n - 1).EntireRow.Hidden = False
    Else
      Rows(Target.Row + 1 & ":" & n - 1).EntireRow.Hidden = True
    End If
  End If
Cancel = True
End Sub

J'ai joué avec les variables pour tenter de comprendre le raisonnement.

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    Dim i%, n%, nn%

    If Target = Me.Range("A1") Then

    'me. veut dire ici la feuille active. Si la cellule cliqué est égale au contenu A1

        n = Target.Row + 1
        ' n égale à la ligne ciblée incrémenté de 1

        i = 1

        Do Until Me.Range("A" & n + i + 1) = Me.Range("A1")
            i = i + 1
            If i = 100 Then Exit Do
        Loop

        'Rechercher par incrémentation de 1 à 100 maximum la prochaine cellule contenant A1
        ' Si I est égal à 100 repartir en boucle

        If i < 100 Then
            nn = n + i
            Me.Rows(n & ":" & nn).Hidden = Not Me.Rows(n).Hidden
        End If

        'Si i est inférieur à 100, (la prochaine cellule contenant A1 a été trouvée avant 100)
        'Masquer et demasquer (= not me.....) les lignes de n (target.row+ 1) à mn(étant additionné du nombre de lignes accumulé dans la variable i)

        Cancel = True
    End If
End Sub

C'est comme ça que je le lis , est-ce correct ?

@sabV

... If Target.Column = 1 And Asc(Target) = 63 And Target.Row <> LastRow Then...

rechercher ASC=63, ça fonctionne très bien aussi merci

Re,

Un petit complément : Me désigne toujours dans un module d'objet l'objet auquel est dédié le module (il ne peut s'utiliser dans un module standard), ici donc c'est la feuille correspondant au module (feuille active au départ, puisque l'évènement est issu de la feuille, mais si elle cessait de l'être Me désignerait toujours cette même feuille).

100 est un nombre arbitrairement choisi, supérieur au nombre de lignes maxi que tu es susceptible de masquer/démasquer. Si ce nombre devait atteindre ou dépasser 100 tu pourras l'augmenter en conséquence pour qu'il reste supérieur...

Comme je l'ai dit tout à l'heure si tu rajoutes des balises de masquage/démasquage, elles fonctionneront sans rien changer...

Le Cancel = True reste dans la première condition If de façon que tu n'aies pas d'édition de la cellule dans une balise.

Cordialement.

Bonjour variable,

est-ce que l'une des colonnes contient une valeur sur la dernière ligne ?

c'est à dire, selon les couleurs la dernière ligne serait 44, il y a t'il une valeur dans une des cellules de ligne 44 ?

rechercher ASC=63, ça fonctionne très bien aussi merci

Je m'en méfie ! 63 est le code du point d'interrogation ( ? ) et curieusement j'ai vu à plusieurs reprises renvoyer ce code par des signes graphiques divers...

rechercher ASC=63, ça fonctionne très bien aussi

oui avec cette modification,

If Target.Column = 1 And Asc(Target) = 63 And n <> 1 Then
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
n = Range("A:A").Find(What:=Target, After:=Cells(Target.Row + 1, 1), LookIn:=xlFormulas, LookAt:=xlWhole).Row
  If Target.Column = 1 And Asc(Target) = 63 And n <> 1 Then
    If Rows(Target.Row + 1 & ":" & n - 1).EntireRow.Hidden Then
      Rows(Target.Row + 1 & ":" & n - 1).EntireRow.Hidden = False
    Else
      Rows(Target.Row + 1 & ":" & n - 1).EntireRow.Hidden = True
    End If
  End If
Cancel = True
End Sub

Voici une nouvelle version pouvant masquer le dernier groupe

sur le module1

Public LastRow

sur le ThisWorkbook

Private Sub Workbook_Open()
LastRow = Sheets("Feuil1").Cells(Rows.Count, 1).End(xlUp).Row
End Sub

sur le code de la page "Feuil1"

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
n = Range("A:A").Find(What:=Target, After:=Cells(Target.Row + 1, 1), LookIn:=xlFormulas, LookAt:=xlWhole).Row
  If n = 1 Then
    If Rows(Target.Row + 1 & ":" & LastRow).EntireRow.Hidden Then
      Rows(Target.Row + 1 & ":" & LastRow).EntireRow.Hidden = False
    Else
      LastRow = Cells(Rows.Count, 1).End(xlUp).Row
      Rows(Target.Row + 1 & ":" & LastRow).EntireRow.Hidden = True
    End If
  End If

  If Target.Column = 1 And Asc(Target) = 63 And n <> 1 Then
    If Rows(Target.Row + 1 & ":" & n - 1).EntireRow.Hidden Then
      Rows(Target.Row + 1 & ":" & n - 1).EntireRow.Hidden = False
    Else
      Rows(Target.Row + 1 & ":" & n - 1).EntireRow.Hidden = True
    End If
  End If
Cancel = True
End Sub

Bonjour MFerrand & sabV,

...Me désigne toujours dans un module d'objet l'objet auquel est dédié le module (il ne peut s'utiliser dans un module standard),..

J'ai pense avoir compris le principe, de plus ca rend le code plus lisible au lieu de taper le nom de l'objet à chaque fois, c'est implicite comprit comme étant l'objet dans lequel le code s’exécute et ici l'objet c'est la feuille, ca peut aussi être un bouton, un userform, ... sauf un module standard (non attaché à un objet feuille, bouton, userform....)

est-ce que l'une des colonnes contient une valeur sur la dernière ligne ?

c'est à dire, selon les couleurs la dernière ligne serait 44, il y a t'il une valeur dans une des cellules de ligne 44 ?

@sabV : est-ce que l'une des colonnes contient une valeur sur la dernière ligne ?

c'est à dire, selon les couleurs la dernière ligne serait 44, il y a t'il une valeur dans une des cellules de ligne 44 ?

Pour le moment non, mais ca risque de l'être quand je vais remplir les bloques de data.

Maintenant au lieu de se référer au code ascii 63 au risque que plusieurs symboles renvoient le même comme l'a dit MFerrand, il est peut être plus intéressant de rechercher une couleur de fond spécifique à la cellule en question :

   Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    n = Range("A:A").Find(What:=Target, After:=Cells(Target.Row + 1, 1), LookIn:=xlFormulas, LookAt:=xlWhole).Row
      If Target.Column = 1 And Target.Interior.Color = RGB(226, 226, 226) And n <> 1 Then 
        If Rows(Target.Row + 1 & ":" & n - 1).EntireRow.Hidden Then
          Rows(Target.Row + 1 & ":" & n - 1).EntireRow.Hidden = False
        Else
          Rows(Target.Row + 1 & ":" & n - 1).EntireRow.Hidden = True
        End If
      End If
    Cancel = True
    End Sub

34forum-r5.xlsm (15.20 Ko)

Ça fonctionne vraiment bien, un grand merci à vous deux pour l'aide

Rechercher des sujets similaires à "rows target row hidden"