[Résolu]Largeur exacte d'une colonne et ajustement automatique de cellules fusionnées

mdidish

XLDnaute Junior
Bonjour

J'ai un problème concernant la largeur des colonnes :
- dans mon classeur, toutes les colonnes ont une largeur de "2"
- je pensais que 6 cellules fusionnées auraient une largeur de "12", et donc contiendrait autant de texte qu'une cellule de largeur "12"
- or ce n'est pas le cas, une colonne de 12 est moins large que 6 colonnes de 2.

Ce problème s'intègre dans l'écriture d'une macro pour ajuster automatiquement la hauteur de cellules fusionnées avec retour à la ligne.
Je joins un fichier test dans lequel les cellules fusionnées dont la hauteur doit s'ajuster automatiquement sont en A2, F5, C7. J'ai écrit cette macro dans le code de la feuille, qui fonctionne presque sauf quand le nombre de caractères est limite (la hauteur de ligne étant alors trop grande :

VB:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Targe_2 As Range
    
On Error GoTo errorHandler
    
If Not Intersect(Target, Range("A2")) Is Nothing Or Not Intersect(Target, Range("F5")) Is Nothing Or Not Intersect(Target, Range("C7")) Is Nothing Then
    Set Target_2 = Worksheets("Résumé").Range("DD1000") ' définir une cellule hors du tableau
    Hauteur_T2 = Target_2.RowHeight
    Largeur_T2 = Target_2.ColumnWidth
    Target.MergeArea.WrapText = True
    Target_2.MergeArea.WrapText = True

    Target_2.Font.Name = Target.Font.Name
    Target_2.Font.Size = Target.Font.Size
    Target_2.ColumnWidth = Target.MergeArea.Columns.Count * Range("A1").ColumnWidth
    Target_2.Value = Target

    Target_2.Rows.AutoFit
    Target.RowHeight = Target_2.RowHeight

    Target_2.Clear
    Target_2.RowHeight = Hauteur_T2
    Target_2.ColumnWidth = Largeur_T2
End If

Exit Sub

errorHandler:
Set Target_2 = Worksheets("Résumé").Range("DD1000") ' définir une cellule hors du tableau
Target.RowHeight = Target_2.RowHeight

End Sub

Comment connaître la largeur exacte des cellules fusionnées ?

Merci
 

Pièces jointes

  • essai fusion retour.xlsm
    14.9 KB · Affichages: 46
Dernière édition:

Victor21

XLDnaute Barbatruc
Re : Largeur exacte d'une colonne et ajustement automatique de cellules fusionnées

Bonjour, mdidish.

Moi, j'aime pô les cellules fusionnées : Elles posent des tas de problèmes, et ne servent la plupart du temps qu'à "faire joli".
Or le but premier d'un tableur, ce n'est pas de faire joli (même si ce n'est pas interdit), mais de réaliser efficacement des calculs, ou d'organiser rationnellement des données dans le but de faire des calculs :)
 

Dranreb

XLDnaute Barbatruc
Re : Largeur exacte d'une colonne et ajustement automatique de cellules fusionnées

Bonjour.

C'est une vraie plaie, ça, dans Excel que la propriété Width d'un Range soit en lecture seule, et qu'il faille donc passer par ColumnWidth, qui est dans une incompréhensible unité basée sur une largeur de je ne sais quel caractère, avec, d'après ce que vous décrivez, une sorte de chouia en plus pour les bords, pour définir cette différence entre le Left de la cellule à sa droite et son propre Left. Mais au moins Width devrait permettre de connaître la largeur exacte de cellules fusionnées (… ou non).

Bonjour Victor21
 

mdidish

XLDnaute Junior
Re : Largeur exacte d'une colonne et ajustement automatique de cellules fusionnées

@Staple1600 : oups, PJ rajoutée
@Victor21 : c'est vrai que c'est une "plaie", mais le classeur final est une sorte de formulaire où "centrer sur une colonne" ne peut pas remplacer la fusion de cellules.

@Dranreb : comment définir la propriété Width d'un Range quand il s'agit de cellules fusionnées ?
 

Victor21

XLDnaute Barbatruc
Re : Largeur exacte d'une colonne et ajustement automatique de cellules fusionnées

Re,


Il est clair qu'avec le fichier que vous avez joint, on comprend bien mieux le caractère impératif de l'usage des cellules fusionnées, et on peut plus facilement proposer des alternatives...

... ou pas !
 

Staple1600

XLDnaute Barbatruc
Re : Largeur exacte d'une colonne et ajustement automatique de cellules fusionnées

Re, Bonjour Victor21 ;)

