Créer un retour à la ligne performant

Bonjour Excelliens(nes), Forum,

Voilà aujourd'hui, je suis dans une "problématique" le VbCr ou VBLF, ou en mode vba chr(10) ou chr(13) ne me plait pas.

Pourquoi?

parce que le retour à la ligne ce fait dans la cellule ce qui peut être bien si on ajoute la propriété WrapText = True; et encore!!!

Le contexte est que j'utilise Excel comme "Base de donnée", cette base permet de me générer des devis.

Sur une page par défaut avec une en tête et un pied page, j'ai 52 lignes et 7 colonnes, les 4 premières lignes et les 3 dernières lignes de la page sont réservé.

J'ai des phrases qui dépassent les 7 colonnes

donc je me suis dit je vais utiliser la propriété wraptext, le retour à la ligne ce fait bien, mais la hauteur de cellule reste inchangé!

For i = 1 To derLg
        If k < 45 Then
            wsDevis.Range(Cells(k + (4 + (p * nbligne)), 1), Cells(k + (4 + (p * nbligne)), 7)).MergeCells = True
           'MsgBox wsCF.Cells(i + 12, posId + 2)
           txt = wsCF.Cells(i + 12, posId + 2)
            wsDevis.Cells(k + (4 + (p * nbligne)), 1) = txt ' wsCF.Cells(i + 12, posId + 2)
             wsDevis.Range(Cells(k + (4 + (p * nbligne)), 1), Cells(k + (4 + (p * nbligne)), 7)).WrapText = True
             wsDevis.Range(Cells(k + (4 + (p * nbligne)), 1), Cells(k + (4 + (p * nbligne)), 7)).AddIndent = False'or true ne change rien
             wsDevis.Range(Cells(k + (4 + (p * nbligne)), 1), Cells(k + (4 + (p * nbligne)), 7)).VerticalAlignment = xlCenter
             wsDevis.Range(Cells(k + (4 + (p * nbligne)), 1), Cells(k + (4 + (p * nbligne)), 7)).HorizontalAlignment = xlLeft
        Else
        k = 0
        p = p + 1
        End If
    k = k + 1
    Next i

Qu'est ce qui manque dans mon code pour que la ligne s'ajuste bien?

Pour que l'affichage des phrases soit complète.

la pièce jointe vous montre ce que sa me donne avec ce code

Merci de votre lecture,

A vous lire,

Medas.

14classeur2.xlsx (53.06 Ko)

Bonjour,

mets ton fichier en xlsm qu'on puisse regarder la macro et t'aider ...

Salut,

Si je comprends bien tu veux un auto-ajustement de la hauteur de chaque ligne ?

Si oui, un truc du style :

For i = 5 to 54 'car les 4 premières et trois dernières lignes sont réservées
    Rows(i).EntireRow.AutoFit
Next i

Merci de ta lecture,

Le soucis pour générer le devis, il faut passer par un formulaire et connaitre la manipulation à suivre.

Si tu souhaites juste voir la macro voici:

Function corps_Devis()
    Dim Categorie, champs As String
    Dim posId, posTC, i, j, k, derLgSub As Long
    Dim wsCF, wsSub, wsDevis As Worksheet
    Dim rg As Range
    Set wsSub = ThisWorkbook.Sheets("DataSub")
    Set wsDevis = ThisWorkbook.Sheets("CORPS DEVIS")
    Set wsCF = ThisWorkbook.Sheets("LISTE_CONFIGURATIONS_POSSIBLES")
    'initialise la dernière valeur du champs de la BDD
    derLgSub = nombreElementDansUnTableau("DataSub", 3, 89)
    Call NettoyagePageDevisAvantGeneration("CORPS DEVIS", 5, 1400)
    If ConfigForm.ComboBox_Version.SelText = "ENROBES Véhicules Industriel" Then
        champs = "ENROBES Véhicules Industriel"
        champs = champs + ConfigForm.ComboBox_TailleEqt.SelText
        champs = champs + ConfigForm.ComboBox_NiveauEqt.SelText
    ElseIf ConfigForm.ComboBox_Version.SelText = "POCKETS" Then
        champs = "POCKETS"
        champs = champs + ConfigForm.ComboBox_TailleEqt.SelText
        champs = champs + ConfigForm.ComboBox_NiveauEqt.SelText
    Else
        champs = ConfigForm.ComboBox_Designation.SelText
        champs = champs + ConfigForm.ComboBox_TailleEqt.SelText
        champs = champs + ConfigForm.ComboBox_NiveauEqt.SelText
    End If
    For i = 3 To derLgSub + 2
        If champs = wsSub.Cells(i, 90) Then
            'ici on affecte la position de la colonne ou se trouve la gamme correspondant au champs=typologie de la gamme
