Listbox et Gestionnaire de nom

Bonjour à tous,

J'ai un projet Excel/vba sur lequel j'ai defini des plages nommées pour pouvoir faire des masquages/demasquage de ligne. Ces plages nommées sont donc stockées dans le gestionnaire de noms d'Excel.

J'utilise une listBox (ListOCD) pour stocker certains noms dedans avec le code suivant:

rivate Sub Workbook_Open()
Dim nm As Name

With Feuil2.ListOCD
If .ListCount = 0 Then
'.Clear
 For Each nm In Names
    If InStr(nm.Name, "OCD") Then
    .AddItem
    .List(i, 0) = (Right(nm.Name, Len(nm.Name) - 4))
    .List(i, 1) = nm.Name
    i = i + 1    
    End If
 Next nm
 End If
End With
End Sub

C'est une liste à choix multiples que je veux utiliser pour afficher/masquer des plages de noms. Par exemple si coché, alors la plage est affichée sinon elle est masquée.

Mon soucis vient de deux points:

* à chaque ouverture de mon fichier cette liste est mise à jour du coup je dois trouver un moyen de stocker l'état des plages nommées (hidden/visible)

* je souhaiterai conserver cette état de mes plages nommées (visible/hidden) dans le champ commentaire du gestionnaire de noms.

Ainsi à l'ouverture du fichier si dans le champs commentaire de la plage nommée X, on a Visible par exemple, dans ma liste affiche ce nom comme coché. c'est une liste à choix multiple.

Mais je ne vois pas trop comment aborder le problème... un peu d'aide serait la bienvenue

Merci

Bonjour,

Est-ce que le sujet est toujours d'actualité ?

Rien ne sert de vouloir stocker l'état des champs nommés > il n'y a qu'à relire leur état ...

Si j'ai bien compris la demande ...

Un essai ...

ric

Hello

Yes toujours d'actualité ;-)

Merci beaucoup c'est exactement ce que je souhaitais faire

Par contre, est-ce plutot faisable avec les checkbox (liststyle=1-frmListStylOption)?

J'ai essayé de faire la modif est cela ne fonctionne plus... même en remettant la bonne option (0)

Bonjour,

Je ne comprends pas trop le changement souhaité > est-ce que tu veux dire la listbox avec des checkbox en 1re colonne ?

Private Sub Workbook_Open()
Dim nm As Name, i As Integer
 With Feuil2.ListBox1
      .Clear
      .ColumnCount = 2
      .ListStyle = fmListStyleOption
      .MultiSelect = fmMultiSelectMulti
      i = 0
'...
'...

ric

Hello

Désolé pour la réponse tardive.

Yes je parlais bien de la checkbox en premeière colonne

Hello ric

J'ai une petite question concernant ton code.

Je souhaiterai plutot faire le chargement des listes de la feuille au chargement de celle-ci et non pas au chargement du workbook.

J'ai donc transposé ton code aide:

Private Sub Worksheet_Activate()
Dim nm As Name, i As Integer

   With ActiveSheet.ListBox1
      .Clear
      .ColumnCount = 2
      i = 0
      Action = False
      If .ListCount = 0 Then
         .Clear
         For Each nm In Names
            If InStr(nm.Name, "CHIMIE") Then
               .AddItem (Right(nm.Name, InStr(nm.Name, "_")))
               .List(i, 1) = IIf(Range(nm).EntireRow.Hidden = 0, "Affiché", "Masqué")
               If .List(i, 1) = "Masqué" Then .Selected(i) = True
               i = i + 1
            End If
         Next nm
      End If
      Action = True
   End With
End Sub

Cela fonctionne bien lorsque l'on est sur une autre feuille et que l'on clique sur la feuille où s'execute ce code. SAUF si on ouvre le classeur est que ce dernier est ouvert sur ladite Feuille.

Comment contourner cela? Peut-on sur la sub "Woorkbook_open" appeler la sub "Worksheet_activate" de la feuille sur laquelle le classeur s'ouvre?

Merci

Bonjour,

Suggestion : sélectionner une autre feuille en fermant le classeur > sélectionner la Feuil2 à l'ouverture du classeur > cela déclenchera l'exécution de ta macro dans "Worksheet_Activate" ...

Dans "ThisWorkbook" ...

Private Sub Workbook_BeforeClose(Cancel As Boolean)
   Feuil3.Activate
End Sub

Private Sub Workbook_Open()
   Feuil2.Activate
End Sub

ric

Hello

Merci pour la suggestion, j'y avais pensé mais cela ne me convient pas forcement. Car les utilisateurs finaux pourront dupliquer/supprimer des feuilles. C'est pour cela que je cherche a mettre le code plutot sur les feuilles que sur le Workbook.

