Autres dimensionner une listbox pour DUDU2

patricktoulon

XLDnaute Barbatruc
BONJOUR @Dudu2
Private Sub UserForm_Activate()
ListBox1.List = [A1:A8].Value
ecx = Me.Width - Me.InsideWidth
With Me.Controls.Add("forms.Label.1", "cobaie")
.Width = 500
.Height = 200
.Font.Name = ListBox1.Font.Name
.BackColor = vbYellow
.BorderStyle = ListBox1.BorderStyle
' .SpecialEffect = ListBox1.SpecialEffect
.Font.Size = ListBox1.Font.Size
.Font.Bold = ListBox1.Font.Bold
.Caption = "toto"
.AutoSize = True
.Top = ListBox1.Top
.Left = ListBox1.Left + ListBox1.Width
ListBox1.Height = ((.Height + 0.25) * ListBox1.ListCount)
MsgBox "théoriquement un item mesure " & .Height & " points de haut"
'Me.Controls.Remove (.Name)
End With
End Sub
1732366521028.png


demo1.gif
 

Dudu2

XLDnaute Barbatruc
Merci @patricktoulon pour ce code.

Mon problème est sur une ListBox ActiveX et pour ajuster la hauteur de la ListBox au nombre d'item c'est très très très difficile car delà dépend de la Font.Size et des caprices d'Excel sur les VScroll à minima qui bloquent et m'ont obligé à prendre une petite marge en bas.

Pour l'ajustement en hauteur, j'ai maintenu le ListBox.TopIndex à 0 en augmentant progressivement la hauteur en sélectionnant le dernier item ajouté. Ça donne un assez bon résultat.

Le but était de gérer un saisie de données de validation multiple sur la base d'une ListBox.
 

Dudu2

XLDnaute Barbatruc
A propos, tu connais peut-être cet énorme bug Excel !

Lorsqu'un Control Active X est créé dynamiquement ou supprimé sur un évènement de feuille (Ex. Worksheet_SelectionChange), TOUTES les variables Module et Classe sont détruites / effacées. Il ne reste rien !

Pour contourner ce bug, il faut donc "sortir" sa création ou suppression de l'évènement en le faisant dans une procédure lancée de manière asynchrone (Application.OnTime Now, "AsyncProc") à partir de la procédure exécutée sur l'évènement de feuille. Sachant que la procédure asynchrone n'est exécutée qu'à la fin de l'exécution de la procédure qui l'a lancée.
 

Dudu2

XLDnaute Barbatruc
Bonjour @job75,

Ton code marche parfaitement bien pour la hauteur, c'est déjà un super exploit !

Pour la largeur, en ActiveX en tous cas, elle est constante et ne s'ajuste pas à la largeur des items de la liste.
De plus pour éviter un Horizontal Scroll Bar, il faut définir une ColumnWidths < ListBox.Width de 4 points au moins.
Je ne vois pas d'autre solution que de passer par une TextBox ou Label AutoSize temporaire pour la largeur et vais essayer de faire une fonction dédiée à ces ajustement H & V.
 

Dudu2

XLDnaute Barbatruc
Alors cette propriété Integralheight c'est pour être sûr de ne pas afficher partiellement un item.

