Cacher ou afficher diverses lignes d'une plage
Bonjour a vous,
Je suis nouveau dans la pratique du vba d'Excel, et je galère trop pour réaliser une macro.
Sans vouloir trop vous déranger j'aurais besoin d'un coup de main. La macro que j'ai faite touriine trop.
de plus mon âge n'arrange pas les choses .
Il serait très sympathique si une personne pouvait m'aider. le problème est ci joint.
Sub Click()
' Macro servant à masquer les lignes lorsque l'on clique sur le bouton
Sheets("Ligne A").Rows("30:32").EntireRow.Hidden = False 'on affiche les lignes 30 à 32
Sheets("Ligne A").Rows("42:44").EntireRow.Hidden = False 'on affiche les lignes 42 à 44
Sheets("Ligne A").Rows("49:53").EntireRow.Hidden = False 'on affiche les lignes 49 à 53
Sheets("Ligne A").Rows("54:57").EntireRow.Hidden = False 'on affiche les lignes 54 à 57
Sheets("Ligne A").Rows("62:65").EntireRow.Hidden = False 'on affiche les lignes 62 à 65
Sheets("Ligne A").Rows("69:74").EntireRow.Hidden = False 'on affiche les lignes 69 à 74
Sheets("Ligne A").Rows("70:76").EntireRow.Hidden = False 'on affiche les lignes 70 à 76
Sheets("Ligne A").Rows("77:81").EntireRow.Hidden = False 'on affiche les lignes 77 à 81
Sheets("Ligne A").Rows("82:86").EntireRow.Hidden = False 'on affiche les lignes 82 à 86
Sheets("Ligne A").Rows("53,76;81,86").EntireRow.Hidden = False 'on affiche les lignes 53,76,75,80,85 qui manquent
Sheets("Ligne A").Rows("52,69,75,80,85").EntireRow.Hidden = True
Sheets("Ligne A").Rows("88:217", 52, 69, 75, 80, 85).EntireRow.Hidden = True 'on masque les lignes 88 à 217 et 52,69, 75, 80, 85.
Sheets("Ligne A").Range("BT27") = "ATT" 'on indique le mode ATTention pour confirmer
' en fait il faut cacher toutes les lignes vierges en colonne ("C:S") de la plage ("A31:AG217")Sauf les lignes 32,44,51,53,56,57,64,65,74,76,79,81,84,86
End Sub
je remercie par avance la bonne âme qui va m'ôter l'aiguille de mon pied.
Merci
Bonsoir,
Ça m'a l'air un peu confus !
Tu dis : un bouton pour masquer des lignes !
Fais la liste de celles à masquer, uniquement, on saura que celles qui n'y sont pas ne sont pas à masquer !!
Et prend note que le code que tu mets dans un post se met entre balises Code (tu as un bouton Code pour ça au-dessus de la zone de rédaction). Et si le code est indenté, tu auras droit à un minimum de déférence !
Cordialement.
Bonjour,
Je suis extrêmement nul en VBA mais pour un besoin personnel j'avais cherché sur le net comment cacher des colonnes.
Le code que j'avais trouvé était le suivant :
Sub Module1Q1()
If Range("D1").EntireColumn.Hidden = True Then ' La colonne est deja cachée
Range("D1, E1, F1, G1, H1, I1, J1, K1, L1, M1, N1, O1, P1").EntireColumn.Hidden = False ' je les montre
Else
Range("D1, E1, F1, G1, H1, I1, J1, K1, L1, M1, N1, O1, P1").EntireColumn.Hidden = True ' je les cache
End If
End Sub
Il m'a suffit ensuite de créer un bouton et d'y attacher la macro en question.
Cela marche a merveille.
Peut-être que quelqu'un pourrait te donner un coup de main pour transposer le code en s'appliquant à des lignes et pas à des colonnes?
Bonne journée.
Bonjour Pincho
Ya vraiment rien à chercher !
C'est enfantin ! Mais il convient d'avoir une liste établie des lignes à masquer, sans autre considération sur des plages (ce sont des lignes qu'on masque, et une ligne masquée et toujours entièrement masquée, pas à moitié !) ou des lignes qu'on ne masque pas, ou des numéros incertains car apparaissant plusieurs fois...
Cordialement.
Bonsoir,
c'est plaisant de que deux personnes viennent a mon secours.
Je vous comprend, Mais si j'applique la solution de Pincho cela va faire lourd dans mon cas. Pour être plus simple, voici les lignes a cacher.
Les lignes de 1 à 29 sont apparentes et fixe.
les lignes qui doivent être cachées sont :
33, 34, 35, 36, 37, 38, 39, 40, 41.
45,46,47,48, 52 58,59,60,61 66,67,68,69, 75, 80, 85
Les lignes qui restent visible sont:
30, 31, 32,
42, 43, 44
49, 50, 51 et 53
54, 55, 56 ,57
62, 63, 64, 65
70, 71, 72, 73, 74 et 76
77, 78, 79 et 81
82,83,84 et 86
J'espère que vous comprenez ? ma 1ere macro ci-dessous marche ("""presque" "manque des lignes) , Mais elle rame, elle saccade.
Sub Click()
' Macro servant à masquer les lignes lorsque l'on clique sur le bouton
Sheets("Ligne A").Rows("30:32").EntireRow.Hidden = False 'on affiche les lignes 30 à 32
Sheets("Ligne A").Rows("42:44").EntireRow.Hidden = False 'on affiche les lignes 42 à 44
Sheets("Ligne A").Rows("49:53").EntireRow.Hidden = False 'on affiche les lignes 49 à 53
Sheets("Ligne A").Rows("54:57").EntireRow.Hidden = False 'on affiche les lignes 54 à 57
Sheets("Ligne A").Rows("62:65").EntireRow.Hidden = False 'on affiche les lignes 62 à 65
Sheets("Ligne A").Rows("69:74").EntireRow.Hidden = False 'on affiche les lignes 69 à 74
Sheets("Ligne A").Rows("70:76").EntireRow.Hidden = False 'on affiche les lignes 70 à 76
Sheets("Ligne A").Rows("77:81").EntireRow.Hidden = False 'on affiche les lignes 77 à 81
Sheets("Ligne A").Rows("82:86").EntireRow.Hidden = False 'on affiche les lignes 82 à 86
Sheets("Ligne A").Rows("88:217").EntireRow.Hidden = True 'on masque les lignes 88 à 217
Sheets("Ligne A").Range("BT27") = "ATT" 'on indique le mode ATTention pour confirmer
End Sub
merci de votre temps
Bonsoir,
Voilà pour masquer :
Sub MasquerLignes()
Dim lgn, i%
lgn = Array("33:41", "45:48", 52, "58:61", "66:69", 75, 80, 85)
Application.ScreenUpdating = False
With Worksheets("Ligne A")
.Rows.Hidden = False
For i = 0 To UBound(lgn)
.Rows(lgn(i)).Hidden = True
Next i
End With
End SubCordialement.
Merci MFerrand.
cela semble correspondre a mes attentes.
je teste demain soir.
Dans tout les cas , c'est vraiment sympa de donner de ton temps pour nous porter secours.
Cordialement.
Bonsoir MFerrand; bonsoir vous tous;
Ta macro marche a merveille. et je t'en remercie.
Je suis un vrai néophyte , mais j'aime comprendre pour apprendre. Et sans vouloir abuser, peux tu me dire si ma traduction de ta macro est juste, et sinon me la corriger stp.
Puis dans un second temps ...(ajouter une condition a ce code si ça ne te dérange pas trop).
Du genre :
Les lignes nommées de la macro se cache "oui" c'est parfait.... MAIS,( sauf si la ligne situé juste au dessus genre (n-1)n'est pas vide dans la cellule fusionner des colonne("C:H") !! pas facile a comprendre.
Ou alors dit dans ce style : condition si " sauf si la colonne C de la ligne -1 est différente de rien"
Et encore merci aux personnes " secouristes"
Sub PosteOMR()
Dim lgn, i% ' déclaration de la variable . % = Integer Numérique Nombre entier de -32'768 à 32'767. %
lgn = Array("33:41", "45:48", 52, "58:61", "66:69", 75, 80, 85, "88:227") ' liste de la condition ( i ) . ( Array ??)
Application.ScreenUpdating = False ' Mise à jour
With Worksheets("Ligne A") ' Avec la feuille ("Ligne A")
ActiveSheet.Unprotect ' déprotéger la feuille active
.Rows.Hidden = False 'les lignes cachées = faux. c'est les lignes non cachées
For i = 0 To UBound(lgn) 'Pour les lignes de la condition i, elles sont liées à la mesure 0
.Rows(lgn(i)).Hidden = True 'Les lignes de la condition i qui sont cachées c'est = vrai
Next i 'suivant la liste de la condition i
ActiveSheet.Protect 'Protéger la feuille active.
End With ' fin Avec
End Sub
Bonjour,
On va reprendre les explications, pour bien fixer les idées :
Dim lgn, i%On déclare effectivement une variable de type Integer, qui sera utilisée comme compteur de boucle, et une autre variable, non typée, donc de type Variant.
lgn = Array("33:41", "45:48", 52, "58:61", "66:69", 75, 80, 85, "88:227")Cette dernière variable, on l'initialise en lui affectant un tableau, au moyen de la fonction Array.
(Cette fonction renvoie les valeurs qu'on lui liste sous forme de tableau.)
Les valeurs mises en tableau sont les lignes ou groupes de lignes que l'on veut masquer.
lgn est maintenant un tableau de ces lignes ou groupes. On pourra les appeler par lgn(i), i étant l'indice de chaque valeur dans le tableau (0 à 8, il y a 9 valeurs).
Cette méthode est un moyen d'accéder par une boucle à des valeurs hétérogènes (qui ne sont pas consécutives, ni espacées régulièrement pour qu'un même incrément permette de passer de l'une à l'autre).
Application.ScreenUpdating = FalseCette commande bloque le rafraîchissement de l'écran durant l'exécution de la macro. Il faut l'utiliser lorsque l'exécution du code se traduira par une modification de l'affichage à l'écran. Cela permet une exécution très sensiblement plus rapide, et cela évite des sautillements de l'image qui peuvent ne pas être agréables. (Elle n'a aucune incidence évidemment si on opérait sur une feuille non visible à l'écran, mais s'agissant (probablement) de la feuille active, il convient de l'utiliser.)
With Worksheets("Ligne A")Cette ligne indique effectivement que l'on va opérer avec la feuille Ligne A, dans le code qui suit, jusqu'à ce que l'on rencontre une instruction End With. Cela signifie que l'on n'a plus à répéter le nom de la feuille pour y faire référence : un point devant .Cells ou .Range ou .Rows, ou toute autre propriété ou méthode de l'objet Worksheet suffit à indiquer qu'il s'agit de Worksheets("Ligne A").
Du point de vue écriture, on s'économise du texte en ayant un code précis dont toutes les expressions sont qualifiées. Mais ce n'est pas le seul avantage, VBA met la référence d'objet en mémoire, pour l'avoir en quelque sorte toujours sous la main, n'ayant pas à le chercher, le code s'exécute plus rapidement.
[barrer]ActiveSheet[/barrer].UnprotectCette ligne que tu as ajoutée va illustrer ce qu'on vient de dire : on déprotège la feuille, il s'agit de Ligne A (sinon pourquoi déprotégerait-on une feuille sur laquelle on n'intervient pas !), on écrit donc seulement .Unprotect précédé d'un point. Rajouter ActiveSheet rend à nouveau le code approximatif (et si la feuille active n'était plus la bonne !) et plus lent. Et même si on répétait Worksheets("Ligne A"), on perdrait le bénéfice induit par la mise en mémoire provoquée par With.
For i = 0 To UBound(lgn)On initilise une boucle de 0 à l'indice maximal du tableau lgn (qui est 8 ). On pouvait mettre 0 à 8, mais si on modifiait la liste des lignes à masquer en en ajoutant ou enlevant, il faudrait modifier ce 8. Là on n'a à toucher qu'à la liste dans la fonction Array, la boucle s'adaptera automatiquement.
.Rows(lgn(i)).Hidden = TrueA chaque tour de boucle cette commande s'exécutera, i ayant été augmenté de 1, lgn(i) désigne à chaque fois une ligne ou un groupe de lignes à masquer. Ce que l'on fait en mettant la propriété Hidden des lignes indiquées à True.
Next iRenvoie l'exécution au début de la boucle après avoir incrémenté le compteur i de 1 (ou du pas indiqué si l'on en indique un différent de 1). A l'issue du dernier tour, i est incrémenté mais sa valeur n'est plus dans la fourchette cadrée par l'instruction For x To y, et la boucle s'interrompt.
[barrer]ActiveSheet[/barrer].ProtectMême chose que pour Unprotect.
End With, déjà vu, met fin à la référence à la feuille...
Voilà pour les explications.
Pour ternir compte de ta nouvelle condition, on procède en deux temps :
Sub MasquerLignes()
Dim lgn, i%, j%, listLn$
lgn = Split("C33:C41 C45:C48 C52 C58:C61 C66:C69 C75 C80 C85")
With Worksheets("Ligne A")
.Unprotect
.Rows.Hidden = False
For i = 0 To UBound(lgn)
With .Range(lgn(i))
For j = 1 To .Rows.Count
If .Cells(j - 1, 1) = "" Then listLn = listLn & " " & .Cells(j, 1).Row
Next j
End With
Next i
lgn = Split(LTrim(listLn))
Application.ScreenUpdating = False
For i = 0 To UBound(lgn)
.Rows(lgn(i)).Hidden = True
Next i
.Protect
End With
End SubOn part des plages en C des lignes à supprimer. On teste dans un premier temps la cellule de ligne précédente pour valider on non la ligne au masquage et obtenir le tableaux définitif des lignes à supprimer...
Cordialement.
Bonjour MFerrand.
Comment dire…. Je suis scotché !!!!!!
La patience et le travail dont tu fais preuve me touchent vraiment. Sans chercher à te gonfler les chevilles ou te faire des courbettes,,,,, MERCI. Tu es de ces personnes qui apportent beaucoup aux autres, pas uniquement par le partage de la connaissance, mais aussi par la gentillesse.
Ceci dit ….J’ai tout compris
Pourrais-tu répondre à ma deuxième demande. Ajouter une condition à ton code :
En fait, ton code permet de cacher des lignes nommées. Mais à l’ouverture du classeur une 1ere ligne apparaitre seule afin de la remplir. Mais lorsque on remplit cette ligne dans la cellule qui fusionne les colonnes (C : H), la ligne suivante apparaît de manière à pouvoir la remplir si nécessaire. Ce que je voudrais, c’est que cette ligne vierge qui apparait reste affichée quand je reviens a ce tableau après l’avoir quitté.
En plus simple (enfin presque) garder ton code avec une condition du genre :
Chaque ligne nommée se cache sauf si la ligne situé juste au dessus (genre (n-1) n’est pas vide dans la cellule qui fusionne les colonnes ("C:H")
ou peut être : Si la cellule qui fusionne les colonnes ("C:H") de la ligne supérieure est différente de rien " alors la ligne reste affichée .
Cordialement
As-tu vu le code que j'ai ajouté... ?
Bonjour MFerrand.
Comment dire…. Je suis scotché !!!!!!
La patience et le travail dont tu fais preuve me touchent vraiment. Sans chercher à te gonfler les chevilles ou te faire des courbettes,,,,, MERCI. Tu es de ces personnes qui apportent beaucoup aux autres, pas uniquement par le partage de la connaissance, mais aussi par la gentillesse.
Ceci dit ….J’ai tout compris, et crois moi, pour moi comprendre le vba est compliqué.
Pourrais-tu répondre à ma deuxième demande. Ajouter une condition à ton code :
En fait, ton code permet de cacher des lignes nommées. Mais à l’ouverture du classeur une 1ere ligne apparaitre seule afin de la remplir. Mais lorsque on remplit cette ligne dans la cellule qui fusionne les colonnes (C : H), la ligne suivante apparaît de manière à pouvoir la remplir si nécessaire. Ce que je voudrais, c’est que cette ligne vierge qui apparait reste affichée quand je reviens a ce tableau après l’avoir quitté.
En plus simple (enfin presque
Chaque ligne nommée se cache sauf si la ligne situé juste au dessus (genre (n-1) n’est pas vide dans la cellule qui fusionne les colonnes ("C:H")
ou peut être : Si la cellule qui fusionne les colonnes ("C:H") de la ligne supérieure est différente de rien " alors la ligne reste affichée
Cordialement
Oups , j'ai raté ta réponse à ma deuxième demande. je suis tellement long à taper sur le clavier.
Oui , je découvre ton code , mais tu parle de ( supprimer.??? ).
En fait c'est toujours de cacher ou d'afficher , mais pas de supprimer.
Si je ne suis pas (trop trop )nul, dans ton code il n'y a pas de suppression de ligne .
Donc je pense que, comme ton premier code, celui-ci doit correspondre à ma demande.
Là, j'ai pas le classeur mais, ce soir je le teste .
cordialement
PS: désolé pour ma maladresse
je découvre ton code , mais tu parle de ( supprimer.??? ).
En fait c'est toujours de cacher ou d'afficher , mais pas de supprimer.
Lapsus !
TROP MERCI MFerrand .
Bonne soirée
Bonsoir MFerrand ;
Je me permets d'abuser
ton deuxième code marche, mais il saccade un peu, nous assistons visuellement à ses actions . je sais que ce n'est pas facile d'imaginer la demande avec des écrits pas toujours décryptable. Mais serait-il possible de la rendre plus fluide, voir de supprimer la partie ou le code affiche toutes les lignes avant de les cacher.
J'ai remué le code dans tous les sens, et là!!! même si j'ai bien compris ton cours sur la première macro , je reste sur la lune
Le rafraîchissement de l'écran est désactivé lors du masquage, cela ne devrait pas saccader à ce moment là. Je n'ai laissé que le démasquage se faire avant. Si tu veux l'inhiber également, tu remontes la commande Application.ScreenUpdating = False avant .Unprotect.
Ca marche
MAIS Très très heureux de ton aide.
Encore Merci ..de ton cadeau
tu as peut-être une barbe blanche et une tunique rouge. ... Qui sait.......! Bonne fête à TOI.
Pas de case à cocher???