Trop de caractères - Hauteur de ligne.

  • Initiateur de la discussion LaurentTBT
  • Date de début
L

LaurentTBT

Guest
Bonsoir à tous
J'ai plusieurs cellules fusionnées sur une ligne. J'y inscrit du texte, et je voudrais ajuster la hauteur de la ligne en fonction du texte qui peut s'écrire sur plusieurs lignes. Malheureusement, que ce soit en manuel où sous VBA par l'intermédiaire de AutoFit, le dimensionnement auto ne s'effectue pas, alors que sur une cellule non fusionnée, cela fonctionne.
Première question: peut-on contourner le problème?

De mon côté, j'ai une petite usine à gaz qui me permet d'y remédier. Je recopie le contenu de ma cellule dans une seule cellule beaucoup plus sur la droite (en colonne BA), colonne que j'ai élargie pour qu'elle représente la même largeur de saisie que mes cellules fusionnées initiales. Et là, l'autofit est pris en compte.
Voici la procédure:
Private Sub Worksheet_Change(ByVal Target As Range)
Target.EntireRow.Range("BA1") = Target
Target.EntireRow.AutoFit
a = Target.RowHeight
Target.EntireRow.Range("BA1").ClearContents
Target.RowHeight = Application.WorksheetFunction.Max(a, 18)
Nouveau problème:
J'ai un bug à Target.EntireRow.Range("BA1") = Target,
lorsque la ligne comporte un texte très long
J'ai remplacé par Target.EntireRow.Range("BA1") = Target.text,
mais cela ne me copie pas tout le texte (limitation à 256 caractères???)
Comment puis-je copier une cellule qui contient tant de caractères?

Merci et bonne soirée.
 
Z

Zon

Guest
Salut,

Si j'ai bien compris en rajoutant pas saut de 256 (à adapter) tu peux y arriver en rajoutant un saut de ligne(équivalent de Alt+entrée) .Pour copier tout le texte passe par un tableau VBA sur le petit test que j'ai fait je n'ai la limitation de 1024 caractères:

Admettons que j'ai A1:AZ1 fusionnée, Testes ceci voir si c'est ce que tu veux:

Voici

Sub Laurent(C1 As Range, C2 As Range)
Dim T, I&, Texte$
T = C1.Value
For I = 1 To Len(T(1, 1)) Step 256
Texte = Texte & Chr(10) & Mid(T(1, 1), I, 255)
Next I
With C2
.Value = Texte
.Rows.AutoFit
End With
End Sub

dans l'évènementielle
Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
Laurent Target.CurrentRegion, Range("BA" & Target.Row)
Application.EnableEvents = True
End Sub


A+++
 
L

LaurentTBT

Guest
Bonjour à tous, Salut Zon

Merci pour cette réponse, Zon, qui m'a permis de mieux comprendre mon problème qui est en fait un peu plus vicieux que prévu:
D'abord, j'ai mal posé ma question. Bien évidemment, on peut aller au-delà de 256 caractères. Je n'avais pas pris la peine de compter précisément.
J'ai regardé dans l'aide d'excel, et voici les limitations (recherchez la rubrique d'aide Limites et spécifications Excel très instructives!)
- Longueur du contenu des cellules (texte): 32 767 caractères. Affichage de 1 024 uniquement dans une cellule et 32 767 dans la barre de formule.
(je ne comprends pas cette limite sur l'affichage à 1024, car j'arrive à en afficher plus directement dans une cellule, mais on verra plus bas)
- Longueur du contenu des formules: 1 024 caractères
- Hauteur des lignes 409 points

En fait, j'ai mis dans ma cellule ceci:
AaaaaaaaaaAaaaaaaaaaAaaaaaaaaaAaaaaaaaaaAaaaaaaaaaAaaaaaaaaaAaaaaaaaaaAaaaaaaaaaAaaaaaaaaaAaaaaaaaa
AaaaaaaaaaAaaaaaaaaaAaaaaaaaaaAaaaaaaaaaAaaaaaaaaaAaaaaaaaaaAaaaaaaaaaAaaaaaaaaaAaaaaaaaaaAaaaaaaaa
Il y a 99 caractères car le saut de page compte! Et j'ai mis une bonne vingtaine de lignes identiques.
Alors en fait, quand je fais Range("BA1") = Target, en BA1, il y a bien tout le texte initial, sans limitation à 1024 caractères.
MAIS, la limitation intervient lors su dimensionnement auto de la hauteur. Là, pour calculer cette hauteur, Excel ne considère que les 1024 premiers caractères du texte (j'ai vérifié en mettant 1020 caractères suivis de plusieurs saut de ligne, et on s'arrête toujours en hauteur au caractère 1024). Ce qui explique que mon texte est "bridé". Pourtant, en manuel, je peux augmenter ma hauteur de ligne au-delà, jusqu'o la limite de 409 points.

