Afficher/Masquer Lignes et colonnes
#1
Débutant XLPages

Inscription: 17/11/2009

Messages: 15

Système d'exploitation:
PC
Version Excel utilisée:
2003
Posté le : 26-11-2009 01h19

Bonjour le forum,

Je pense qu’il était préférable d’ouvrir un autre fil.

J’ai essayé d’adapter vos conseils et vos modèles de macros pour réaliser mon projet, mais sans grande réussite.

Après avoir sélectionné le mois (formulaire), je n’arrive pas à masquer les lignes pour les mois qui précèdent mon choix (exemple : masquer les lignes du mois de janvier, si je choisis février). Le mois choisi devrait toujours apparaître à partir de la ligne 6.

J’espère que vous me comprendrez, car il me semble que mes explications ne sont pas très claires.

Je souhaiterai, si possible, voir apparaître le mot « maqué », lorsque les colonnes noms sont effectivement masquées (si j’exagère, n’hésiter pas à me le faire remarquer).

Avec mes remerciements anticipés.

Cordialement.

Pièce jointe:
xls Lours_plan.xls   [ Taille: 50.00 Ko - Téléchargements: 841 ]
Hors Ligne
Rapport   Haut 

Re: Afficher/Masquer Lignes et colonnes
#2
Webmestre

Inscription: 18/05/2006
De Saône-et-Loire (71)

Messages: 1539

Système d'exploitation:
PC
Version Excel utilisée:
97, 2000, 2002, 2003, 2007, 2010, 2013, 2016 et 365
Posté le : 26-11-2009 19h15
Bonsoir lours, le Forum,

Tu trouveras en pièce jointe une proposition de réponse à ton besoin.

J'ai modifié ta procédure CmdM1_Click() comme suit :
Private Sub CmdM1_Click()
Dim C As Range
    'Trouve la cellule correspondant au mois sélectionné
    Set C = ActiveSheet.Range("A6:A39").Find(ListBoxM.Text, LookIn:=xlFormulas)
    If C Is Nothing Then Exit Sub
    'Affiche toutes les lignes
    Rows("6:38").EntireRow.Hidden = False
    'Masque les lignes précédant le mois choisi
    If C.Row > 8 Then
        Range(Cells(6, 1), Cells(C.Row - 1, 1)).EntireRow.Hidden = True
    End If
End Sub
Remarque : Si tes libellés de mois en colonne 1 de la feuille de calcul correspondent - exactement - aux libellés de mois de la listbox, alors C ne vaudra jamais nothing et la ligne de code...
If C Is Nothing Then Exit Sub
... devient donc inutile. Je l'ai quand même laissée pour éviter un plantage, au cas où...

Cordialement,

Pièce jointe:
zip PourLours3.zip   [ Taille: 15.22 Ko - Téléchargements: 931 ]

Didier_mDF
Image redimensionnée
Le Webmaster

La réponse vous satisfait ? Merci de revenir solder le sujet en [résolu], voir ce lien
Hors Ligne
Rapport   Haut 

Re: Afficher/Masquer Lignes et colonnes
#3
Débutant XLPages

Inscription: 17/11/2009

Messages: 15

Système d'exploitation:
PC
Version Excel utilisée:
2003
Posté le : 27-11-2009 23h17
Bonsoir Didier, le forum,
Merci pour cette réponse claire et brillante.
Je vais essayer de comprendre cette macro.
Je tente de faire apparaître le mot "masqué" sur le formulaire. Je reviendrai vers vous si je ne trouve pas la solution.
Cordialement
Hors Ligne
Rapport   Haut 

Re: Afficher/Masquer Lignes et colonnes
#4
Débutant XLPages

Inscription: 17/11/2009

Messages: 15

Système d'exploitation:
PC
Version Excel utilisée:
2003
Posté le : 02-12-2009 00h17

Bonjour Didier, le forum,

Si les deux colonnes se rapportant à un nom étaient affichées, je souhaiterai faire apparaître le mot « affiché » dans la 3ème colonne (sur la même ligne que le nom) de la ListBox, et inversement (le mot  « masqué »).

J’ai réalisé des tests sans succès. Aussi, je me retourne vers vous pour essayer de solutionner ce problème.

