XL 2016 Centrer Images

halecs93

XLDnaute Impliqué
Bonjour,

J'ai un fichier excel qui me permet de générer des grilles d'accords pour la guitare. Il se base sur des images stockées en feuil2.

Mon code VBA me permet d'aller chercher des accords sur cette feuille pour les coller en feuil1.

Souci, je ne m'en sors pas pour centrer horizontalement les images trouvées et collées.

Sui quelqu'un a une solution... je suis preneur.

Merci tout le monde
 

Pièces jointes

  • TABLEAU DES SUITES D'ACCORDS v3.xlsm
    152.1 KB · Affichages: 13

halecs93

XLDnaute Impliqué
intégré dans la sub modifié, par contre ta sub tu peux la mettre directement dans le module et non dans la feuille :
VB:
Sub InsérerImagesModifié()
    Dim ws As Worksheet
    Dim wsImages As Worksheet
    Dim i As Integer, j As Integer
 
    ' Définir la feuille de calcul à utiliser
    Set ws = ThisWorkbook.Sheets("Feuil1") ' Remplacez "Feuil1" par le nom de votre feuille
    Set wsImages = ThisWorkbook.Sheets("Feuil2") ' Remplacez "Feuil2" par le nom de la feuille contenant les images
   ws.Select
 
    ' Parcours des lignes avec les noms de notes de musique
    For i = 5 To 13 Step 2 ' Lignes B5, B7, B9, B11, B13
        For j = 2 To 8 ' Colonnes B à H
            Dim nomImage As String
            nomImage = ws.Cells(i, j).Value
         
            ' Chercher l'image correspondante dans la feuille "Feuil2"
            Dim imgShape As Shape
            On Error Resume Next
            Set imgShape = wsImages.Shapes(nomImage)
            On Error GoTo 0
         
            ' Si l'image est trouvée, copier et coller dans la feuille "Feuil1"
            If Not imgShape Is Nothing Then
                imgShape.Copy
                ws.Paste Destination:=ws.Cells(i + 1, j)
                With Selection.ShapeRange
                    .Left = ws.Cells(i + 1, j).Left + (ws.Cells(i + 1, j).Width - .Width) / 2
                    .Top = ws.Cells(i + 1, j).Top + (ws.Cells(i + 1, j).Height - .Height) / 2
                End With
                Application.Goto ws.Cells(i + 1, j)
'                Application.CutCopyMode = True
            End If
        Next j
    Next i
End Sub
Merci beaucoup... mais je ne comprends toujours pas pourquoi je rencontre cette erreur 400
 

halecs93

XLDnaute Impliqué
Merci beaucoup... mais je ne comprends toujours pas pourquoi je rencontre cette erreur 400
Merci... j'ai mis les codes en module, en effet.... et je reçois une erreur 1004

1692198819674.png
 

halecs93

XLDnaute Impliqué

fanch55

XLDnaute Barbatruc
Chez moi, le classeur fonctionne correctement .
Peut-être un problème de mémoire, code modifié au cas où :
VB:
Sub InsérerImagesModifié()
    Dim ws As Worksheet
    Dim wsImages As Worksheet
    Dim i As Integer, j As Integer
    EffacerImages
    
    ' Définir la feuille de calcul à utiliser
    Set ws = ThisWorkbook.Sheets("Feuil1") ' Remplacez "Feuil1" par le nom de votre feuille
    Set wsImages = ThisWorkbook.Sheets("Feuil2") ' Remplacez "Feuil2" par le nom de la feuille contenant les images
    
    ' Parcours des lignes avec les noms de notes de musique
    For i = 5 To 13 Step 2 ' Lignes B5, B7, B9, B11, B13
        For j = 2 To 8 ' Colonnes B à H
            Dim nomImage As String
            nomImage = ws.Cells(i, j).Value
            
            ' Chercher l'image correspondante dans la feuille "Feuil2"
            Dim imgShape As Shape, Target As Range
            On Error Resume Next
                Set imgShape = wsImages.Shapes(nomImage)
            On Error GoTo 0
            
            ' Si l'image est trouvée, copier et coller dans la feuille "Feuil1"
            If Not imgShape Is Nothing Then
                imgShape.Copy
                    Set Target = ws.Cells(i + 1, j)
                        ws.Paste Destination:=Target
                        With ws.Shapes(ws.Shapes.Count)
                            .Left = Target.Left + (Target.Width - .Width) / 2
                            .Top = Target.Top + (Target.Height - .Height) / 2
                        End With
                    Set Target = Nothing
                    Application.CutCopyMode = False
                Set imgShape = Nothing
            End If
        Next j
    Next i
    
    Set wsImages = Nothing
    ws.Activate: ws.Cells(i, j).Select
    Set ws = Nothing
End Sub
 

halecs93

XLDnaute Impliqué
Chez moi, le classeur fonctionne correctement .
Peut-être un problème de mémoire, code modifié au cas où :
VB:
Sub InsérerImagesModifié()
    Dim ws As Worksheet
    Dim wsImages As Worksheet
    Dim i As Integer, j As Integer
    EffacerImages
  
    ' Définir la feuille de calcul à utiliser
    Set ws = ThisWorkbook.Sheets("Feuil1") ' Remplacez "Feuil1" par le nom de votre feuille
    Set wsImages = ThisWorkbook.Sheets("Feuil2") ' Remplacez "Feuil2" par le nom de la feuille contenant les images
  
    ' Parcours des lignes avec les noms de notes de musique
    For i = 5 To 13 Step 2 ' Lignes B5, B7, B9, B11, B13
        For j = 2 To 8 ' Colonnes B à H
            Dim nomImage As String
            nomImage = ws.Cells(i, j).Value
          
            ' Chercher l'image correspondante dans la feuille "Feuil2"
            Dim imgShape As Shape, Target As Range
            On Error Resume Next
                Set imgShape = wsImages.Shapes(nomImage)
            On Error GoTo 0
          
            ' Si l'image est trouvée, copier et coller dans la feuille "Feuil1"
            If Not imgShape Is Nothing Then
                imgShape.Copy
                    Set Target = ws.Cells(i + 1, j)
                        ws.Paste Destination:=Target
                        With ws.Shapes(ws.Shapes.Count)
                            .Left = Target.Left + (Target.Width - .Width) / 2
                            .Top = Target.Top + (Target.Height - .Height) / 2
                        End With
                    Set Target = Nothing
                    Application.CutCopyMode = False
                Set imgShape = Nothing
            End If
        Next j
    Next i
  
    Set wsImages = Nothing
    ws.Activate: ws.Cells(i, j).Select
    Set ws = Nothing
End Sub
Merci.... ça semble fonctionner.... mais aléatoirement. Sans doute en effet une question de mémoire...
 

fanch55

XLDnaute Barbatruc
Bonjour,

J'ai une question concernant la macro proposée : pourquoi mettre les Dim dans les boucles i et j ?
Académiquement parlant comme en Fortran ou en Cobol, on devrait les mettre en début de sub ou fonction .
En VB, ils ne sont honorés qu'au lancement de la sub et peuvent être déclarés n'importe où avant d'être utilisés ce qui peut induire une déclaration "mal placée" ou à un endroit qui en a besoin .... ( surtout pour la lecture du code)
 

Discussions similaires

Statistiques des forums

Discussions
312 215
Messages
2 086 324
Membres
103 179
dernier inscrit
BERSEB50