Recherche pour boucle dans une macro VBA

Résolu/Fermé
MarcPILORD64 Messages postés 3 Date d'inscription mercredi 8 février 2023 Statut Membre Dernière intervention 9 février 2023 - 8 févr. 2023 à 16:26
 RoMa - 9 févr. 2023 à 21:23

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

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
yg_be Messages postés 23361 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 29 novembre 2024 1 556
9 févr. 2023 à 11:32

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

0
RoMa > yg_be Messages postés 23361 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 29 novembre 2024
9 févr. 2023 à 21:23

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
yg_be Messages postés 23361 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 29 novembre 2024 Ambassadeur 1 556
8 févr. 2023 à 17:05

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
MarcPILORD64 Messages postés 3 Date d'inscription mercredi 8 février 2023 Statut Membre Dernière intervention 9 février 2023
8 févr. 2023 à 17:19

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
yg_be Messages postés 23361 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 29 novembre 2024 1 556
8 févr. 2023 à 18:16

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
MarcPILORD64 Messages postés 3 Date d'inscription mercredi 8 février 2023 Statut Membre Dernière intervention 9 février 2023
9 févr. 2023 à 10:14

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