J’ai supprimé le bouton de commande « Afficher/Masquer » pour n’effectuer qu’un double clic pour afficher ou masquer le nom. Le résultat est un désastre, et mes connaissances ne me permettent pas de détecter les erreurs.

En espérant ne pas trop abuser de votre temps et de votre gentillesse,

Cordialement


Pièce jointe:
xls PourLours4.xls   [ Taille: 47.50 Ko - Téléchargements: 717 ]
Hors Ligne
Rapport   Haut 

Re: Afficher/Masquer Lignes et colonnes
#5
Webmestre

Inscription: 18/05/2006
De Saône-et-Loire (71)

Messages: 1539

Système d'exploitation:
PC
Version Excel utilisée:
97, 2000, 2002, 2003, 2007, 2010, 2013, 2016 et 365
Posté le : 02-12-2009 21h12
Bonsoir lours, le Forum,

En pièce jointe, ton fichier modifié en conséquence.

J'ai tout d'abord rétabli la propriété BoundColumn du contrôle ListBoxA sur la valeur 2 (et non 3 comme tu l'avais modifiée). Pour info, la propriété Value du contrôle tire sa valeur dans la colonne dont le numéro est indiqué en BoundColumn. En mettant 3, tu fausses le retour de valeur attendu dans le code (= plantage assuré).

Ensuite, j'ai ajouté 2 lignes dans le code ci-dessous (j'ai repéré les lignes ajoutées par un commentaire "<<< AJOUT LIGNE >>>") :

Option Explicit
' Décembre 2009 : myDearFriend! - www.mdf-xlpages.com

Private Sub UserForm_Initialize()
  Dim cell As Range
  Dim MyArray(1, 6)
  Dim i As Byte
  'Affiche toutes les lignes
  Rows("6:38").EntireRow.Hidden = False
  'Affiche toutes les colonnes
  Range("B:M").EntireColumn.Hidden = False
  ' Pour les colonnes noms
    With ListBoxA
      For Each cell In Rows(4).SpecialCells(xlCellTypeConstants, 3)
        .AddItem cell.Text                     '1ère col : les prénoms
        .List(.ListCount - 1, 1) = cell.Column '2ème col : les nos de colonnes correspondantes
        .List(.ListCount - 1, 2) = "Affiché"    '<<< AJOUT LIGNE >>> 3ème col : le statut masqué/affiché
      Next cell
    .ListIndex = 0
    End With
  'Pour les mois
  ListBoxM.ListIndex = 0
End Sub

Private Sub ListBoxA_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
  'masque ou affiche la colonne cible et la colonne à sa droite
  With Columns(Val(ListBoxA.Value))
      .Hidden = Not .Hidden
      .Offset(0, 1).Hidden = .Hidden
      ListBoxA.List(ListBoxA.ListIndex, 2) = IIf(.Hidden, "Masqué", "Affiché")  '<<< AJOUT LIGNE >>>
  End With
  ActiveWindow.ScrollColumn = 1
End Sub

Private Sub Cmdretour_Click()
  Unload Me
End Sub

Private Sub CmdM1_Click()
Dim C As Range
    'Trouve la cellule correspondant au mois sélectionné
    Set C = ActiveSheet.Range("A6:A39").Find(ListBoxM.Text, LookIn:=xlFormulas)
    If C Is Nothing Then Exit Sub
    'Affiche toutes les lignes
    Rows("6:38").EntireRow.Hidden = False
    'Masque les lignes précédant le mois choisi
    If C.Row > 8 Then
        Range(Cells(6, 1), Cells(C.Row - 1, 1)).EntireRow.Hidden = True
    End If
End Sub
Cordialement,
Pièce jointe:
zip PourLours5.zip   [ Taille: 13.62 Ko - Téléchargements: 832 ]

Didier_mDF
Image redimensionnée
Le Webmaster

La réponse vous satisfait ? Merci de revenir solder le sujet en [résolu], voir ce lien
Hors Ligne
Rapport   Haut 

Re: Afficher/Masquer Lignes et colonnes
#6
Débutant XLPages

Inscription: 17/11/2009

Messages: 15

Système d'exploitation:
PC
Version Excel utilisée:
2003
Posté le : 03-12-2009 01h39

