J'aimerais savoir si c'est possible d'ajuster automatiquement la hauteur d'une cellule fusionnée dans un document Excel, avec une macro dont je n'ai malheureusement pas la maîtrise ?
En exemple, je téléverse un fichier.
Je remercie déjà très sincèrement la personne qui pourra me donner une réponse … clé en mains.
Avec mes salutations les meilleures et à tout bientôt, j'espère
Cela devrait concerner toutes les feuilles et futures feuilles à venir. Pour les cellules, c'est toutes les cellules pour lequelles,j'attends une réponse de saisie de texte, sauf les listes déroulantes. Ces cellules sont dévérouillés, et avec une bordure en pointillé.
Bonjour,
Bonjour @job75
Une variante à l'excellent code fourni dans ce fil.
J'utilise l'évènement "Change", qui ne se déroulera qu'en cas de cellule fusionnée.
L'idée :
- Si la cellule est vide, on met la hauteur à la hauteur "consigne", soit 30
- Si la cellule comporte un ou plusieurs "Alt + Entrée", on défusionne, on centre sur plusieurs colonnes, on ajuste la hauteur en automatique (dont on note la valeur), on refusionne, et on remet à la valeur enregistrée (sinon, la hauteur double...)
A mettre dans le code de la feuille :
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
Application.ScreenUpdating = False
Dim Plg As Range
If Target.MergeCells Then
If Target(1).Value = "" Then
Target.RowHeight = 30
ElseIf InStr(1, Target, Chr(10)) > 0 Then
Set Plg = Target.MergeArea
With Plg
.UnMerge
.HorizontalAlignment = xlCenterAcrossSelection
.EntireRow.AutoFit
Haut_Lig = .RowHeight
.Merge
.RowHeight = Haut_Lig
End With
End If
End If
End Sub
Avec l'évènement Workbook_SheetSelectionChange dans le ThisWorkbook du fichier joint :
VB:
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
Dim RH, c As Range, L, CW, i&, h
RH = 25 'hauteur à adapter
Application.ScreenUpdating = False
Sh.Unprotect "" 'déprotection sans mot de passe
For Each c In Sh.UsedRange
If Not c.Locked Then If c.RowHeight <> RH Then c.RowHeight = RH 'RAZ
Next c
If Not Target(1).Locked Then
L = Target.Width: CW = Target(1).ColumnWidth
Target.UnMerge 'défusionne
For i = 1 To 510 'largeur maximum d'une colonne 255
Target(1).ColumnWidth = i / 2
If Target(1).Width > L Then Target(1).ColumnWidth = (i - 1) / 2: Exit For
Next i
Target(1).WrapText = True 'renvoi à la ligne
Target(1).Rows.AutoFit 'ajustement hauteur
Target(1).ColumnWidth = CW
h = Target.RowHeight
Target.Merge 'refusionne
Target.RowHeight = h
If Target.RowHeight < RH Then Target.RowHeight = RH
End If
Sh.Protect "" 'protection sans mot de passe
End Sub
Bonjour,
Bonjour @job75
Une variante à l'excellent code fourni dans ce fil.
J'utilise l'évènement "Change", qui ne se déroulera qu'en cas de cellule fusionnée.
L'idée :
- Si la cellule est vide, on met la hauteur à la hauteur "consigne", soit 30
- Si la cellule comporte un ou plusieurs "Alt + Entrée", on défusionne, on centre sur plusieurs colonnes, on ajuste la hauteur en automatique (dont on note la valeur), on refusionne, et on remet à la valeur enregistrée (sinon, la hauteur double...)
A mettre dans le code de la feuille :
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
Application.ScreenUpdating = False
Dim Plg As Range
If Target.MergeCells Then
If Target(1).Value = "" Then
Target.RowHeight = 30
ElseIf InStr(1, Target, Chr(10)) > 0 Then
Set Plg = Target.MergeArea
With Plg
.UnMerge
.HorizontalAlignment = xlCenterAcrossSelection
.EntireRow.AutoFit
Haut_Lig = .RowHeight
.Merge
.RowHeight = Haut_Lig
End With
End If
End If
End Sub
Avec l'évènement Workbook_SheetSelectionChange dans le ThisWorkbook du fichier joint :
VB:
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
Dim RH, c As Range, L, CW, i&, h
RH = 25 'hauteur à adapter
Application.ScreenUpdating = False
Sh.Unprotect "" 'déprotection sans mot de passe
For Each c In Sh.UsedRange
If Not c.Locked Then If c.RowHeight <> RH Then c.RowHeight = RH 'RAZ
Next c
If Not Target(1).Locked Then
L = Target.Width: CW = Target(1).ColumnWidth
Target.UnMerge 'défusionne
For i = 1 To 510 'largeur maximum d'une colonne 255
Target(1).ColumnWidth = i / 2
If Target(1).Width > L Then Target(1).ColumnWidth = (i - 1) / 2: Exit For
Next i
Target(1).WrapText = True 'renvoi à la ligne
Target(1).Rows.AutoFit 'ajustement hauteur
Target(1).ColumnWidth = CW
h = Target.RowHeight
Target.Merge 'refusionne
Target.RowHeight = h
If Target.RowHeight < RH Then Target.RowHeight = RH
End If
Sh.Protect "" 'protection sans mot de passe
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
Application.ScreenUpdating = False
Dim Plg As Range
If Target.MergeCells Then
If Target(1).Value = "" Then
Target.RowHeight = 30
ElseIf InStr(1, Target, Chr(10)) > 0 Then
Set Plg = Target.MergeArea
With Plg
.UnMerge
.HorizontalAlignment = xlCenterAcrossSelection
.EntireRow.AutoFit
Haut_Lig = .RowHeight
.Merge
.RowHeight = Haut_Lig
.HorizontalAlignment = xlJustify
.VerticalAlignment = xlCenter
.WrapText = True
End With
End If
End If
End Sub
Merci à tous les deux. J'en profite pour vous demander un autre chose.
Je sohaiterais ajouter une image a laquelle je veux affecter une macro pour que le formulaire revienne à zero
Pour cela, j'ai trouver un code VBA qui me permettre de coher et décocher tous les style de controle
J'ai enregistrer une macro pour effacer toute les sasies faite et une autre pour remettre les mentions qu'il y avait la saisie.
Le hic, (en plus du fait que mes codes sont compliqués, et je suis certaine qu'il y a plus simple) je ne sais pas les combinée en une seul macro, pour que la manip s'exécute en une fois
Ci-dessous les codes :
Décoche des controles :
VB:
Sub test_I()
'coche tous les types de CheckBox
Application.ScreenUpdating = False
Cochez True
End Sub
Sub test_II()
'décoche tous les types de CheckBox
Application.ScreenUpdating = False
Cochez False
End Sub
Private Sub Cochez(statut As Boolean)
Dim c As Object
With ActiveSheet
.CheckBoxes.Value = statut
For Each c In .OLEObjects
If TypeName(c.Object) = "CheckBox" Then c.Object.Value = statut
Next c
End With
End Sub
ub Remplissage()
'
' Remplissage Macro
Range("B6:H6").Select
ActiveCell.FormulaR1C1 = "Cliquez ici pour entrer une date"
Range("N6:T6").Select
ActiveCell.FormulaR1C1 = "Choisissez un élément"
Range("F9:J9").Select
ActiveCell.FormulaR1C1 = "Cliquez ici pour la saisie"
Range("F10:J10").Select
ActiveCell.FormulaR1C1 = "Cliquez ici pour la saisie"
Range("P8:T8").Select
ActiveCell.FormulaR1C1 = "Cliquez ici pour la saisie"
Range("P9:T9").Select
ActiveCell.FormulaR1C1 = "Cliquez ici pour la saisie"
Range("P10:T10").Select
ActiveCell.FormulaR1C1 = "Cliquez ici pour la saisie"
Range("F12:T12").Select
ActiveCell.FormulaR1C1 = "Cliquez ici pour la saisie - Attention : pour aller à la ligne ALT+Entrée"
Range("B27:T27").Select
ActiveCell.FormulaR1C1 = "Cliquez ici pour la saisie - Attention : pour aller à la ligne ALT+Entrée"
Range("F56:T56").Select
ActiveCell.FormulaR1C1 = "Cliquez ici pour la saisie - Attention : pour aller à la ligne ALT+Entrée"
Range("C61:S61").Select
ActiveCell.FormulaR1C1 = "Cliquez ici pour la saisie - Attention : pour aller à la ligne ALT+Entrée"
Range("C64:S64").Select
ActiveCell.FormulaR1C1 = "Cliquez ici pour la saisie - Attention : pour aller à la ligne ALT+Entrée"
Range("C69:S69").Select
ActiveCell.FormulaR1C1 = "Cliquez ici pour la saisie - Attention : pour aller à la ligne ALT+Entrée"
Range("C75:S75").Select
ActiveCell.FormulaR1C1 = "Cliquez ici pour la saisie - Attention : pour aller à la ligne ALT+Entrée"
Range("C98:S98").Select
ActiveCell.FormulaR1C1 = "Cliquez ici pour la saisie - Attention : pour aller à la ligne ALT+Entrée"
Range("D101:K101").Select
ActiveCell.FormulaR1C1 = "Choisissez un élément"
Range("M107:S107").Select
ActiveCell.FormulaR1C1 = "Cliquez ici pour entrer une date"
Range("M108:S108").Select
ActiveCell.FormulaR1C1 = "Cliquez ici pour entrer une date"
Range("K112:S112").Select
ActiveCell.FormulaR1C1 = "Cliquez ici pour la saisie"
Range("K113:S113").Select
ActiveCell.FormulaR1C1 = "Cliquez ici pour la saisie"
Range("E114:I114").Select
ActiveCell.FormulaR1C1 = "Cliquez ici pour la saisie"
Range("C122:S122").Select
ActiveCell.FormulaR1C1 = "Cliquez ici pour la saisie - Attention : pour aller à la ligne ALT+Entrée"
Range("C124:S124").Select
ActiveCell.FormulaR1C1 = "Cliquez ici pour la saisie - Attention : pour aller à la ligne ALT+Entrée"
Range("C126:S126").Select
ActiveCell.FormulaR1C1 = "Cliquez ici pour la saisie - Attention : pour aller à la ligne ALT+Entrée"
Range("C130:O130").Select
ActiveCell.FormulaR1C1 = "Choisissez un élément"
Range("D137:N137").Select
ActiveCell.FormulaR1C1 = "Cliquez ici pour la saisie"
Range("C145:S145").Select
ActiveCell.FormulaR1C1 = "Choisissez un élément"
Range("M151:S151").Select
ActiveCell.FormulaR1C1 = "Cliquez ici pour la saisie"
Range("M152:S152").Select
ActiveCell.FormulaR1C1 = "Cliquez ici pour la saisie"
Range("G155:K155").Select
ActiveCell.FormulaR1C1 = "Cliquez ici pour la saisie"
Range("G156:K156").Select
ActiveCell.FormulaR1C1 = "Cliquez ici pour la saisie"
Range("M157:S157").Select
ActiveCell.FormulaR1C1 = "Cliquez ici pour la saisie"
Range("N162:S162").Select
ActiveCell.FormulaR1C1 = "Cliquez ici pour la saisie"
Range("J165:S165").Select
ActiveCell.FormulaR1C1 = "Cliquez ici pour la saisie"
Range("I171:R171").Select
ActiveCell.FormulaR1C1 = "Cliquez ici pour la saisie"
Range("G173:I173").Select
ActiveCell.FormulaR1C1 = "Choisissez un élément"
Range("K174:S174").Select
ActiveCell.FormulaR1C1 = "Cliquez ici pour la saisie"
Range("H188:K188").Select
ActiveCell.FormulaR1C1 = "Cliquez ici pour la saisie"
Range("F195:S195").Select
ActiveCell.FormulaR1C1 = "Cliquez ici pour la saisie"
Range("C199:S199").Select
ActiveCell.FormulaR1C1 = "Cliquez ici pour la saisie - Attention : pour aller à la ligne ALT+Entrée"
Range("C201:S201").Select
ActiveCell.FormulaR1C1 = "Cliquez ici pour la saisie - Attention : pour aller à la ligne ALT+Entrée"
Range("F205:S205").Select
ActiveCell.FormulaR1C1 = "Cliquez ici pour la saisie - Attention : pour aller à la ligne ALT+Entrée"
Range("F207:I207").Select
ActiveCell.FormulaR1C1 = "Choisissez un élément"
Range("F209:S209").Select
ActiveCell.FormulaR1C1 = "Cliquez ici pour la saisie - Attention : pour aller à la ligne ALT+Entrée"
Range("F212:R212").Select
ActiveCell.FormulaR1C1 = "Cliquez ici pour la saisie - Attention : pour aller à la ligne ALT+Entrée"
Range("I226:P226").Select
ActiveCell.FormulaR1C1 = "Cliquez ici pour la saisie"
Range("G234:S234").Select
ActiveCell.FormulaR1C1 = "Cliquez ici pour la saisie - Attention : pour aller à la ligne ALT+Entrée"
Range("G235:S235").Select
ActiveCell.FormulaR1C1 = "Cliquez ici pour la saisie - Attention : pour aller à la ligne ALT+Entrée"
Range("G236:S236").Select
ActiveCell.FormulaR1C1 = "Cliquez ici pour la saisie - Attention : pour aller à la ligne ALT+Entrée"
Range("P240:R240").Select
ActiveCell.FormulaR1C1 = "Cliquez ici pour la saisie"
Range("P243:R243").Select
ActiveCell.FormulaR1C1 = "Cliquez ici pour la saisie"
Range("I251:S251").Select
ActiveCell.FormulaR1C1 = "Cliquez ici pour la saisie"
Range("C254:S254").Select
ActiveCell.FormulaR1C1 = "Cliquez ici pour la saisie - Attention : pour aller à la ligne ALT+Entrée"
Range("C259:S260").Select
ActiveCell.FormulaR1C1 = "Cliquez ici pour la saisie - Attention : pour aller à la ligne ALT+Entrée"
Range("K267:L267").Select
ActiveCell.FormulaR1C1 = "% à préciser"
Range("K268:L268").Select
ActiveCell.FormulaR1C1 = "% à préciser"
Range("K269:L269").Select
ActiveCell.FormulaR1C1 = "% à préciser"
Range("C280:S280").Select
ActiveCell.FormulaR1C1 = "Cliquez ici pour la saisie - Attention : pour aller à la ligne ALT+Entrée"
Range("C292:S292").Select
ActiveCell.FormulaR1C1 = "Cliquez ici pour la saisie - Attention : pour aller à la ligne ALT+Entrée"
Range("C295:S295").Select
ActiveCell.FormulaR1C1 = "Cliquez ici pour la saisie - Attention : pour aller à la ligne ALT+Entrée"
Range("L299:S299").Select
ActiveCell.FormulaR1C1 = "Cliquez ici pour la saisie - Attention : pour aller à la ligne ALT+Entrée"
Range("L300:S300").Select
ActiveCell.FormulaR1C1 = "Cliquez ici pour la saisie - Attention : pour aller à la ligne ALT+Entrée"
Range("L301:S301").Select
ActiveCell.FormulaR1C1 = "Cliquez ici pour la saisie - Attention : pour aller à la ligne ALT+Entrée"
Range("C305:S305").Select
ActiveCell.FormulaR1C1 = "Cliquez ici pour la saisie - Attention : pour aller à la ligne ALT+Entrée"
Range("C307:S307").Select
ActiveCell.FormulaR1C1 = "Cliquez ici pour la saisie - Attention : pour aller à la ligne ALT+Entrée"
Range("C309:S309").Select
ActiveCell.FormulaR1C1 = "Cliquez ici pour la saisie - Attention : pour aller à la ligne ALT+Entrée"
Re-,
Dans le code, suffit de déprotéger en tout début, et de reprotéger à la fin du code
Avec l'enregistreur de macro :
Démarrer l'enregistrement
Protéger la feuille avec les options voulues
Stopper l'enregistrement
Le code est généré, reste à l'insérer dans le code de mise à hauteur
La macro Workbook_SheetSelectionChange du post #18 agrandit les cellules déverrouillées uniquement quand elles sont sélectionnées.
Maintenant si l'on veut que leurs hauteurs soient toujours ajustées à leurs contenus on utilisera cette macro Workbook_SheetChange, fichier (2) :
VB:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Dim RH, L, CW, HA, i&, h
RH = 25 'hauteur à adapter
If Target.Locked Then Exit Sub 'sécurité
Application.ScreenUpdating = False
Sh.Unprotect "" 'déprotection sans mot de passe
Set Target = Target.MergeArea
L = Target.Width: CW = Target(1).ColumnWidth: HA = Target.HorizontalAlignment
Target.UnMerge 'défusionne
For i = 1 To 510 'largeur maximum d'une colonne 255
Target(1).ColumnWidth = i / 2
If Target(1).Width > L Then Target(1).ColumnWidth = (i - 1) / 2: Exit For
Next i
Target(1).WrapText = True 'renvoi à la ligne
Target(1).Rows.AutoFit 'ajustement hauteur
h = Target.RowHeight
Target(1).ColumnWidth = CW
Target.Merge 'refusionne
Target.RowHeight = h
Target.HorizontalAlignment = HA
If Target.RowHeight < RH Then Target.RowHeight = RH
Sh.Protect "" 'protection sans mot de passe
End Sub
Effectivement, je me complique parfois la vie pour rien. Je vais donc enlever le code vba concernant l'effacement. Par contre je ne sais pas comment associer le code pour la saisie des texte et la décoche des contrôle de formulaire.
Re-,
Dans le code, suffit de déprotéger en tout début, et de reprotéger à la fin du code
Avec l'enregistreur de macro :
Démarrer l'enregistrement
Protéger la feuille avec les options voulues
Stopper l'enregistrement
Le code est généré, reste à l'insérer dans le code de mise à hauteur
La macro Workbook_SheetSelectionChange du post #18 agrandit les cellules déverrouillées uniquement quand elles sont sélectionnées.
Maintenant si l'on veut que leurs hauteurs soient toujours ajustées à leurs contenus on utilisera cette macro Workbook_SheetChange, fichier (2) :
VB:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Dim RH, L, CW, HA, i&, h
RH = 25 'hauteur à adapter
If Target.Locked Then Exit Sub 'sécurité
Application.ScreenUpdating = False
Sh.Unprotect "" 'déprotection sans mot de passe
Set Target = Target.MergeArea
L = Target.Width: CW = Target(1).ColumnWidth: HA = Target.HorizontalAlignment
Target.UnMerge 'défusionne
For i = 1 To 510 'largeur maximum d'une colonne 255
Target(1).ColumnWidth = i / 2
If Target(1).Width > L Then Target(1).ColumnWidth = (i - 1) / 2: Exit For
Next i
Target(1).WrapText = True 'renvoi à la ligne
Target(1).Rows.AutoFit 'ajustement hauteur
h = Target.RowHeight
Target(1).ColumnWidth = CW
Target.Merge 'refusionne
Target.RowHeight = h
Target.HorizontalAlignment = HA
If Target.RowHeight < RH Then Target.RowHeight = RH
Sh.Protect "" 'protection sans mot de passe
End Sub
J'ai finalement opter pour ton code, mais j'ai un bug qui vient d'apparaître et je n'arrive pas à trouver le problème.
Ci-jiont le fichier. Le bug concerne la feuille formulaire de saisie et la marco associer au dessin de la gomme.
Lorsque je clique dessus toutes les cellule s'efface bien sauf la dernière qui engendre une erreur. Je comprends pas.
Je n'ai pas pu envoyer le fichier entier car il fait 1.4MO, le fichier final à d'autre feuille.
Peux-tu m'aider.