'            Categorie = wsSub.Cells(i, 11) 'récupère la référence de la gamme
            posId = wsSub.Cells(i, 91) 'position de l'index sur la feuille DataSub
            posTC = wsSub.Cells(i, 92) 'position du TC sur la feuille DataSub
        End If
    Next i
    k = 1
    p = 0
    nbligne = 52
    derLg = nombreElementDansUnTableau("LISTE_CONFIGURATIONS_POSSIBLES", 13, posId) 'on récupère la dernière ligne de la feuille CONFIGURATION POSSIBLE en fonction de la colonne
    For i = 1 To derLg
        If k < 45 Then
            wsDevis.Range(Cells(k + (4 + (p * nbligne)), 1), Cells(k + (4 + (p * nbligne)), 7)).MergeCells = True
           'MsgBox wsCF.Cells(i + 12, posId + 2)
           txt = wsCF.Cells(i + 12, posId + 2)
            wsDevis.Cells(k + (4 + (p * nbligne)), 1) = txt ' wsCF.Cells(i + 12, posId + 2)
             wsDevis.Range(Cells(k + (4 + (p * nbligne)), 1), Cells(k + (4 + (p * nbligne)), 7)).Select
             wsDevis.Range(Cells(k + (4 + (p * nbligne)), 1), Cells(k + (4 + (p * nbligne)), 7)).WrapText = True
             wsDevis.Range(Cells(k + (4 + (p * nbligne)), 1), Cells(k + (4 + (p * nbligne)), 7)).AddIndent = True
             wsDevis.Range(Cells(k + (4 + (p * nbligne)), 1), Cells(k + (4 + (p * nbligne)), 7)).VerticalAlignment = xlBottom
             wsDevis.Range(Cells(k + (4 + (p * nbligne)), 1), Cells(k + (4 + (p * nbligne)), 7)).HorizontalAlignment = xlLeft
             wsDevis.Range(Cells(k + (4 + (p * nbligne)), 1), Cells(k + (4 + (p * nbligne)), 7)).EntireRow.AutoFit
        Else
        k = 0
        p = p + 1
        End If
    k = k + 1
    Next i
'    Set WS = ThisWorkbook.Sheets("CONFIGURATION POSSIBLE")           ' nom de la feuille de nos données
'    Set rg = WS.Range(Categorie)                             ' notre cellule de référence de notre datatable
'    For j = 1 To derLg
'        If rg.Offset(i, posTC) = "TC" Then
'            k = k + 1
'
'            If rg.Offset(i, -1) = "c" Then
'
'            ElseIf rg.Offset(i, -1) = "t" Then
'
'            ElseIf rg.Offset(i, -1) = "o" Then
'
'            Else
'
'            End If
'        End If
'    Next j
    Worksheets("CORPS DEVIS").Range("A5:G675").Columns.AutoFit
End Function

J'utilise le auto fit mais va t il etre aussi efficace en ligne ?

Bonjour Kit,

Oui juste un auto-ajustement de la hauteur. mais dommage je ne sais pas pourquoi la propriété autofit ne fonctionnne pas

Merci de ta réponse


Silux a écrit :

J'utilise le auto fit mais va t il etre aussi efficace en ligne ?

je ne sais pas pourquoi il ne fonctionne pas


medas a écrit :

Bonjour Kit,

Oui juste un auto-ajustement de la hauteur. mais dommage je ne sais pas pourquoi la propriété autofit ne fonctionnne pas

Merci de ta réponse


Silux a écrit :

J'utilise le auto fit mais va t il etre aussi efficace en ligne ?