Bonjour Didier, le forum,

C’est génial. Je te remercie pour tes explications, mais je m’en excuse par avance, je n’arrive pas à comprendre la propriété BoundColumn. En effet, je pensai que si j’avais dans la ListBoxA 3 colonnes, je devais indiquer également 3 pour BoundColumn.

Avec l’aide sur Visual Basic, j’essaie de déchiffrer les codes, et ce n’est pas évident (mes neurones n’ont plus vingt ans).

Peux-tu me préciser, si je ne  prends pas trop de ton temps, pourquoi indiquer -1 dans

« .List(ListCount -1,1) ». Je suppose que 1 correspond à la 2ème colonne (0=1ère colonne, 1=2ème colonne, 2=3ème colonne).

Encore Merci pour ton dévouement, et ta gentillesse à partager ton immense savoir.

Cordialement

Hors Ligne
Rapport   Haut 

Re: Afficher/Masquer Lignes et colonnes
#7
Webmestre

Inscription: 18/05/2006
De Saône-et-Loire (71)

Messages: 1539

Système d'exploitation:
PC
Version Excel utilisée:
97, 2000, 2002, 2003, 2007, 2010, 2013, 2016 et 365
Posté le : 03-12-2009 19h49
Bonsoir lours, le Forum,

Citation :
lours a écrit :
... je n’arrive pas à comprendre la propriété BoundColumn. En effet, je pensai que si j’avais dans la ListBoxA 3 colonnes, je devais indiquer également 3 pour BoundColumn.

Avec l’aide sur Visual Basic, j’essaie de déchiffrer les codes, et ce n’est pas évident (mes neurones n’ont plus vingt ans).

Peux-tu me préciser, si je ne  prends pas trop de ton temps, pourquoi indiquer -1 dans

« .List(ListCount -1,1) ». Je suppose que 1 correspond à la 2ème colonne (0=1ère colonne, 1=2ème colonne, 2=3ème colonne).

Encore Merci pour ton dévouement, et ta gentillesse à partager ton immense savoir.

"immense savoir" arf... faut pas exagérer lol !

Bon, je tente une mini explication sur les propriétés clés du contrôle ListBox (valable aussi pour le contrôle ComboBox) :

Propriété Value
: comme tu le sais, la propriété Value d'un contrôle retourne le contenu de ce contrôle. Pour un TextBox par exemple, la propriété Value te retourne la chaîne de caractères qui est affichée dans ce TextBox. Par défaut, une ListBox contient une seule colonne. Dans ce cas  là, c'est fort simple : lorsque l'utilisateur sélectionne un élément, la propriété Value retourne la donnée contenu dans cet élément sélectionné.

Propriété ColumnCount:si je souhaite afficher plusieurs colonnes de données dans ce contrôle, je vais jouer sur la propriété ColumnCount. On l'a vu, par défaut, cette propriété est définie à 1. Si je compte afficher 5 colonnes par exemple, je vais donc lui attribuer la valeur... 5 ! Dans le cas d'une ListBox multicolonnes, rien ne change pour la propriété Value. Si je demande cette propriété Value, j'obtiens toujours la donnée issue de la première colonne (et selon la ligne sélectionnée dans le contrôle bien sûr).

Par défaut donc, la propriété Value retourne toujours la valeur issue dans la première colonne d'une ListBox, quelque soit le nombre de colonnes du contrôle.

Mais comment faire si, après sélection d'une ligne par l'utilisateur, je souhaite obtenir la donnée contenue dans la 2ème ou 3ème colonne du contrôle au lieu de la première ?

Une solution "académique" consiste à recourir à la propriété List() qui représente en fait le tableau des données contenues (à 2 dimensions : pour ligne et colonne)...

Mais VBA nous offre une solution beaucoup plus simple et souvent plus pratique : on peut redéfinir la colonne cible de la propriété Value. Ainsi, en testant la propriété Value, on peut décider d'obtenir directement la donnée contenue dans une colonne autre que la première : pour ce faire, on va utiliser la propriété BoundColumn. Définie à 1 par défaut (pour colonne 1), on lui attribue alors le numéro de la colonne souhaitée !