Voici 2 fichiers:
ValidationMultipleListBox Method TopIndex.xlsm (la méthode TopIndex que j'ai employée)
ValidationMultipleListBox Method @job75.xlsm (la méthode de @job75 + le resize de la Width via un label)

Il y a quand même une différence de resize de la Height sur les petites polices, la méthode TopIndex arrivant à limiter l'espace en fin de ListBox mais ayant l'inconvénient d'un petit saut d'affichage à cause de son principe progressif de set de la Height.

Je vais essayer de voir s'il y a moyen d'améliorer la méthode @job75 pour ces cas particuliers. Cette méthode quoiqu'il en soit reste la meilleure des 2.
 

Pièces jointes

  • ValidationMultipleListBox Method @job75.xlsm
    173.2 KB · Affichages: 1
  • ValidationMultipleListBox Method TopIndex.xlsm
    164.8 KB · Affichages: 3

patricktoulon

XLDnaute Barbatruc
bon après analyse et mise en situation
1°j'ai essayé de faire abstraction du zoom
2°du screen updating
3° en reformulant sans le zoom( tout du moins en le prenant en compte autrement )

il s'avère que selon le zoom ben ça ne fonctionne plus tout simplement
je soupçonne fortement les calcul arrondi et le rafraichissement
démonstration
 

Dudu2

XLDnaute Barbatruc
Salut les Ajusteurs de Listes,

En fait le Zoom ne pose pas de problème si on n'essaie pas, comme je l'ai fait au début, de modifier les valeurs de la ListBox. On s'y perd et ça ne donne rien.

Il suffit de temporairement ramener le Zoom à 100 en Application.ScreeDisplay = False au début des traitements et de le rétablir en fin de code (voir le Module_ValueSizeListBoxActiveX et sa fonction ValueAndSizeListBoxActiveX()) dans le fichier joint.

Dans ce fichier de validation multiple, l'effet de transition d'une ListBox à une autre n'est pas liée à cette manip sur le Zoom mais au code spécifique de la validation multiple qui doit tenir compte du gros bug indiqué en Post #3 qui oblige à rendre asynchrone la création et ici la suppression d'un Control ActiveX sur évènement de feuille.

La méthode @job75 est utilisée pour trouver la hauteur de la ListBox et peut laisser, selon la taille de police, une petite zone en bas que je vais tenter de réduire avec la méthode du TopIndex.
 
Dernière édition:

Dudu2

XLDnaute Barbatruc
Alors avec un ajustement par le TopIndex j'obtiens le même résultat sur la petite police de 8, il reste une petite zone vide à la fin de la ListBox. Je pense qu'Excel contrôle ça et qu'il n'y a rien à faire que je sache faire.

Voici le fichier final, jusqu'à ce que quelqu'un trouve un problème !
Je vais faire la même fonction pour les ListBox de UserForm.
 

patricktoulon

XLDnaute Barbatruc
Bonsoir,

Je ne connais pas cette commande...

A+
ben c'est ce que tu fait dans ton exemple en fait
ton exemple @job75 fonctionne tres bien sur feuille et userform

@Dudu2 dit
En fait le Zoom ne pose pas de problème si on n'essaie pas, comme je l'ai fait au début, de modifier les valeurs de la ListBox. On s'y perd et ça ne donne rien.

Il suffit de temporairement ramener le Zoom à 100 en Application.ScreeDisplay = False au début des traitements et de le rétablir en fin de code (voir le Module_ValueSizeListBoxActiveX et sa fonction ValueAndSizeListBoxActiveX()) dans le fichier joint.
me vient alors une question
oui est quoi de nouveau par rapport à la solution de @job75?
car c'est exactement ce qu'il fait dans sa solution
ensuite @Dudu2 dit
Je ne vois pas d'autre solution que de passer par une TextBox ou Label AutoSize temporaire pour la largeur et vais essayer de faire une fonction dédiée à ces ajustement H & V.
solution que je t'ai proposé me semble t il que ce soit pour la hauteur d'un item ou la largeur le label autofit fait très bien l'affaire dans un userform(astuce vielle comme le monde)

et pour finir il y a bien une autre astuce me semble t il avec un textbox mais pas celle que tu crois
car j'ai essayé de faire pareil que le label avec un textbox et on est loin du compte

par contre il y a bien une autre astuce sortie du fond de ma mémoire (elle date un peu)
je regarderais demain dans mes vieux disques durs
 

Dudu2

XLDnaute Barbatruc
Je ne connais pas cette commande...
J'ai fourché... Application.ScreenUpdating la célèbre.

il s'avère que selon le zoom ben ça ne fonctionne plus tout simplement
Si tu n'y es pas arrivé (dommage pour toi), j'ai donné ma réponse pour le faire fonctionner c'est tout.

me vient alors une question
oui est quoi de nouveau par rapport à la solution de @job75?
Ce n'est pas le code de @job75 qui a permis de résoudre le problème de Zoom, tu sais lire ou il te faut aussi un dessin ?

solution que je t'ai proposé me semble t il que ce soit pour la hauteur d'un item ou la largeur le label autofit fait très bien l'affaire dans un userform(astuce vielle comme le monde)
Tu as proposé un Label et j'ai utilisé un TextBox. Dans ton code il y a des calculs et pas dans le mien.
On n'a absolument rien en commun dans ce code. Tu utilises de vieilles solutions et moi des nouvelles.
 
Dernière édition:

Dudu2

XLDnaute Barbatruc
Et puis tiens, la méthode @Dudu2 en ListBox ActiveX copiée la méthode @Dudu2 en ListBox UserForm.
Pareil, plus de calculs, c'est direct et pour toutes les tailles de police. Plus d'espace vide.
Le secret ? Sur la TextBox de référence, il faut copier 2 fois la liste des valeurs.

Et @patricktoulon, soit tu fais mieux, soit tu ravales tes critiques bidons.
Quand tu joues ce jeu-là, tu me cours sérieusement sur le système !

Edit: voir la solution ici.
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
re
un textbox multiligne contenant le même text que la liste box
pour le height c'est acceptable il y a un pichtouille de rien du tout
bien que l'on vois que le textbox n'a pas le même margin top
pour le width on ajoute encore ce satané 3 qui correspond au calcul de @job75 en comparant le height avec et sans integralheight
comme tu peux le voir sur cette capture le textbox au final n'a pas la même dimension que la liste pourtant le résulltat est acceptable

a gauche le textbox à droite la listbox
1732492126974.png

demo en action
demo1.gif


il n'y a rien de déplacé dans ce que je dis
je dis simplement que tu n'apporte rien de nouveau qui n'est été fait dans la discussion de @job75
pour avoir testé toutes les solutions de cette discussion + celle du lien de @job75
c'est celle de job75 qui est le plus proche pour ne pas dire quasi parfaite
après sinon c'est pas 2/3 points qui vont fouetté grand mère mais avec la solution de @job75 on peut avoir la hauteur d'un item vraiment très proche de la réalité
 

Discussions similaires

Statistiques des forums

Discussions
315 089
Messages
2 116 099
Membres
112 661
dernier inscrit
ceucri