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 iQu'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.
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 iMerci 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 FunctionJ'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 = TrueSteelson a écrit :as-tu déjà des cellules fusionnées concernant cette ligne ?
je fusionne toutes les lignes.
Si tu fusionnes des lignes, autofit ne fonctionnera pas correctement !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
Steelson a écrit :Si tu fusionnes des lignes, autofit ne fonctionnera pas correctement !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
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 iEt ç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 = Truec'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...
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 Thenpour 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 ile 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