Dans ton fichier, la ListBoxA comprend 3 colonnes et j'ai redéfini volontairement la propriété BoundColumn sur 2 car c'est la donnée contenue dans la 2ème colonne qui m'intéresse en retour lorsque je demande : ListBoxA.Value.

Citation :
lours a écrit :

Peux-tu me préciser, si je ne  prends pas trop de ton temps, pourquoi indiquer -1 dans

« .List(ListCount -1,1) ». Je suppose que 1 correspond à la 2ème colonne (0=1ère colonne, 1=2ème colonne, 2=3ème colonne

Là, tu as presque tout compris... Sauf qu'on ne parle pas de colonne ici, mais de ligne !

Pour rappel, la propriété List() est comme un tableau à 2 dimensions qui se présente ainsi :
ListBox1.List(NumLigne, NumColonne)
Le premier élément, c'est le numéro de ligne et le deuxième, c'est pour la colonne.

Comme tu l'as déduit, la particularité ici, c'est que cette numérotation des Lignes / Colonnes commence à 0 (zéro). Ca ne simplifie pas vraiment les choses, mais c'est un coup à prendre...

- Si je veux obtenir la donnée contenue dans la première ligne et première colonne du contrôle, je demande donc : List(0,0)
- Si je veux obtenir la donnée contenue dans la 3ème ligne et 4ème colonne, je fais : List(2, 3)
- Et enfin, si je veux obtenir la donnée contenue dans la dernière ligne et dernière colonne du contrôle ListBoxA, alors j'ai recours à :
   With ListBoxA
        MsgBox .List(.ListCount - 1, .ColumnCount - 1)
    End With
J'espère t'avoir aidé à comprendre un peu le principe de fonctionnement de ce contrôle...

Cordialement,


Didier_mDF
Image redimensionnée
Le Webmaster

La réponse vous satisfait ? Merci de revenir solder le sujet en [résolu], voir ce lien
Hors Ligne
Rapport   Haut 

Re: Afficher/Masquer Lignes et colonnes
#8
Débutant XLPages

Inscription: 17/11/2009

Messages: 15

Système d'exploitation:
PC
Version Excel utilisée:
2003
Posté le : 03-12-2009 23h05

Bonsoir Didier, le forum,

Un très grand merci pour toutes ces explications. Etant donné la qualité des commentaires, tout devient plus clair.

J’apprécie tes connaissances, et en plus tu ajoutes la modestie à tes qualités. On ne peut que rester admiratif.

Félicitations.

Hors Ligne
Rapport   Haut 

Re: Afficher/Masquer Lignes et colonnes
#9
Débutant XLPages

Inscription: 17/11/2009

Messages: 15

Système d'exploitation:
PC
Version Excel utilisée:
2003
Posté le : 05-12-2009 18h43

Bonsoir Didier, le forum,

Que l’apprentissage est difficile, car si tout fonctionne sur les exemples fournis, j’éprouve des difficultés pour l’appliquer à mon projet.

Sur le fichier joint, j’ai figé les volets en B6, ensuite j’ai déplacé les lignes et les colonnes pour placer le curseur en D50. Si je lance la macro (car la fin du bouton Visualiser apparaît), les lignes (5 à 49) et les colonnes (B et C) sont toujours masquées, alors que la ListBoxA indique que toutes les colonnes sont affichées. Je valide un mois sélectionné, et rien ne se produit.

Si je protège la feuille, j’ai les mêmes problèmes. Je suppose que dans tous les cas la feuille doit être déprotégée et que les volets libérés.

Je compte sur vous pour m’aider à résoudre ces problèmes.

Enfin, une confirmation : dans la ligne For Each cell in Rows(4) signifie que l’on récupère les éléments de la ligne 4 de la feuille, mais pour …. Constants, 3) ? (si j’ose : 3 colonnes dans la ListBoxA – J’arrête car je fatigue…).

En vous remerciant par avance,

Cordialement.




Pièce jointe:
xls PourLours6.xls   [ Taille: 48.00 Ko - Téléchargements: 718 ]
Hors Ligne
Rapport   Haut 

Re: Afficher/Masquer Lignes et colonnes
#10
Webmestre

Inscription: 18/05/2006
De Saône-et-Loire (71)

Messages: 1539