je ne sais pas pourquoi il ne fonctionne pas

sur le site msdn il est écrit:

Modifie la largeur des colonnes de la plage ou la hauteur des lignes de la plage pour les ajuster au mieux.


la seule possibilité qui me reste à faire et de compter le nombre de caractère et de fusionner deux ligne ou plus en fonction du nombre de caractère. Mais le hic faudra je prenne en compte la fusion pour que je réserve toujours mes quatres première lignes et et trois dernières lignes, et donc ma variable intermédiaire variera qui rester toujours de 45 lignes changera en fonction des pages.

medas a écrit :

Bonjour Kit,

Oui juste un auto-ajustement de la hauteur. mais dommage je ne sais pas pourquoi la propriété autofit ne fonctionnne pas

Merci de ta réponse

as-tu déjà des cellules fusionnées concernant cette ligne ?

wsDevis.Range(Cells(k + (4 + (p * nbligne)), 1), Cells(k + (4 + (p * nbligne)), 7)).MergeCells = True
Steelson a écrit :

as-tu déjà des cellules fusionnées concernant cette ligne ?

je fusionne toutes les lignes.

medas a écrit :

Oui juste un auto-ajustement de la hauteur. mais dommage je ne sais pas pourquoi la propriété autofit ne fonctionnne pas

Si tu fusionnes des lignes, autofit ne fonctionnera pas correctement !
Steelson a écrit :
medas a écrit :

Oui juste un auto-ajustement de la hauteur. mais dommage je ne sais pas pourquoi la propriété autofit ne fonctionne pas

Si tu fusionnes des lignes, autofit ne fonctionnera pas correctement !

Comment ça ne fonctionnera pas correctement?

Je fais le scénario du code quand cellule pas fusionnée. Corrige-moi si je me trompe.

Je colle mes infos dans la colonne A, je fais un autofit , il m'ajuste les cellules un à un.

Autres scénario même chose que le premier je fusionne les 7 colonnes, et je fais un coup de autofit. Ne fonctionne pas ????

Il existe deux moyens pour procéder avec et sans autofit. Avec autofit et de mettre une seule colonne sur ta page donc tu modifies la largeur de ta colonne et autofit fonctionnera en théorie.

Autres solutions en fonction du nombre de caractères, avec la fusion des colonnes, tu fusionnes une à deux lignes et tu prends en comptes dans le compteur pour que ma variable ne dépasse pas 45.

