Recherche pour boucle dans une macro VBA

Résolu

Bonjour,

N'ayant jamais codé en VBA j'ai un peu de mal à comprendre comment intégrer une boucle au sein d'une macro dont j'ai besoin.

Ayant été à la recherche d'une solution permettant d'insérer des images dans un fichier Excel, j'ai mis la main sur la macro suivante:

Sub LinkToImage()

For Each cel In Selection

cel.Offset(0, 2).Select

cel.Offset(0, 2).RowHeight = 100

cel.Offset(0, 2).ColumnWidth = 40

Set image = ActiveSheet.Pictures.Insert(cel.Value)

With image

.ShapeRange.LockAspectRatio = msoTrue

.Width = cel.Offset(0, 2).Width

.Height = cel.Offset(0, 2).Height

.Left = cel.Offset(0, 2).Left

.Top = cel.Offset(0, 2).Top

End With

Next cel

End Sub

Cette dernière fonctionne à merveille quand la photo recherchée existe bel et bien mais, au moindre manque la macro s'arrête.

Comment faire pour passer à la case suivante si la photo recherchée est manquante ou mal nommée?

J'ai bien essayé d'intégrer une boucle Si mais je n'arrive pas à trouver comment rédiger quelque chose de fonctionnel.

Je vous remercie par avance pour toute l'aide que vous pourrez m'apporter.

Cordialement,

Marc

Windows / Chrome 109.0.0.0

4 réponses

  1. Bonsoir,

    Pourquoi ne pas tout simplement tester l'existence du fichier avant de faire l’insertion :

    If Dir(cel.Value) <> "" Then ' Si le fichier existe
      Set image = ActiveSheet.Pictures.Insert(cel.Value)
      With image
        .ShapeRange.LockAspectRatio = msoTrue
        .Width = cel.Offset(0, 2).Width
        .Height = cel.Offset(0, 2).Height
        .Left = cel.Offset(0, 2).Left
        .Top = cel.Offset(0, 2).Top
      End With
    End If

    Cdt

    1
    1. Contributeur Ambassadeur

      Peut-être parce que l'existence du fichier ne garantit pas que l'insertion va bien se passer?

      0
    2. @yg_be

      Peut-être mais puisqu'on sait que l'absence de l'image va provoquer systématiquement une erreur, autant éliminer ce cas avec un simple test.

      1
  2. Contributeur Ambassadeur

    bonjour,

    j'imagine que la macro s'arrete avec un message d'erreur?

    quand tu partages du code, merci de tenir compte de ceci: https://codes-sources.commentcamarche.net/faq/11288-poster-un-extrait-de-code

    Suggestion pour continuer en cas d'erreur:

    Sub LinkToImage()
    For Each cel In Selection
    cel.Offset(0, 2).Select
    cel.Offset(0, 2).RowHeight = 100
    cel.Offset(0, 2).ColumnWidth = 40
    on error goto suivant
    Set image = ActiveSheet.Pictures.Insert(cel.Value)
    With image
    .ShapeRange.LockAspectRatio = msoTrue
    .Width = cel.Offset(0, 2).Width
    .Height = cel.Offset(0, 2).Height
    .Left = cel.Offset(0, 2).Left
    .Top = cel.Offset(0, 2).Top
    End With
    suivant:
    on error goto 0
    Next cel
    End Sub
    0
    1. Bonjour yg_be,

      Merci beaucoup pour votre remarque concernant le partage des codes.

      Je tenais également à vous remercier pour votre idée de l'ajout de la fonction "on error go to".

      Malheureusement le message d'erreur 1004 continue de revenir en cas d'absence de la photo cherchée sous prétexte qu'il est : "Impossible de lire la propriété Insert de la classe Pictures." 

      Cordialement,

      Alex

      0
      1. Contributeur Ambassadeur

        plutôt ainsi:

        Sub LinkToImage()
        For Each cel In Selection
        cel.Offset(0, 2).Select
        cel.Offset(0, 2).RowHeight = 100
        cel.Offset(0, 2).ColumnWidth = 40
        on error goto oups
        Set image = ActiveSheet.Pictures.Insert(cel.Value)
        With image
        .ShapeRange.LockAspectRatio = msoTrue
        .Width = cel.Offset(0, 2).Width
        .Height = cel.Offset(0, 2).Height
        .Left = cel.Offset(0, 2).Left
        .Top = cel.Offset(0, 2).Top
        End With
        suivant:
        on error goto 0
        Next cel
        Exit Sub
        oups:
        Resume suivant
        End Sub
        0
    2. Bonjour yg_be,

      Merci beaucoup pour votre nouveau message. Tout est à présent parfait !

      Pour ne pas trop vous prendre de temps je vais regarder de mon côté afin de comprendre comment votre ajout fonctionne.

      Bonjour RoMa,

      Merci également pour votre aide. je vais également essayer votre code.

      Cordialement,

      Marc

      0