Imprimer texte en colonnes - justifier un texte

Contenu du snippet

Je vous propose trois petites procédures pour imprimer du texte dans une colonne dont on a défini la largeur au préalable en centimètres.

Faites un copier coller du code ci-dessous et voyez....

Remarques :
La procédure Imprime1 envoie le texte dans une colonne tel quel sans se soucier des mots.
La prcédure Imprime2 ne coupe pas les mots et les renvoie à la ligne si nécessaire

La procédure Justifier justifie le texte...

Je ne prétends pas faire là un travail digne d'être introduit dans un module mais je me suis donné quelques contraintes interessantes:

Je ne voulait pas travailler avec des tableaux, je n'ai travaillé que sur le texte directement, c'est moins lourd.
J'ai limité le nombre d'instructions à 2, à savoir Mid() et Printer.TextWidth. Pourquoi me direz-vous ? Pourquoi pas en fait !!;-)

Pour vous faire gagner un peu de temps, j'ai commenté mes 3 procédures .
Le principe est très simple (sauf qu'il faut s'amuser un peu avec les indices i, j ...) :

On découpe le texte en paquets (lignes) d'une longueurs définie en centimètres.
On affiche chaque ligne les une en dessous des autres.

Pour la JUSTIFICATION, il faut en plus recalculer pour chaque ligne un espace moyen entre les mots pour ajuster la ligne à la bonne longueur.

Voilà, il me semble que ce code est assez simple...mais on peut sans doute faire mieux, à voir !!

Source / Exemple :


Private Sub Form_Load()
'------------Taille de la Police = 15---------------------
Printer.FontSize = 15

Call IMPRIME1("Petit test pour voir ce texte s'imprimer dans une colonne de 4 cm de large ...", 5, 7, 4)
Call IMPRIME2("Petit test pour voir ce texte s'imprimer dans une colonne de 4 cm de large   .....", 9, 10, 4)
Call JUSTIFIER("Petit test pour voir ce texte s'imprimer dans une colonne de 4 cm de large   .....", 13, 13, 4)
Printer.EndDoc

End Sub

'----------- Procédure de base (code optimisé) qui découpe le texte pour le faire tenir dans une colonne

Public Sub IMPRIME1(Texte As String, X As Currency, Y As Currency, Largeur As Currency)

Dim i, j As Integer
Printer.ScaleMode = vbCentimeters
Printer.CurrentY = Y
i = 1
Do
    j = 0
'---------------On découpe le texte en lignes, chaque ligne mesurant "Largeur" cm------
    Do
        j = j + 1
    Loop While (Printer.TextWidth(Mid(Texte, i, j + 1)) <= Largeur) And (i + j <= Len(Texte))

'-------------------On supprime les éventuels espaces au début de la ligne obtenue---------------
    
    Do While Mid(Texte, i, 1) = " "
        i = i + 1: j = j - 1
    Loop

' -----------------On envoie la ligne vers l'imprimante----------------
    Printer.CurrentX = X
    Printer.Print Mid(Texte, i, j)
    i = i + j: j = j - 1
Loop While i < Len(Texte)

End Sub

'---------- Première évolution : les mots ne sont pas coupés et sont renvoyés à la ligne.

Public Sub IMPRIME2(Texte As String, X As Currency, Y As Currency, Largeur As Currency)

Dim i, j, k As Integer
Printer.ScaleMode = vbCentimeters
Printer.CurrentY = Y
i = 1
Do
    j = 0: k = 1
'---------------On découpe le texte en lignes, chaque ligne mesurant "Largeur" cm------
    Do
        j = j + 1
        If Mid(Texte, i + j - 1, 1) = " " Then k = j
    Loop While (Printer.TextWidth(Mid(Texte, i, j + 1)) <= Largeur) And (i + j <= Len(Texte))
    Printer.CurrentX = X

'------------------- Si on coupe un mot en fin de ligne alors on renvoie ce mot à la ligne-------------
    If (i + j < Len(Texte)) And (Mid(Texte, i + j - 1, 1) <> " ") And (Mid(Texte, i + j, 1) <> " ") And (k > 1) Then j = k

'-------------------On supprime les éventuels espaces au début de la ligne obtenue---------------
    
    Do While Mid(Texte, i, 1) = " "
        i = i + 1
    Loop
' -----------------On envoie la ligne vers l'imprimante----------------
    Printer.Print Mid(Texte, i, j)
    i = i + j
Loop While i < Len(Texte)

End Sub

'------------ Comme son nom l'indique, elle justifie "Texte" ------------------------

Public Sub JUSTIFIER(Texte As String, X As Currency, Y As Currency, Largeur As Currency)

Dim i, j, jaux, k, c, nbespace As Integer
Dim PosX, PosY, Emoyen As Currency
Printer.ScaleMode = vbCentimeters
Printer.CurrentY = Y
i = 1
Do
    j = 0: k = 1: nbespace = 0
'-------------------Découpage du texte en lignes de "largeur" cm----------------
    Do
        j = j + 1
        If Mid(Texte, i + j - 1, 1) = " " Then
            k = j
        End If
    Loop While (Printer.TextWidth(Mid(Texte, i, j + 1)) <= Largeur) And (i + j <= Len(Texte))
'------------------- Si on coupe un mot en fin de ligne alors on renvoie ce mot à la ligne-------------

    If (i + j < Len(Texte)) And (Mid(Texte, i + j - 1, 1) <> " ") And (Mid(Texte, i + j, 1) <> " ") And (k > 1) Then j = k

'-------------------On supprime les éventuels espaces au début et en fin de ligne---------------

    PosX = X: PosY = Printer.CurrentY
    jaux = j
     Do While Mid(Texte, i + jaux - 1, 1) = " "
        jaux = jaux - 1
    Loop
    Do While Mid(Texte, i, 1) = " "
        i = i + 1: jaux = jaux - 1
    Loop
'------------------On détermine le nombre d'espaces restants dans la ligne---------------

    For c = 1 To jaux
        If Mid(Texte, i + c - 1, 1) = " " Then nbespace = nbespace + 1
    Next c
'-----------------On détermine l'espace moyen entre chaque mots pour JUSTIFIER la ligne -------------
    If nbespace <> 0 Then Emoyen = (Largeur - Printer.TextWidth(Mid(Texte, i, jaux)) + nbespace * Printer.TextWidth(" ")) / nbespace

'----------------On envoie vers l'imprimante la ligne lettre par lettre avec les espaces calculés-----------

    For c = 1 To jaux
        If (Mid(Texte, i + c - 1, 1) = " ") Then
            PosX = PosX + Emoyen - Printer.TextWidth(" ")
        Else
            Printer.CurrentY = PosY
            Printer.CurrentX = PosX + Printer.TextWidth(Mid(Texte, i, c - 1))
            Printer.Print Mid(Texte, i + c - 1, 1)
        End If
    Next c
'--------------et zou...ligne suivante---------------------
    i = i + j
Loop While i < Len(Texte)

End Sub

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.