J’ai opté pour la deuxième solution

    For i = 1 To derLg
        If k < 45 Then
           TXT = wsCF.Cells(i + 12, posId + 2)
            If Len(TXT) > 90 Then
                wsDevis.Range(Cells(k + (4 + (p * nbligne)), 1), Cells(k + (4 + m + (p * nbligne)), 7)).Merge
                wsDevis.Cells(k + (4 + (p * nbligne)), 1) = TXT ' wsCF.Cells(i + 12, posId + 2)
                wsDevis.Range(Cells(k + (4 + (p * nbligne)), 1), Cells(k + (4 + (p * nbligne)), 1)).EntireRow.AutoFit
                wsDevis.Range(Cells(k + (4 + (p * nbligne)), 1), Cells(k + (4 + (p * nbligne)), 1)).Select
                wsDevis.Range(Cells(k + (4 + (p * nbligne)), 1), Cells(k + (4 + (p * nbligne)), 1)).WrapText = True
                wsDevis.Range(Cells(k + (4 + (p * nbligne)), 1), Cells(k + (4 + (p * nbligne)), 1)).AddIndent = True
                wsDevis.Range(Cells(k + (4 + (p * nbligne)), 1), Cells(k + (4 + (p * nbligne)), 1)).VerticalAlignment = xlBottom
                wsDevis.Range(Cells(k + (4 + (p * nbligne)), 1), Cells(k + (4 + (p * nbligne)), 1)).HorizontalAlignment = xlLeft
            ElseIf Len(TXT) > 200 Then
                 wsDevis.Range(Cells(k + (4 + (p * nbligne)), 1), Cells(k + (4 + n + (p * nbligne)), 7)).MergeCells = True
                wsDevis.Cells(k + (4 + (p * nbligne)), 1) = TXT ' wsCF.Cells(i + 12, posId + 2)
                wsDevis.Range(Cells(k + (4 + (p * nbligne)), 1), Cells(k + (4 + (p * nbligne)), 1)).EntireRow.AutoFit
                wsDevis.Range(Cells(k + (4 + (p * nbligne)), 1), Cells(k + (4 + (p * nbligne)), 1)).Select
                wsDevis.Range(Cells(k + (4 + (p * nbligne)), 1), Cells(k + (4 + (p * nbligne)), 1)).WrapText = True
                wsDevis.Range(Cells(k + (4 + (p * nbligne)), 1), Cells(k + (4 + (p * nbligne)), 1)).AddIndent = True
                wsDevis.Range(Cells(k + (4 + (p * nbligne)), 1), Cells(k + (4 + (p * nbligne)), 1)).VerticalAlignment = xlBottom
                wsDevis.Range(Cells(k + (4 + (p * nbligne)), 1), Cells(k + (4 + (p * nbligne)), 1)).HorizontalAlignment = xlLeft
            Else
                wsDevis.Range(Cells(k + (4 + (p * nbligne)), 1), Cells(k + (4 + (p * nbligne)), 7)).MergeCells = True
                wsDevis.Cells(k + (4 + (p * nbligne)), 1) = TXT ' wsCF.Cells(i + 12, posId + 2)
                wsDevis.Range(Cells(k + (4 + (p * nbligne)), 1), Cells(k + (4 + (p * nbligne)), 1)).EntireRow.AutoFit
                wsDevis.Range(Cells(k + (4 + (p * nbligne)), 1), Cells(k + (4 + (p * nbligne)), 1)).Select
                wsDevis.Range(Cells(k + (4 + (p * nbligne)), 1), Cells(k + (4 + (p * nbligne)), 1)).WrapText = True
                wsDevis.Range(Cells(k + (4 + (p * nbligne)), 1), Cells(k + (4 + (p * nbligne)), 1)).AddIndent = True
                wsDevis.Range(Cells(k + (4 + (p * nbligne)), 1), Cells(k + (4 + (p * nbligne)), 1)).VerticalAlignment = xlBottom
                wsDevis.Range(Cells(k + (4 + (p * nbligne)), 1), Cells(k + (4 + (p * nbligne)), 1)).HorizontalAlignment = xlLeft
            End If
        Else
            k = 0
            p = p + 1
        End If
        If Len(TXT) > 90 Then
            k = k + 1 + m
        ElseIf Len(TXT) > 200 Then
            k = k + 1 + n
        Else
            k = k + 1
        End If
    Next i

Et ça fait très bien ce que je lui demande.

Demain matin, j'essaierai la première solution.

Merci d'être penché sur ce problème, si tu veux MS Excel depuis 2007 Autofit avec des colonnes fusionnées ne fais pas son boulot.

Et je pensais qu'autofit est égales au bouton renvoyer à la ligne automatiquement

C’est la macro du bouton renvoyer à la ligne automatiquement

With Selection
        .HorizontalAlignment = xlGeneral
        .VerticalAlignment = xlBottom
        .WrapText = True
        .Orientation = 0
        .AddIndent = False
        .IndentLevel = 0
        .ShrinkToFit = False
        .ReadingOrder = xlContext
        .MergeCells = False
    End With 

Je ne mets pas résolu

Dans ma solution au dessus, le autofit ne sert à rien, mais je fusionne une ligne ou deux avec la variable m ou n


Je fusionne des colonnes et non des lignes as-tu lu le code ???

medas a écrit :

Si tu fusionnes des lignes

medas a écrit :
Steelson a écrit :

as-tu déjà des cellules fusionnées concernant cette ligne ?

je fusionne toutes les lignes.

medas a écrit :

Je fusionne des colonnes et non des lignes


medas a écrit :

Je fusionne des colonnes et non des lignes as-tu lu le code ???

Non je n'ai pas lu la macro car j'attendais ceci

Steelson a écrit :

Bonjour,

mets ton fichier en xlsm qu'on puisse regarder la macro et t'aider ...


medas a écrit :
medas a écrit :
Steelson a écrit :

