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 SubCa 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
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 SubBonsoir 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 Submais 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 SubJ'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 SubC'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 ThenPrivate 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 SubVoici une nouvelle version pouvant masquer le dernier groupe
sur le module1
Public LastRowsur le ThisWorkbook
Private Sub Workbook_Open()
LastRow = Sheets("Feuil1").Cells(Rows.Count, 1).End(xlUp).Row
End Subsur 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Ça fonctionne vraiment bien, un grand merci à vous deux pour l'aide