Comment ajouter des en-têtes de une liste multicolonne dans un userform Excel à l'aide de VBA
Est-il possible de mettre en place les en-têtes dans une liste multicolonne sans l'aide d'une plage de feuille de calcul en tant que source?
Celui-ci utilise un tableau de variants qui est attribué à la liste des biens de la zone de liste, les en-têtes apparaissent en blanc.
Sub testMultiColumnLb()
ReDim arr(1 To 3, 1 To 2)
arr(1, 1) = "1"
arr(1, 2) = "One"
arr(2, 1) = "2"
arr(2, 2) = "Two"
arr(3, 1) = "3"
arr(3, 2) = "Three"
With ufTestUserForm.lbTest
.Clear
.ColumnCount = 2
.List = arr
End With
ufTestUserForm.Show 1
End Sub
OriginalL'auteur vzczc | 2009-03-18
Vous devez vous connecter pour publier un commentaire.
Pas. Je créer des étiquettes au-dessus de la zone de liste pour servir d'en-têtes. Vous pourriez penser que c'est une douleur royale pour changer les étiquettes à chaque fois que votre lisbox changements. Vous avez raison - c'est une douleur. C'est une douleur pour configurer la première fois, beaucoup moins de changements. Mais je n'ai pas trouvé une meilleure façon.
Oui, Dick réponse est la bonne façon de faire si votre listbox a seulement quelques colonnes, disons 5 ou moins.
OriginalL'auteur Dick Kusleika
J'ai été confronté à ce problème tout à l'heure et a trouvé cette solution. Si votre de contenu (RowSource) points à une plage de cellules, les en-têtes de colonne dans un multi-colonne listbox sont prises à partir des cellules immédiatement au-dessus du contenu (RowSource).
À l'aide de l'exemple décrit ici, à l'intérieur de la zone de liste, les mots Symbole et Nom apparaître que le titre des rubriques. Quand j'ai changé le mot Nom dans la cellule AB1, puis ouvrit la forme dans le VBE de nouveau, les en-têtes de colonne changé.
L'exemple est venu d'un classeur en VBA Pour les Modélisateurs par S. Christian Albright, et j'ai été à essayer de comprendre comment il a obtenu les en-têtes de colonne dans sa zone de liste 🙂
OriginalL'auteur Rick Henderson
Réponse Simple: non.
Ce que j'ai fait dans le passé, est de charger les titres en ligne 0 puis définissez la propriété ListIndex à 0 lors de l'affichage de la forme. Cela met l'accent sur les "têtes" en bleu, donnant l'apparence d'un en-tête. La forme des boutons d'action sont ignorés si la propriété ListIndex reste à zéro, de sorte que ces valeurs ne peuvent jamais être sélectionné.
Bien sûr, dès qu'un autre élément de la liste est sélectionné, le titre perd le focus, mais par ce temps, leur travail est fait.
Faire les choses de cette façon vous permet également de titres qui défilent horizontalement, ce qui est difficile/impossible à faire avec des étiquettes séparées qui flottent au-dessus de la zone de liste. Le revers de la médaille est que les titres ne restent pas visible si la zone de liste des besoins pour faire défiler verticalement.
En gros, c'est un compromis qui fonctionne dans les situations que j'ai été en.
Malheureusement ListBox n'avons pas de "Défilé" de l'événement. Mais on peut créer à la place assez large zone de liste et placer des Étiquettes ci-dessus comme en-têtes de colonne. Puis placez-le tout à l'intérieur d'un Cadre pour faire défiler l'Image avec les Étiquettes et les Listbox à l'horizontale.
OriginalL'auteur Lunatik
Il est très facile de solution pour afficher les en-têtes au sommet de multi zone de liste colonnes.
Il suffit de changer la valeur de la propriété à "true" pour "columnheads" qui est false par défaut.
Après cela, il suffit de mentionner la plage de données dans la propriété "contenu" à l'exception de l'en-tête de la plage de données et de l'en-tête doit être en première ligne supérieure de la plage de données, puis il va choisir l'en-tête automatiquement et vous en-tête sera gelé.
si supposons que vous avez données dans la plage "A1:H100" et d'en-tête à "A1:H1", qui est la première ligne, puis votre plage de données doit être "A2:H100" qui doit mentionner dans la propriété "contenu" et "columnheads" perperty valeur doit être vrai
Ce qui concerne,
Asif Hameed
OriginalL'auteur Asif Hameed
Voici mon approche pour résoudre le problème:
Cette solution nécessite l'ajout d'un deuxième élément de zone de liste et la placer au-dessus de la première.
Comme ceci:
Vous pouvez ensuite appeler la fonction CreateListBoxHeader à faire l'alignement correct et ajouter un en-tête des articles.
Résultat:
Code:
Utilisation:
OriginalL'auteur Jonas_Hess
J'aime utiliser l'approche suivante pour les en-têtes sur une zone de liste déroulante où la CboBx n'est pas chargé à partir d'une feuille de calcul (données à partir de sql par exemple). La raison pour laquelle je spécifier de ne pas partir d'une feuille de calcul, c'est que je pense que la seule façon d'obtenir de contenu (RowSource) de travail si vous les charger à partir d'une feuille de calcul.
Cela fonctionne pour moi:
Dans votre VBA pour l'action yourListBoxName_Click, entrez le code suivant:
Lorsque vous cliquez sur la zone de liste, la zone de liste déroulante va descendre et de fonctionner normalement alors que les titres (dans la zone de liste) restent au-dessus de la liste.
OriginalL'auteur RR_CodeSlinger
Une autre variante sur Lunatik la réponse est d'utiliser un local de type boolean et le changement des événements, de sorte que la ligne peut être mis en évidence lors de l'initialisation, mais désélectionnée et bloqué après un changement de sélection est faite par l'utilisateur:
Lorsque la zone de liste est initialisée vous pouvez ensuite mettre en bHighlight et lbx.Sélectionnée(0) = True, ce qui permettra à l'en-tête de rangée pour initialiser sélectionné; par la suite, le premier changement aura pour effet de désélectionner et de prévenir la rangée d'être sélectionné à nouveau...
OriginalL'auteur ChE Junkie
Voici une approche qui automatise la création d'étiquettes au-dessus de chaque colonne d'une zone de liste (sur une feuille de calcul).
Il va travailler (mais pas super joli!!!) tant qu'il n'y a pas de barre de défilement horizontale sur votre listbox.
OriginalL'auteur Tim Williams
Pourquoi ne pas simplement ajouter des Étiquettes vers le haut de la zone de liste et si des changements sont nécessaires, la seule chose que vous avez besoin de modifier par programmation sont les étiquettes.
OriginalL'auteur Jim
Vous pouvez donner à ceci un essai. Je suis assez nouveau sur le forum mais je voulais offrir quelque chose qui a fonctionné pour moi depuis que j'ai reçu beaucoup d'aide de ce site dans le passé. Il s'agit essentiellement d'une variation de la ci-dessus, mais j'ai trouvé ça plus simple.
Juste les coller dans le Userform_Initialize section de votre userform code. Remarque vous devez déjà disposer d'une zone de liste sur l'objet userform ou avoir créé dynamiquement au-dessus de ce code. Veuillez aussi noter que le Tableau est une liste de titres (ci-après comme "Header1", "Header2" etc. Les remplacer par vos propres en-têtes. Ce code sera ensuite mis en place une rubrique de la barre au sommet basé sur la largeur des colonnes de la zone de liste. Désolé, il n'a pas de défilement - il fixe les étiquettes.
Plus hauts codeurs - s'il vous plaît n'hésitez pas à commenter ou à améliorer cette.
OriginalL'auteur Peter Winn
Voici ma solution.
J'ai remarqué que quand je spécifier la zone de liste de contenu (rowsource) via la fenêtre des propriétés dans le VBE, les en-têtes de pop up, pas de problème. C'est seulement quand nous essayons de définir le contenu (rowsource) par le code VBA que les en-têtes de de se perdre.
Je me suis d'abord allé a défini les zones de liste de contenu (rowsource) comme une plage nommée dans le VBE via la fenêtre propriétés, puis je peux réinitialiser le contenu (rowsource) dans le code VBA par la suite. Les en-têtes encore à chaque fois.
Je suis à l'aide de cette combinaison avec un filtre avancé macro à partir d'un listobject, qui crée ensuite un autre (filtré) listobject sur lequel le contenu est basé.
Cela a fonctionné pour moi
OriginalL'auteur JamesSA