Si tu fusionnes des lignes, autofit ne fonctionnera pas correctement !

Comment ça ne fonctionnera pas correctement?

Oui tu as raison

Bonjour tout le monde

Question à la con du jour : sans réinventer le feu et la roue, le « renvoyer à la ligne automatiquement » dans le ruban Accueil => Alignement que propose excel ne suffit pas à régler le soucis ? (si j'ai bien suivis le problème)

ECG

Bonjour Excelleurs(ses), ExcelCorGame, Steelson,kit, forum,

Alors après lecture de mon post, je me trouve incompréhensible par mes explications.

la macro que j'ai réalisé, au début, pour chaque ligne je fusionne les colonnes --> les cellules A5:G5 sont fusionnées

le code ci-dessous:

wsDevis.Range(Cells(k + (4 + (p * nbligne)), 1), Cells(k + (4 + (p * nbligne)), 7)).MergeCells = True

c'est quand tu m'as demandé le fichier.

et maintenant je fusionne les lignes sous deux conditions si le len(texte)>90 alors je fusionne une ligne de plus --> A16:G17, si len(texte)200 alors je fusionne deux lignes -->A16:G18.

ExcelCoreGame a écrit :

Bonjour tout le monde

le « renvoyer à la ligne automatiquement » dans le ruban Accueil => Alignement que propose excel ne suffit pas à régler le soucis ?

normalement oui, la macro du bouton renvoyer à la ligne automatiquement : c'est sa

    With Selection
            .HorizontalAlignment = xlGeneral
            .VerticalAlignment = xlBottom
            .WrapText = True
            .Orientation = 0
            .AddIndent = False
            .IndentLevel = 0
            .ShrinkToFit = False
            .ReadingOrder = xlContext
            .MergeCells = False
        End With 

mais quand je le teste sur mon fichier il le fait bien mais n'ajuste pas la hauteur de la cellule.

Merci de votre lecture.

Cordiales,

Medas

Bonjour,

Le renvoi automatique à ligne s'opère à peu près bien dans une cellule, en ajustant la hauteur de ligne, cet ajustement ne se fait plus dans le cas de plusieurs cellules, c'est à dire en cas de fusion.

Quant à Autofit, je l'ai toujours classée dans le type de commande dont le résultat est non fiable...

Excel n'étant pas un traitement de texte, pour un résultat conforme à ce qu'on attend, je ne connais qu'un modèle aux emplacements prédéfinis et accueillant des mentions elles aussi prédéfinies...

Cordialement.

Bonjour Excelleurs(ses), Mferrand,

Merci de confirmer mes dires.

Sujet résolu avec le système D

Cordialement,

Medas

medas a écrit :

Sujet résolu avec le système D

Ça me rappelle que j'opérais souvent ainsi au boulot... le boss était content du résultat (mais il n'avait pas à regarder comment j'y arrivais !)

Bonne continuation.

Une idée à la con peut être mais:

Je n'ai pas étudier à la loupe les macros proposés par les autres mais j'imagine qu'on te propose de faire des retours à la ligne par macro

Je proposerais :

1. De choisir un nombre max de caractère dans une ligne que tu souhaites genre max 200 caractères par ligne pour pas que ta colonne fasse tout l'écrans

2. On parcours le texte que l'on veut mettre en cellule caractère par caractère, quand on arrive à 200, hop on reviens à la ligne (on incrémente une variable qui garde en mémoire le nombre de fois ou tu es revenue à la ligne) et on continue la lecture du texte.

Du coup genre tu as 404 caractère, tu auras 2 fois une ligne de 200 et une ligne de 4 caractère en cellule soit 3 lignes au total à afficher

3. Selon la taille des caracères ou la police de caractère ou arbitrairement on choisis qu'une ligne vaut une hauteur de ligne de 15 dans excel dans pour notre case exemple après avoir tout spliter par ligne de 200, on ferais un cells(X,X).rowheight = 15* nombre de ligne (soit 15*3 =45 ici)

Qu'en pensez vous pour ceux qui ont fait des macros pour mettre à la ligne automatiquement?

Si ta solution fonctionne c'est niquel mais je me posais la question si ce genre de raisonnement donnerais une belle solution (surtout si un jour j'en ai besoin, j'aurais l'idée de base dans mon sac ^^)