Système d'exploitation:
PC
Version Excel utilisée:
97, 2000, 2002, 2003, 2007, 2010, 2013, 2016 et 365
Posté le : 06-12-2009 00h15
Bonsoir lours, le Forum,

Citation :
lours a écrit :

Sur le fichier joint, j’ai figé les volets en B6, ensuite j’ai déplacé les lignes et les colonnes pour placer le curseur en D50. Si je lance la macro (car la fin du bouton Visualiser apparaît), les lignes (5 à 49) et les colonnes (B et C) sont toujours masquées, alors que la ListBoxA indique que toutes les colonnes sont affichées. Je valide un mois sélectionné, et rien ne se produit.


Si j'interprète bien la situation là, je pense que ce n'est plus un problème VBA que tu rencontres lours.
Pour info, des lignes (ou des colonnes) non visibles parce que tu as figé les volets et joué sur l'ascenseur ne sont pas pour autant des lignes dites "masquées". Elles sont tout simplement hors de ton champ de vision, ce qui n'est pas pareil... (c'est un peu la même chose pour un classeur vierge : si tu descends l'ascenseur vertical, la ligne 1 devient hors de portée, donc n'est plus visible... elle n'est pas masquée pour autant !). Dans l'exemple cité, si tu décides de rendre les lignes 5 à 49 "hors de portée" de ton champ de vision (en jouant sur les ascenseurs), que leur propriété Hidden soit True ou False ne changera pas grand chose, elles seront toujours hors de ta vue.

Citation :
lours a écrit :

Si je protège la feuille, j’ai les mêmes problèmes. Je suppose que dans tous les cas la feuille doit être déprotégée et que les volets libérés.


Là, je ne comprends pas ce que tu veux dire. La protection de la feuille n'a pas d'influence sur cette gestion de l'affichage. Pour info, il est quasiment toujours possible de permettre aux macros d'agir sur une feuille protégée sans avoir à lever cette protection (faire une recherche dans le Forum sur l'argument de protection UserInterfaceOnly), mais ton problème ne semble pas porter sur ce point là.

Citation :
lours a écrit :

Enfin, une confirmation : dans la ligne For Each cell in Rows(4) signifie que l’on récupère les éléments de la ligne 4 de la feuille, mais pour …. Constants, 3) ? (si j’ose : 3 colonnes dans la ListBoxA – J’arrête car je fatigue…).


Si je fais :

For Each cell in Rows(4)

... je parcours et teste toutes les cellules de la ligne 4 (soit 256 cellules sur XL2003). Ce n'est pas une façon efficace de travailler.
Si je fais :

For Each cell In Rows(4).SpecialCells(xlCellTypeConstants, 3)

... je parcours et teste uniquement les cellules de la ligne 4 ayant une valeur contenue (soit 6 cellules dans ton exemple). Je ne traite donc que les cellules qui m'intéresse.

Comment faire pour obtenir "SpecialCells(xlCellTypeConstants, 3)" ?

Je vais au plus simple :
  • Je déclenche l'enregistreur de macro
  • Je sélectionne la ligne 4 (entière)
  • Je fais menu Edition / Atteindre... / bouton Cellules.
  • Je sélectionne Constantes
  • Je valide par OK
  • Puis je stoppe l'enregistrement de macro et je regarde le code obtenu.


Pour les détails sur la méthode SpecialCells , je te conseille vivement de consulter l'aide VBA Excel.

Cordialement,




Didier_mDF
Image redimensionnée
Le Webmaster

La réponse vous satisfait ? Merci de revenir solder le sujet en [résolu], voir ce lien
Hors Ligne
Rapport   Haut 


Vous pouvez voir les sujets.
Vous ne pouvez pas débuter de nouveaux sujets.
Vous ne pouvez pas répondre aux contributions.
Vous ne pouvez pas éditer vos contributions.
Vous ne pouvez pas effacez vos contributions.
Vous ne pouvez pas ajouter de nouveaux sondages.
Vous ne pouvez pas voter en sondage.
Vous ne pouvez pas attacher des fichiers à vos contributions.
Vous ne pouvez pas poster sans approbation.

[Recherche avancée]


Qui consulte actuellement ce sujet ?   1 Utilisateur(s) anonymes