Sujet : Problème d'ajustement d'image dans Excel
Bonjour à tous,
Je travaille à insérer une image dans une feuille Excel. Mon objectif est de positionner l'image précisément entre les cellules A6 et F20. Cependant, voici le problème :
La première fois que je lance mon code, l'image mord sur la ligne 20 et ne s'étend pas jusqu'à la fin de la colonne F.
Si je relance le code une seconde fois, tout fonctionne parfaitement.
Voici un extrait de mon code :
Sub CreerTrame()
Dim ws As Worksheet
Dim wb As Workbook
Dim imgPath As String
Dim imgPath2 As String
Dim NomFichier As String
Dim NomFeuille As String
Dim cheminFichier As String
Dim img As Shape
Dim cell As Range
' Récupérer le nom du fichier cible à partir de la cellule H2 de la Feuil2 de TEST4
NomFichier = ThisWorkbook.Sheets("Feuil1").Range("A3").Value
cheminFichier = "\\cheminmodifierfichier\" & NomFichier & ".xlsx"
' Vérifier si le fichier existe avant de continuer
If Dir(cheminFichier) = "" Then
MsgBox "Le fichier '" & cheminFichier & "' n'existe pas. Veuillez vérifier le chemin ou le nom.", vbExclamation
Exit Sub
End If
' Ouvrir le fichier externe
Set wb = Workbooks.Open(cheminFichier)
' Récupérer le nom de la feuille cible (valeur de H2 dans Feuil2 de TEST4)
NomFeuille = ThisWorkbook.Sheets("Feuil1").Range("B3").Value
' Vérifier si la feuille existe dans le fichier ouvert
On Error Resume Next
Set ws = wb.Sheets(NomFeuille)
On Error GoTo 0
If ws Is Nothing Then
MsgBox "La feuille '" & NomFeuille & "' est introuvable dans le fichier '" & NomFichier & "'.", vbExclamation
wb.Close False
Exit Sub
End If
' Spécifier le chemin de l'image
imgPath = "C:\Users\blabla\OneDrive - lala\Documents\image test.jpg" ' Remplacez par le chemin de votre image
imgPath2 = "C:\Users\balbla\Downloads\llala.png"
' Définir la plage de cellules
Set plage = ws.Range("A6:F20")
' Calculer la largeur et la hauteur de la plage
imgWidth = plage.Width
imgHeight = plage.Height
' Définir la cellule de départ
Set cell = ws.Range("A6")
' Ajouter l'image
Set img = ws.Shapes.AddPicture(Filename:=imgPath, _
LinkToFile:=msoFalse, _
SaveWithDocument:=msoTrue, _
Left:=cell.Left, _
Top:=cell.Top, _
Width:=imgWidth, _
Height:=imgHeight)
' S'assurer que l'image est bien positionnée dans la plage de cellules
img.LockAspectRatio = msoFalse ' Désactiver le verrouillage du ratio pour redimensionner librement
img.Width = imgWidth ' Redimensionner à la largeur de la plage
img.Height = imgHeight ' Redimensionner à la hauteur de la plage
' Ajuster la position de l'image en fonction de la cellule de départ
img.Top = cell.Top
img.Left = cell.Left
Set cell = ws.Range("A1")
'Calculer la position Left à la moitié entre A1 et B2
leftPos = (ws.Range("A1").Left + ws.Range("B2").Left) * (2 / 4)
' Utiliser la hauteur de la plage E43:E47 comme la hauteur de l'image
heightPos = ws.Range("A1:A2").Height
' Laisser la largeur de l'image pour qu'elle soit limitée entre D43 et F48
widthPos = ws.Range("B2").Left - ws.Range("A1").Left
' Ajouter l'image dans la feuille à la position calculée
Set img = ws.Shapes.AddPicture(Filename:=imgPath2, _
LinkToFile:=msoFalse, _
SaveWithDocument:=msoTrue, _
Left:=leftPos, _
Top:=cell.Top, _
Width:=widthPos, _
Height:=heightPos)
' Ajuster les dimensions de l'image pour qu'elle ne déborde pas
With img
' Respecter l'aspect ratio de l'image
.LockAspectRatio = msoTrue
' Ajuster la largeur et la hauteur à la taille de la cellule sans la déformer
If .Width > ws.Range("D42:F48").Width Then
.Width = ws.Range("D42:F48").Width
End If
If .Height > ws.Range("D42:F48").Height Then
.Height = ws.Range("D42:F48").Height
End If
End With
'MON CODE
' Ajustement des colonnes
ws.Columns("A:F").ColumnWidth = 12
' Définir la zone d'impression
ws.PageSetup.PrintArea = "A1:F48"
' Ajuster la mise en page pour une seule page (ajuster à la largeur et à la hauteur)
With ws.PageSetup
.FitToPagesWide = 1 ' Ajuster pour tenir sur une seule colonne de largeur
.FitToPagesTall = 1 ' Ajuster pour tenir sur une seule page de hauteur
End With
' Ligne 1 et 2
With ws.Range("A1:B2")
.Merge
.Interior.Color = RGB(200, 200, 200)
.Borders.Weight = xlThin
End With
With ws.Range("C1:D2")
.Merge
.Value = "EPR2-NM2201"
.Font.Bold = True
.Font.Size = 8
.Font.Name = "Arial"
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
.Interior.Color = RGB(200, 200, 200)
.Borders.Weight = xlThin
End With
With ws.Range("E1:F2")
.Merge
.Value = "Ingénierie rv"
.Font.Bold = True
.Font.Size = 8
.Font.Name = "Arial"
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
.Interior.Color = RGB(200, 200, 200)
.Borders.Weight = xlThin
End With
' Ligne 3 à 5
With ws.Range("A3:C5")
.Merge
.Value = "FloE"
.Font.Bold = True
.Font.Size = 14
.Font.Name = "Arial"
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
.Borders.Weight = xlThin
End With
Dim valeurD3 As String
valeurD3 = ws.Range("D3").Value
With ws.Range("D3:F5")
.Merge
.Value = valeurD3
.Font.Bold = True
.Font.Size = 12
.Font.Name = "Arial"
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
.Borders.Weight = xlThin
End With
' Ligne 6 à 20 fusionnée
ws.Range("A6:F20").Merge
ws.Range("A6:F20").Borders.Weight = xlThin
' Ligne A21 à C23 fusionnée
With ws.Range("A21:C23")
.Merge
.Value = "Numéro interne :"
.Font.Bold = True
.Font.Size = 10
.Font.Name = "Arial"
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
.Borders.Weight = xlThin
End With
' Ligne D21 à F23 fusionnée
With ws.Range("D21:F23")
.Merge
.Value = "bebe"
.Font.Bold = True
.Font.Size = 10
.Font.Name = "Arial"
.Font.Color = RGB(255, 0, 0)
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
.Borders.Weight = xlThin
End With
' Ligne A24 à B28 fusionnée et "INDICATEURS" en gras blanc sur fond rouge
' Conserver la valeur avant la fusion
Dim valeurA24 As String
valeurA24 = ws.Range("A24").Value
With ws.Range("A24:B26")
.Merge
.Value = valeurA24
.Font.Bold = True
.Font.Color = RGB(255, 255, 255) ' Blanc
.Font.Size = 9
.Font.Name = "Arial"
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
.Interior.Color = RGB(255, 0, 0) ' Rouge
.Borders.Weight = xlThin
End With
' Conserver la valeur avant la fusion
Dim valeurA27 As String
valeurA27 = ws.Range("A27").Value
With ws.Range("A27:A28")
.Merge
.Value = valeurA27
.Font.Bold = True
.Font.Size = 7
.Font.Name = "Arial"
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
.Borders.Weight = xlThin
End With
' Conserver la valeur avant la fusion
Dim valeurB27 As String
valeurB27 = ws.Range("B27").Value
With ws.Range("B27:B28")
.Merge
.Value = valeurB27
.Font.Bold = True
.Font.Size = 7
.Font.Name = "Arial"
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
.Borders.Weight = xlThin
End With
' Conserver la valeur avant la fusion
Dim valeurB29 As String
valeurB29 = ws.Range("B29").Value
With ws.Range("B29:B30")
.Merge
.Value = valeurB29
.Font.Bold = True
.Font.Size = 7
.Font.Name = "Arial"
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
.Borders.Weight = xlThin
End With
' Conserver la valeur avant la fusion
Dim valeurB31 As String
valeurB31 = ws.Range("B31").Value
With ws.Range("B31:B32")
.Merge
.Value = valeurB31
.Font.Bold = True
.Font.Size = 7
.Font.Name = "Arial"
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
.Borders.Weight = xlThin
End With
' Conserver la valeur avant la fusion
Dim valeurB33 As String
valeurB33 = ws.Range("B33").Value
With ws.Range("B33:B34")
.Merge
.Value = valeurB33
.Font.Bold = True
.Font.Size = 7
.Font.Name = "Arial"
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
.Borders.Weight = xlThin
End With
' Conserver la valeur avant la fusion
Dim valeurB35 As String
valeurB35 = ws.Range("B35").Value
With ws.Range("B35:B36")
.Merge
.Value = valeurB35
.Font.Bold = True
.Font.Size = 7
.Font.Name = "Arial"
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
.Borders.Weight = xlThin
End With
' Ligne C24 à D24 fusionnée et "INDICATIONS"
' Conserver la valeur avant la fusion
Dim valeurC24 As String
valeurC24 = ws.Range("C24").Value
With ws.Range("C24:D26")
.Merge
.Value = valeurC24
.Font.Bold = True
.Font.Color = RGB(255, 255, 255)
.Font.Size = 9
.Font.Name = "Arial"
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
.Interior.Color = RGB(255, 0, 0) ' Rouge
.Borders.Weight = xlThin
End With
' Conserver la valeur avant la fusion
Dim valeurA29 As String
valeurA29 = ws.Range("A29").Value
With ws.Range("A29:A30")
.Merge
.Value = valeurA29
.Font.Bold = True
.Font.Size = 7
.Font.Name = "Arial"
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
.Borders.Weight = xlThin
End With
' Conserver la valeur avant la fusion
Dim valeurA31 As String
valeurA31 = ws.Range("A31").Value
With ws.Range("A31:A32")
.Merge
.Value = valeurA31
.Font.Bold = True
.Font.Size = 7
.Font.Name = "Arial"
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
.Borders.Weight = xlThin
End With
' Conserver la valeur avant la fusion
Dim valeurA33 As String
valeurA33 = ws.Range("A33").Value
With ws.Range("A33:A34")
.Merge
.Value = valeurA33
.Font.Bold = True
.Font.Size = 7
.Font.Name = "Arial"
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
.Borders.Weight = xlThin
End With
' Conserver la valeur avant la fusion
Dim valeurA35 As String
valeurA35 = ws.Range("A35").Value
With ws.Range("A35:A36")
.Merge
.Value = valeurA35
.Font.Bold = True
.Font.Size = 7
.Font.Name = "Arial"
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
.Borders.Weight = xlThin
End With
' Conserver la valeur avant la fusion
Dim valeurC27 As String
valeurC27 = ws.Range("C27").Value
With ws.Range("C27:C30")
.Merge
.Value = valeurC27
.Font.Bold = True
.Font.Size = 7
.Font.Name = "Arial"
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
.Borders.Weight = xlThin
End With
' Conserver la valeur avant la fusion
Dim valeur27 As String
valeurD27 = ws.Range("D27").Value
With ws.Range("D27:D30")
.Merge
.Value = valeurD27
.Font.Bold = True
.Font.Size = 7
.Font.Name = "Arial"
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
.Borders.Weight = xlThin
End With
' Conserver la valeur avant la fusion
Dim valeurC31 As String
valeurC31 = ws.Range("C31").Value
With ws.Range("C31:C33")
.Merge
.Value = valeurC31 & Chr(10) ' Ajout d'un retour à la ligne
.Font.Bold = True
.Font.Size = 7
.Font.Name = "Arial"
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
.Borders.Weight = xlThin
.WrapText = True ' Cette ligne permet à Excel d'afficher correctement le texte sur plusieurs lignes
End With
' Conserver la valeur avant la fusion
Dim valeurD31 As String
valeurD31 = ws.Range("D31").Value
With ws.Range("D31:D33")
.Merge
.Value = valeurD31
.Font.Bold = True
.Font.Size = 7
.Font.Name = "Arial"
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
.Borders.Weight = xlThin
End With
' Conserver la valeur avant la fusion
Dim valeurC34 As String
valeurC34 = ws.Range("C34").Value
With ws.Range("C34:C36")
.Merge
.Value = valeurC34 & Chr(10)
.Font.Bold = True
.Font.Size = 7
.Font.Name = "Arial"
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
.Borders.Weight = xlThin
End With
' Conserver la valeur avant la fusion
Dim valeurD34 As String
valeurD34 = ws.Range("D34").Value
With ws.Range("D34:D36")
.Merge
.Value = valeurD34
.Font.Bold = True
.Font.Size = 7
.Font.Name = "Arial"
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
.Borders.Weight = xlThin
End With
' Conserver la valeur avant la fusion
Dim valeurE24 As String
valeurE24 = ws.Range("E24").Value
' Ligne E24 à F26 fusionnée et "ACTEURS"
With ws.Range("E24:F26")
.Merge
.Value = valeurE24
.Font.Bold = True
.Font.Color = RGB(255, 255, 255)
.Font.Size = 9
.Font.Name = "Arial"
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
.Interior.Color = RGB(255, 0, 0) ' Rouge
.Borders.Weight = xlThin
End With
' Conserver la valeur avant la fusion
Dim valeurE27 As String
valeurE27 = ws.Range("E27").Value
' Fusionner les cellules E27 et E28
With ws.Range("E27:E28")
.Merge
.Value = valeurE27 ' Réaffecter la valeur précédemment stockée
.Font.Bold = True
.Font.Size = 7
.Font.Name = "Arial"
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
.Borders.Weight = xlThin
End With
' Conserver la valeur avant la fusion
Dim valeurF27 As String
valeurF27 = ws.Range("F27").Value
With ws.Range("F27:F28")
.Merge
.Value = valeurF27
.Font.Bold = True
.Font.Size = 7
.Font.Name = "Arial"
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
.Borders.Weight = xlThin
End With
' Conserver la valeur avant la fusion
Dim valeurE29 As String
valeurE29 = ws.Range("E29").Value
With ws.Range("E29:E31")
.Merge
.Value = valeurE29 & Chr(10)
.Font.Bold = True
.Font.Size = 7
.Font.Name = "Arial"
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
.Borders.Weight = xlThin
End With
' Conserver la valeur avant la fusion
Dim valeurF29 As String
valeurF29 = ws.Range("F29").Value
With ws.Range("F29:F31")
.Merge
.Value = valeurF29
.Font.Bold = True
.Font.Size = 7
.Font.Name = "Arial"
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
.Borders.Weight = xlThin
End With
' Conserver la valeur avant la fusion
Dim valeurE32 As String
valeurE32 = ws.Range("E32").Value
With ws.Range("E32:E33")
.Merge
.Value = valeurE32 & Chr(10)
.Font.Bold = True
.Font.Size = 7
.Font.Name = "Arial"
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
.Borders.Weight = xlThin
End With
' Conserver la valeur avant la fusion
Dim valeurF32 As String
valeurF32 = ws.Range("F32").Value
With ws.Range("F32:F33")
.Merge
.Value = valeurF32
.Font.Bold = True
.Font.Size = 7
.Font.Name = "Arial"
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
.Borders.Weight = xlThin
End With
' Conserver la valeur avant la fusion
Dim valeurE34 As String
valeurE34 = ws.Range("E34").Value
With ws.Range("E34:E36")
.Merge
.Value = valeurE34 & Chr(10)
.Font.Bold = True
.Font.Size = 7
.Font.Name = "Arial"
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
.Borders.Weight = xlThin
End With
' Conserver la valeur avant la fusion
Dim valeurF34 As String
valeurF34 = ws.Range("F34").Value
With ws.Range("F34:F36")
.Merge
.Value = valeurF34
.Font.Bold = True
.Font.Size = 7
.Font.Name = "Arial"
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
.Borders.Weight = xlThin
End With
' Ligne A39 à F39 fusionnée et "LEGENDE" en gras noir sur fond rouge
Dim valeurA37 As String
valeurA37 = ws.Range("A37").Value
With ws.Range("A37:F38")
.Merge
.Value = valeurA37
.Font.Bold = True
.Font.Size = 10
.Font.Name = "Arial"
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
.Borders.Weight = xlThin
End With
Dim valeurA39 As String
valeurA39 = ws.Range("A39").Value
With ws.Range("A39:C41")
.Merge
.Value = valeurA39
.Font.Bold = True
.Font.Size = 9
.Font.Name = "Arial"
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
.Interior.Color = RGB(192, 230, 245)
.Borders.Weight = xlThin
End With
Dim valeurD39 As String
valeurD39 = ws.Range("D39").Value
With ws.Range("D39:F41")
.Merge
.Value = valeurD39
.Font.Bold = True
.Font.Size = 9
.Font.Name = "Arial"
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
.Interior.Color = RGB(251, 226, 213)
.Borders.Weight = xlThin
End With
' Ligne A43 à C47 fusionnée
Dim valeurA42 As String
valeurA42 = ws.Range("A42").Value
With ws.Range("A42:C48")
.Merge
.Value = valeurA42
.Font.Bold = True
.Font.Size = 9
.Font.Name = "Arial"
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
.Borders.Weight = xlThin
End With
' Ligne D44 à D47 fusionnée
Dim valeurD42 As String
valeurD42 = ws.Range("D42").Value
With ws.Range("D42:F48")
.Merge
.Value = valeurD42
.Font.Bold = True
.Font.Size = 9
.Font.Name = "Arial"
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
.Borders.Weight = xlThin
End With
' Ajuster automatiquement la hauteur de la ligne 24
ws.Rows("3").AutoFit
ws.Rows("3").RowHeight = 7
ws.Rows("6").AutoFit
ws.Rows("6").RowHeight = 10
ws.Rows("7").AutoFit
ws.Rows("7").RowHeight = 10
ws.Rows("8").AutoFit
ws.Rows("8").RowHeight = 10
' Ajuster automatiquement la hauteur de la ligne 24
ws.Rows("24").AutoFit
ws.Rows("24").RowHeight = 20
' Ajuster automatiquement la hauteur de la ligne 27
ws.Rows("27").AutoFit
ws.Rows("27").RowHeight = 20
' Ajuster automatiquement la hauteur de la ligne 29
ws.Rows("29").AutoFit
ws.Rows("29").RowHeight = 20
' Ajuster automatiquement la hauteur de la ligne 31
ws.Rows("31").AutoFit
ws.Rows("31").RowHeight = 20
' Ajuster automatiquement la hauteur de la ligne 32
ws.Rows("32").AutoFit
ws.Rows("32").RowHeight = 20
' Ajuster automatiquement la hauteur de la ligne 29
ws.Rows("34").AutoFit
ws.Rows("34").RowHeight = 20
' Ajuster automatiquement la hauteur de la ligne 29
ws.Rows("37").AutoFit
ws.Rows("37").RowHeight = 20
' Ajuster automatiquement la hauteur de la ligne 29
ws.Rows("39").AutoFit
ws.Rows("39").RowHeight = 10
' Ajuster automatiquement la hauteur de la ligne 29
ws.Rows("41").AutoFit
ws.Rows("41").RowHeight = 10
' Ajuster automatiquement la hauteur de la ligne 29
ws.Rows("42").AutoFit
ws.Rows("42").RowHeight = 7
' Ajuster automatiquement la hauteur de la ligne 29
ws.Rows("43").AutoFit
ws.Rows("43").RowHeight = 7
' Ajuster automatiquement la hauteur de la ligne 29
ws.Rows("44").AutoFit
ws.Rows("44").RowHeight = 7
' Ajuster automatiquement la hauteur de la ligne 29
ws.Rows("45").AutoFit
ws.Rows("45").RowHeight = 7
' Ajuster automatiquement la hauteur de la ligne 29
ws.Rows("46").AutoFit
ws.Rows("46").RowHeight = 7
' Ajuster automatiquement la hauteur de la ligne 29
ws.Rows("47").AutoFit
ws.Rows("47").RowHeight = 7
' Ajuster automatiquement la hauteur de la ligne 29
ws.Rows("48").AutoFit
ws.Rows("48").RowHeight = 7
'wb.Save
' Fermer le fichier
'wb.Close
MsgBox "La mise en forme a été appliquée au fichier : " & fichierNom, vbInformationBonjour,
si votre code fonctionne la deuxième fois c'est qu'Excel ne touche plus aux différentes cellules déjà formatées lors de la première rotation, ce qui fait que votre image est "collée" avec les bonnes dimension sur une feuille qui ne changera pas d'aspect.
Essayez de déplacer l'insertion de l'image à la suite des toutes les modifications de cellules...
Il y aurait je pense du nettoyage à faire dans ce code... Mais sans fichier avant/après application du code je ne me lance pas là dedans...
@ bientôt
LouReeD
Parfait merci j'ai bien réussi
Bonjour,
Une autre méthode est de donner un paramètre de non modification en fonction des cellules.
Mais bon, inverser le code reste simple.
Merci de votre retour et remerciement !
@ bientôt
LouReeD