mididish
Je sais qu'on est dimanche, que les braises rougeoient dans le barbecue, et que l'apéro, tiédit dans les verres, mais cela n’empêche pas de prendre le temps de concocter un fichier exemple un peu plus fourni, non ?
Où sont les données exemples ?
A part du jaune (surement une référence au dit apéro;)) , il n'y a rien dans ton fichier pour faire des tests...:rolleyes:
 

mdidish

XLDnaute Junior
Re : Largeur exacte d'une colonne et ajustement automatique de cellules fusionnées

Le classeur originel est un fichier avec une trame imposée, non modifiable.

Le fichier test contient juste la macro (dans Microsoft Excel Objets / Feuil1), en considérant que les 3 cellules jaunes sont celles dont la hauteur doit être ajustée automatiquement lorsqu'on y saisit du texte (pour remplacer la fonction retour à la ligne non gérée sur les cellules fusionnées).
Il y a plusieurs dizaines de "cellules cibles" dans le fichier originel, mais ça ne change pas mon problème ; l'idée était de constater qu'avec ma macro, l'ajustement automatique de ces cellules cibles était surestimé quand le nombre de caractères saisis était limite en largeur.

J'ai repris l'idée de Dranreb concernant la "sorte de chouia en plus pour les bords" ; j'ai fait plusieurs tests pour déduire cette marge interne à la cellule, qui tombe aux alentours de 0.35. J'ai donc modifié mon code en remplaçant la ligne :
VB:
 Target_2.ColumnWidth = Target.MergeArea.Columns.Count * Range("A1").ColumnWidth
par :
VB:
Target_2.ColumnWidth = (Target.MergeArea.Columns.Count * Range("A1").ColumnWidth) + (0.35 * ((Target.MergeArea.Columns.Count - 1) * 2))

Ca reste approximatif mais c'est bon dans l'immense majorité des cas.

Si quelqu'un sait comment mesurer la largeur exacte d'une cellule et surtout d'un groupe de cellule (et non par la largeur interne), je suis preneur.
 

Victor21

XLDnaute Barbatruc
Re : Largeur exacte d'une colonne et ajustement automatique de cellules fusionnées

Re,

Peut-être ce lien peut-il vous aider ?
Merged cells do not have the correct height after a row break. How can I correct this?
VB:
Sub AutoFitMergedCellRowHeight()
    Dim CurrentRowHeight As Single, MergedCellRgWidth As Single
    Dim CurrCell As Range
    Dim ActiveCellWidth As Single, PossNewRowHeight As Single
    If ActiveCell.MergeCells Then
      With ActiveCell.MergeArea
            If .Rows.Count = 1 And .WrapText = True Then
                Application.ScreenUpdating = False
                CurrentRowHeight = .RowHeight
                ActiveCellWidth = ActiveCell.ColumnWidth
                For Each CurrCell In Selection
                    MergedCellRgWidth = CurrCell.ColumnWidth + MergedCellRgWidth
                Next
                .MergeCells = False
                .Cells(1).ColumnWidth = MergedCellRgWidth
                .EntireRow.AutoFit
                PossNewRowHeight = .RowHeight
                .Cells(1).ColumnWidth = ActiveCellWidth
                .MergeCells = True
                .RowHeight = IIf(CurrentRowHeight > PossNewRowHeight, _
                  CurrentRowHeight, PossNewRowHeight)
            End If
        End With
    End If
Application.ScreenUpdating = True
End Sub
 

mdidish

XLDnaute Junior
Re : Largeur exacte d'une colonne et ajustement automatique de cellules fusionnées

Merci pour ce lien
L'approche est un peu différente, je vais me servir du :
VB:
For Each CurrCell In Selection
      MergedCellRgWidth = CurrCell.ColumnWidth + MergedCellRgWidth
Next

En revanche on retrouve le même problème d'approximation de la largeur, qui y est également discutée (en dessous du code), sans solution trouvée :( .
 

Dranreb

XLDnaute Barbatruc
Re : Largeur exacte d'une colonne et ajustement automatique de cellules fusionnées