Du coup, vu mes contraintes, penses-tu qu'il soit techniquement faisable:

* recuperer la feuille active à l'ouverture du workbook (quelle qu'elle soit)

* lancer une sub " Worksheet_Activate()" de la feuille active?

Je bricole avec vba mais ce n'est pas mon fort, donc je ne connais pas forcement les possibilités et limitation de ce dernier.

Merci

Bonjour,

* recuperer la feuille active à l'ouverture du workbook (quelle qu'elle soit)

* lancer une sub " Worksheet_Activate()" de la feuille active?

Un essai ...

ric

Bonjour Ric,

J'ai essayé d'adapter tes examples. Je suis donc parti sur cela:

This workbook

Option Explicit

Private Sub Workbook_Open()
Dim nm As Name, i As Integer, x As Byte

For x = 1 To Sheets.Count

   If ActiveSheet.Name = Sheets(x).Name Then
      Application.EnableEvents = False
      If x < Sheets.Count Then
         Sheets(x + 1).Activate
      Else
         Sheets(x - 1).Activate
      End If
      Application.EnableEvents = True
      Sheets(x).Activate
      Exit For
   End If
Next x
Action = True
End Sub

Ma Feuille

Private Sub ListBox1_Change()

Dim nm As Name, x As Integer, LeNom As String

If Action = False Then Exit Sub

With ActiveSheet.ListBox1
    For x = 0 To .ListCount - 1
        If .Selected(x) = True Then
            LeNom = .List(x)
            .List(x, 1) = "Masqué"
            ActiveWorkbook.Names(LeNom).Visible = False
        Else
            LeNom = .List(x)
           .List(x, 1) = "Affiché"
           ActiveWorkbook.Names(LeNom).Visible = True
        End If
    Next x
End With
End Sub

Public Sub Worksheet_Activate()
Dim nm As Name, i As Integer

   With ActiveSheet.ListBox1
      .Clear
      .ColumnCount = 2
      i = 0
      Action = False
      If .ListCount = 0 Then
         .Clear
         For Each nm In Names
            If InStr(nm.Name, "CHIMIE") Then
            .AddItem (nm.Name)
            .List(i, 1) = IIf(Range(nm).EntireRow.Hidden = 0, "Affiché", "Masqué")
               If .List(i, 1) = "Masqué" Then .Selected(i) = True
               i = i + 1
            End If
         Next nm
      End If
      Action = True
   End With
End Sub

Ce n'est pas encore cela lol... quand je clique sur les éléments de la liste pour les masquer, cela les masque dans le gestionnaire de nom mais pas d'impact visuel sur la Feuille.

Je pense que mon action "ActiveWorkbook.Names(LeNom).Visible = False" n'est pas bonne....

Je me réponds:

En fait il faut mettre

Range(LeNom).EntireRow.Hidden = 1

a la place de

ActiveWorkbook.Names(LeNom).Visible = False

Bonjour,

Ici > je dois écrire : For Each nm In ActiveWorkbook.Names

Pour le reste > tu as trouvé > c'est Excellent ...

J'ai testé > ça fonctionne bien ...

ric

Merci, sans ton aide j'y serai encore ;-)

il me reste 2 points chiants...

1) la taille de mes listbox bougent a chaque fois même si je les fixe dans les propriétés

2)A la fermeture du classeur (croix rouge), j'ai une erreur '91' (variable d'objet ou variable de bloc with non définie) qui pointe sur:

With ActiveSheet.ListBox1

de la sub ListBox1_Change()

Je ne comprends pas ce qui la déclenche car mon bloc with est bien defini...

Bonjour,

Pour la Listbox > en mode "Création" > clic droit sur la ListBox > "Format de contrôle..." > onglet "Propriétés" > cocher "Ne pas déplacer ou dimensionner avec les cellules".

Pour le point 2 > il doit manquer une fermeture : If ... End If > For ... Next > With ... End With > etc.

Vérifie le code > tu peux tester > dans VBE > menu "Debogage" > "Compiler VBAProject" ...

ric

Re

Point 2 résolu.

Par contre pour le point 1, j'ai fait ta procédure + codage des dimension des Listbox dans le code et dans leur propriété mais leur dimension continue de se modifier aléatoirement.... Je pige pas un truc là

Bonjour,

Si tu n'as pas encore trouvé > puis-je voir le fichier > en message privé ?

ric

hello

te t'envoie cela de suite

Rechercher des sujets similaires à "listbox gestionnaire nom"