En attente de vos retours

ECG

Bonjour ExcelCoreGame, Excelleurs(ses),

alors l'idée est bonne si tu veux trouvez des mots hachés, il faudra rajouter quelques conditions pour éviter le hachage des mots donc rajouter une condition sur 200éme caractère n+1 et n-1 = vide, pour pouvoir passer à la ligne, pour ton texte si c'est par défaut ok pour la valeur 15 mais si ta police augmente ou diminue faudra mettre une condition sur ta police..

Sinon pour le reste c'est à peu près ce que j'ai fait

ExcelCoreGame a écrit :

1. De choisir un nombre max de caractère dans une ligne que tu souhaites genre max 200 caractères par ligne pour pas que ta colonne fasse tout l'écrans

 If Len(TXT) > 90 Then
ElseIf Len(TXT) > 200 Then

pour le code

 For i = 1 To derLg
        If k < 45 Then
           TXT = wsCF.Cells(i + 12, posId + 2)
            If Len(TXT) > 90 Then
                wsDevis.Range(Cells(k + (4 + (p * nbligne)), 1), Cells(k + (4 + m + (p * nbligne)), 7)).Merge
                wsDevis.Cells(k + (4 + (p * nbligne)), 1) = TXT ' wsCF.Cells(i + 12, posId + 2)
               wsDevis.Range(Cells(k + (4 + (p * nbligne)), 1), Cells(k + (4 + (p * nbligne)), 1)).EntireRow.AutoFit
                wsDevis.Range(Cells(k + (4 + (p * nbligne)), 1), Cells(k + (4 + (p * nbligne)), 1)).VerticalAlignment = xlBottom
                wsDevis.Range(Cells(k + (4 + (p * nbligne)), 1), Cells(k + (4 + (p * nbligne)), 1)).HorizontalAlignment = xlLeft
            ElseIf Len(TXT) > 200 Then
                 wsDevis.Range(Cells(k + (4 + (p * nbligne)), 1), Cells(k + (4 + n + (p * nbligne)), 7)).MergeCells = True
                wsDevis.Cells(k + (4 + (p * nbligne)), 1) = TXT ' wsCF.Cells(i + 12, posId + 2)
                wsDevis.Range(Cells(k + (4 + (p * nbligne)), 1), Cells(k + (4 + (p * nbligne)), 1)).VerticalAlignment = xlBottom
                wsDevis.Range(Cells(k + (4 + (p * nbligne)), 1), Cells(k + (4 + (p * nbligne)), 1)).HorizontalAlignment = xlLeft
            Else
                wsDevis.Range(Cells(k + (4 + (p * nbligne)), 1), Cells(k + (4 + (p * nbligne)), 7)).MergeCells = True
                wsDevis.Cells(k + (4 + (p * nbligne)), 1) = TXT ' wsCF.Cells(i + 12, posId + 2)
               wsDevis.Range(Cells(k + (4 + (p * nbligne)), 1), Cells(k + (4 + (p * nbligne)), 1)).EntireRow.AutoFit
                wsDevis.Range(Cells(k + (4 + (p * nbligne)), 1), Cells(k + (4 + (p * nbligne)), 1)).VerticalAlignment = xlBottom
                wsDevis.Range(Cells(k + (4 + (p * nbligne)), 1), Cells(k + (4 + (p * nbligne)), 1)).HorizontalAlignment = xlLeft
            End If
        Else
            k = 0
            p = p + 1
        End If
        If Len(TXT) > 90 Then
            k = k + 1 + m
        ElseIf Len(TXT) > 200 Then
            k = k + 1 + n
        Else
            k = k + 1
        End If
    Next i

le code ci dessus permet : en fonction du nombre de caractère de fusionner une ou deux ligne et donc je respecte toujours le même nombre de ligne sur ma page; avec mes lignes réservé en tête de page et en pied de page

Cordalies,

Medas

Bien vu le hachage de mot ! sinon ça donnerait du grand n'importe quoi en effet

Merci pour ce code, je vais regarder en détails

ECG

Rechercher des sujets similaires à "creer retour ligne performant"