Donc il va falloir que je recrée une fonction "AutoFit" non bridée. Et pour cela, il me faut déterminer le nombre de lignes dans ma cellule, sachant que cette cellule à la propriété de ,"mise à la ligne" automatique lorsqu'on arrive en butée à droite. Donc il ne suffit pas de compter les sauts de lignes.
Quelqu'un a-t-il une idée sur la manière de connaître ce nombre de lignes? Qu'on puisse quand même aller jusqu'à la limite qui elle ne pourra jamais être dépassée de la hauteur de ligne à 409 points!
Bref encore une question tordue!

Bonne journée à tous.
 
L

LaurentTBT

Guest
Hello,

C'est bon, j'ai trouvé une solution. C'est un peu compliqué à expliquer, mais ça marche!

En quelques mots: je recopie le contenu de ma cellule dans un textbox dont la largeur a été étalonnée pour que les sauts de lignes automatiques se produisent au même endroit que dans ma cellule d'origine.
Le textbox, lui, accepte de se dimensionner automatiquement en hauteur quelque soit le nombre de caractères (enfin, je ne suis pas allé voir la limite, mais c'est largement au-delà de 1024 caractères)
Ensuite, en fonction de la hauteur de ce textbox, après lui avoir mis Autosize à true, j'en déduis le nombre de lignes. (une simple règle de trois entre la hauteur s'il n'a qu'une seule ligne, et la hauteur s'il en a plusieurs)
Enfin, dans ma cellule intermédiaire non fusionnée, j'inscris autant de sauts de ligne qu'il n'y a de lignes dans mon textbox. Et je lui applique AutoFit.
Et là, le nombre de caractère est de 1 par ligne seulement, ce qui permet de voir venir avant d'arriver à la limite de 1024 sauts de lignes! De toute façon, on sera bloqué avant par la hauteur max de la ligne contre laquelle on ne peut rien!

Voilà, c'est vraiment du bricolage, mais on peut presque faire du traitement de texte avec Excel!

Bonne journée à tous.




PS: voici la macro, pour info.
Target.RowHeight = 18
If Target.Range("A1") = "" Then
Target.Font.Bold = False
Target.Font.Italic = False
Target.Font.Underline = xlUnderlineStyleNone
Target.HorizontalAlignment = xlLeft
Else
If Target.Characters.Count > 1024 Then
Me.TbxAutoFit.AutoSize = False
Me.TbxAutoFit.Height = 13.5
Me.TbxAutoFit.Width = 723.75 'Correspond à la longueur de mes cellules fusionnées initiales (Target)
Me.TbxAutoFit = Target
Me.TbxAutoFit.AutoSize = True
NbreLignes = (Me.TbxAutoFit.Height - 13.5) / 10.5 + 1 '13,5 est la hauteur de TextBox avec 1 seule ligne, 10,5 est ce qui s'y ajoute pour
chaque ligne (ces valeurs dépendent de la police!!!)
Target.EntireRow.Range("BA1") = String(NbreLignes - 1, Chr(10))
Me.TbxAutoFit.AutoSize = False
Me.TbxAutoFit.Height = 13.5
Me.TbxAutoFit.Width = 723.75
Me.TbxAutoFit = ""
Else
Target.EntireRow.Range("BA1") = Target
End If
Target.EntireRow.AutoFit
a = Target.Height
Target.EntireRow.Range("BA1").ClearContents
Target.RowHeight = Application.WorksheetFunction.Max(a, 18)
End If
 

Discussions similaires

Membres actuellement en ligne

Statistiques des forums

Discussions
312 765
Messages
2 091 892
Membres
105 084
dernier inscrit
lca.pertus