[MsgBox] : aligner les lignes

F22Raptor

XLDnaute Impliqué
Bonsoir à tous,
Connaîtriez-vous une astuce pour afficher plusieurs lignes sur 2 colonnes, de manière alignée, dans une MsgBox.
Voici l'idée :
A partir d'un nom et d'un chiffre, je concatène des lignes avec trois espaces au milieu, et je les affiche dans une MsgBox.
Ici : MsgBox Ligne1 & Chr(13) & Ligne2 & Chr(13) & Ligne3

Amédée 24
Luc 12
Jean-Pascal 36

Problème : les chiffres ne sont pas alignés !

Les noms ne pouvant dépasser 20 caractères, j'ai essayé d'insérer un nombre d'espaces flottant, en fonction de la longueur du nom (premier chiffre au 24ème caractère, et j'insère les espaces pour arriver jusque là).
Sur le principe, c'est OK, mais la taille d'un espace n'étant pas égal à la taille d'un caractère, je reste décalé (moins, mais toujours pas mal).

A part en bidouillant avec un UserForm, y a-t-il un moyen avec MsgBox d'aligner mes noms à gauche, et mes nombres à droite ?

Merci ! :D
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Re : [MsgBox] : aligner les lignes

Bonsoir à tous


Ça ne marchera pas à tous les coups.
Mais ici avec l'exemple (et pour seulement l'exemple) ça marche ;)
Code:
Sub b()
Dim x$, y$, w$, xx$, xxx$, yy$, yyy$, zz$, zzz$
x = "Amédée 24"
y = "Luc 12"
w = "Jean-Pascal 36"
xx = Split(x)(0): xxx = Split(x)(1)
yy = Split(y)(0): yyy = Split(y)(1)
zz = Split(w)(0): zzz = Split(w)(1)
MsgBox xx & String(3, vbTab) & xxx & Chr(10) & yy & String(3, vbTab) & yyy & Chr(10) & zz & String(2, vbTab) & zzz, vbInformation, "Alignement mais pas toujours ;-)"
End Sub
 
Dernière édition:

F22Raptor

XLDnaute Impliqué
Re : [MsgBox] : aligner les lignes

Staple, peux-tu commenter cette ligne, STP ?
xx = Split(x)(0): xxx = Split(x)(1)

Je ne comprends pas trop comment elle marche, en particulier le "deux-points", et le split que je ne connais que sous la forme Matrice = Split("Bonjour Michel", " ")

Egalement : String(2, vbTab)
J'imagine que c'est insérer 2 tabulations, mais pas certain !
Ce serait bien l'équivalent d'un Rept(chr(9) , 2) ?
 
Dernière édition:

F22Raptor

XLDnaute Impliqué
Re : [MsgBox] : aligner les lignes

En creusant la soluce, j'ai pu aligner, mais, comme dit Staple, "pas toujours" ! ;)
Je fais dépendre le nombre d'itérations de vbTab de la longueur du nom.
Comme je sais que j'aurai au maxi 20 caractères, et qu'une tabulation c'est 8 caractères, c'est un nombre de tabulations du genre : Round( (20-Len(Nom)) /8 ,0 )

Sur le principe, c'est OK, mais avec certaines polices de taille non fixe selon les caractères (comme celle utilisée dans les MsgBox), un nom de 20 caractères peut être (légèrement) plus court qu'un nom de 19 caractères !
Du coup, de temps en temps, j'ai un décalage.

Et je ne pense pas que ce puisse être géré pour faire mieux que ça
 

Si...

XLDnaute Barbatruc
Re : [MsgBox] : aligner les lignes

salut

Je* ne pense pas que tu puisses régler le problème simplement (police non proportionnelle : largeur de l’espace inférieure à celle d’un caractère et comme la tabulation est une suite d’espaces…)

Par contre tu pourras toujours gérer l’alignement dans d’un contrôle ListBox (d’un Usf ici).

*Qu'en penses-tu Staple ?
 

Pièces jointes

  • MsgBox Vs UserForm.xls
    41 KB · Affichages: 41

Staple1600

XLDnaute Barbatruc
Re : [MsgBox] : aligner les lignes

Bonsoir à tous


Staple, peux-tu commenter cette ligne, STP ?
xx = Split(x)(0): xxx = Split(x)(1)
Le séparateur par défaut de Split est l'espace (Chr(32))
(C'est indiqué dans l'aide VBE -> Touche F1 ;) )
Donc Split("toto tutu", " ") peut s'écrire Split("toto tutu")
Ensuite puisque Split retourne un Array
Split(x)(0) retourne le "premier" élément de cet Array
Split(x)(1) retourne le "second" élément de cet Array
Quand on aux deux points, c'est simplement un "raccourci" d'écriture VBA
Code:
sub a()
Range("A1").Clear
Range("A1")=Date
End sub
peut aussi s'écrire
Code:
sub a()
Range("A1").Clear: Range("A1")=Date
End sub

Si...
J'en pense qu'une MsgBox est là pour afficher un message bref et concis qui n'a pas forcément besoin de mise en forme.
[C'est mon inclinaison vers le K.I.S.S qui me fait écrire cela ;)]
 

F22Raptor

XLDnaute Impliqué
Re : [MsgBox] : aligner les lignes

Bonjour à tous, et joyeuses fêtes de fin d'année !
J'ai pas mal creusé ce souci, et comme disait "Si...", la police étant non proportionnelle ça ne marche pas simplement.

Pour régler la chose, il a fallu que j'identifie la taille de chaque caractère (j'ai d'ailleurs fait un poste à ce sujet) afin d'identifier la longueur en pixels du texte "première colonne".
Puis, une fois cette longueur identifiée, en comparant les longueurs des différents items de la colonne, je peux calculer le nombre de tabulations à insérer.

La largeur de texte dépend de la police de caractère utilisée dans la MsgBox (type et taille), et la fonction que j'ai trouvée ici (Largeur texte : Forum Access) me permet d'obtenir la largeur (dans Excel, sauf modif, la MsgBox est en Tahoma 8).

Ma macro doit donc ensuite identifier dans le texte de la première colonne le plus et le moins long, sachant que le "point pivot" qui pose problème est à 48 pixels (et les multiples de 48 pixels ; dans ce cas, il faut ajuster le nombre de tabulations).

Je joins le fichier.

@ bientôt et merci à tous pour votre aide régulière :)

EDIT : Je viens de repérer un bug : ça ne marche pas dans TOUS les cas
Il faut que je me repenche sur la question ! :D
 

Pièces jointes

  • alignement_msgbox.xlsm
    28.4 KB · Affichages: 39
Dernière édition:

F22Raptor

XLDnaute Impliqué
Re : [MsgBox] : aligner les lignes

A priori, j'ai corrigé le bug : voici donc la macro corrigée
J'ai dû ajouter une fonction "TRONQUER" qui reproduit la fonction TRONQUE qui n'est pas native dans VBA.

Bon réveillon :D
 

Pièces jointes

  • alignement_msgbox2.xlsm
    31.2 KB · Affichages: 42

Modeste geedee

XLDnaute Barbatruc
Re : [MsgBox] : aligner les lignes

Bonsour®
Voir ce lien :
Ce lien n'existe plus
La fonction DimTexte(Texte, Police, Taille[, Gras][,Italique]) suivante renvoie la largeur et la hauteur en pixels d'un texte en fonction de son format (contenu de la chaîne de caractères, nom de la police, taille de la police, attributs gras et / ou italique).
 

Statistiques des forums

Discussions
312 756
Messages
2 091 739
Membres
105 061
dernier inscrit
foxy1686