Dranreb : comment définir la propriété Width d'un Range quand il s'agit de cellules fusionnées ?
Comme pour définir sa propriété Width quand il s'agit de cellules non fusionnées: en divisant le Width souhaité par le nombre de colonnes puis en en affectant un ax + b au ColumnWidth, a et b étant calculés initialement à l'aide de 2 cellules de largeurs différentes :
Temp = Cel1.ColumnWidth-Cel2.ColumnWidth
a = (Cel1.Width-Cel2.Width)/Temp
b = (Cel2.Width*Cel1.ColumnWidth-Cel1.Width*Cel2.ColumnWidth)/Temp

Attendez je me suis trompé c'est le contraire :
Temp = Cel1.Width-Cel2.Width
a = (Cel1.ColumnWidth-Cel2.ColumnWidth)/Temp
b = (Cel2.ColumnWidth*Cel1.Width-Cel1.ColumnWidth*Cel2.Width)/Temp
ou bien:
a = (Cel1.ColumnWidth-Cel2.ColumnWidth)/(Cel1.Width-Cel2.Width) ---> Marge b identique dans les deux ColumnWidth éliminée
b = Cel1.ColumnWidth - a * Cel1.Width

CelX.ColumnWidth = a * WidthSouhaité + b
Plgx.ColumnWidth = a * WidthSouhaité / Plgx.Columns.Count + b

Quelle poisse que les méthodes Excel ne sachent pas faire ça tout seul !
 
Dernière édition:

mdidish

XLDnaute Junior
Re : Largeur exacte d'une colonne et ajustement automatique de cellules fusionnées

Alors si j'ai bien compris :

- il existe deux Width :
-- .ColumnWidth : largeur de la colonne (qui est celle qu'on définit par Excel)
-- .Width : largeur de l"l'intérieur" de la cellule ? (en revanche les unités ont l'air de différer)

- pour passer de ColumWidth (CW) au Width (W) :
-- on considère qu'il existe une relation du type CW = a.W + b
-- on définit a et b à partir de deux cellules de tailles différentes
-- (ce qui revient à résoudre deux équations à deux inconnues).

En revanche, comment peut-on mesurer le .width de 10 cellules fusionnées ? (qui est donc plus grand que le width d'une cellule x 10) ?
 

Dranreb

XLDnaute Barbatruc
Re : Largeur exacte d'une colonne et ajustement automatique de cellules fusionnées

Width renvoie toujours la largeur en point de toute la plage spécifiée quel que soit le nombre de colonnes.

Tandis que :
ColumnWidth, propriété

Voir aussi S'applique à Exemple Spécificités
Cette propriété renvoie ou définit la largeur de toutes les colonnes de la plage spécifiée. Type de données Variant en lecture-écriture.
Notes

Une unité de largeur de colonne est égale à la largeur d'un caractère du style Normal. Dans le cas des polices proportionnelles, la largeur du caractère 0 (zéro) est utilisée.
Utilisez la propriété Width pour renvoyer la largeur d'une colonne en points.
Si toutes les colonnes d'une plage ont la même largeur, la propriété ColumnWidth renvoie cette largeur. Dans le cas contraire, la propriété renvoie Null.
Exemple

Cet exemple montre comment doubler la largeur de la colonne A de la feuille Sheet1.

With Worksheets("Sheet1").Columns("A") .ColumnWidth = .ColumnWidth * 2 End With
Remarque: d'après nos déboires, l'exemple est faux: il ne double pas la largeur de la colonne mais le nombre de caractères qu'elle peut théoriquement supporter…

Normalement le Width d'une plage doit être égal à la somme des Width des colonnes qui la composent. Normalement c'est la différence entre les Left des cellules.
 
Dernière édition:

mdidish

XLDnaute Junior
Re : Largeur exacte d'une colonne et ajustement automatique de cellules fusionnées

@ Dranreb :
- imaginons que les cellules A1:F1 sont fusionnées
- chaque cellule a un width de 15,75
- le Width de A1:F1 me donne 94,5, soit 15,75 x 6
- alors que le véritable width de la cellule fusionnée A1:F1 est plus grand (puisqu'il n'y a pas de marge entre chaque cellule fusionnée)
- j'ai essayé en jouant avec le b (de ax + b), qui d’ailleurs me donne environ 0.32 comme pour mes premiers essais (cf post 8), mais ça reste un tout petit peu approximatif.

@chirs : sauf si on ne veut pas centrer mais garder un alignement à gauche.
 

Discussions similaires

Réponses
1
Affichages
996

Statistiques des forums

Discussions
312 087
Messages
2 085 198
Membres
102 815
dernier inscrit
Henridic