XL 2013 Appel d'un Msgbox à l'aide de gosub

subsub

XLDnaute Nouveau
Salut a vous tous, et oui je reviens encore avec un souchi
voila mon problème
photo2:
vue2.Picture = LoadPicture()
If Cells(no_ligne, 40) = "" Then
On Error GoTo photo3
vue2.Picture = LoadPicture(Chem_nom2)
Cells(no_ligne, 40) = Cells(no_ligne, 1) & "-2.jpg"
End If
On Error GoTo loaderror <---------------------pour l'instant j'ai ca, mais il va a load error sans revenir
vue2.Picture = LoadPicture(Chem_nom2) <----- mais je voudrais qu'il revienne comme avec un gosub
<----------------------------------------------------------de l'époque commodore 64.

photo3:
photo4:
etc etc etc

mon but il test si la cell (no-line,40) si celle ci est vide, il tente de charger la photo qui devrait porter le nom qui devrait être écrit dans celle ci, si le chargement fonctionne, il rempli le cell avec ce qui devrait être dedans.
ensuite si la cellule n'est pas vide, il test si ce qui est dedans correspond à une image.
Le truc c'est que si l'image n'est pas dans le répertoire je voudrais qu'il file vers une msgbox appelé loaderror qui m'indique l'image manquante.
je suis bloqué car une fois parti vers loaderror c'est fini il ne teste plus les images suivantes et je n'ai pas envie de faire 50000 goto
 
Dernière modification par un modérateur:

Dranreb

XLDnaute Barbatruc
Re : Appel d'un Msgbox à l'aide de gosub

Bonsoir.

De toutes façon un On Error Goto vers une étiquette suivie d'un code d'exécution normale tel que photo3 c'est carrément incorrect !
Il faut impérativement une étiquette vers un gestionnaire d'erreur, les instructions qui la suivent devant se terminer par une instruction Resume si vous voulez que l'exécution puisse reprendre et se poursuive en mode normal. Car en mode récupération d'erreur les On Error sont ignorés, toute nouvelle erreur survenant dans ce mode plante l'exécution, un point c'est tout.
Mettez donc On Error Resume Next, et testez Err.Number derrière les instructions susceptible de provoquer une erreur. Ce sera plus simple car l'exécution n'entrera jamais en mode récupération d'erreur
 
Dernière édition:

subsub

XLDnaute Nouveau
Re : Appel d'un Msgbox à l'aide de gosub

ben en fait le plus simple serait de savoir comment tester si l'image est présente ou non pour l'instant c'est le on error goto qui me fait ce test à défaut de connaitre une autre solution. Je fait avec ce que j'ai, c'est à dire pas grand chose, je débute.
Dans le même registre je voudrais savoir si il est possible avec vue2.Picture = LoadPicture(blablabla) de remplace vue2.picture par une variable genre vue(x).picture comme cela je réduirais la taille du code.
 

Dranreb

XLDnaute Barbatruc
Re : Appel d'un Msgbox à l'aide de gosub

Le On Error Resume Next permet de le tester aussi. L'exécution n'entre pas en mode récupération d'erreur mais les erreurs sont quand même consignées dans un objet Err qui possède notamment une propriété par défaut qui est Number et une autre Description, ainsi qu'une méthode Clear pour le remettre à 0 devant une instruction susceptible de provoquer une erreur.
Les objets peuvent se mettre en tableaux si ça peut vous arranger. Il peuvent aussi se transmettre en paramètres à des procédures. C'est peut être ça qu'il vous faudrait si vous voulez éviter d'écrire une multitude de fois les mêmes dizaines d'instructions: Écrivez les une seule fois dans une procédure et passez lui en paramètre ce qui change à chaque appel.

Edit: Je suis obligé de deviner un tas de choses faute de classeur joint. Vous êtes dans une feuille, je suppose qu'un ActiveSheet.OLEObjects("Vue" & x).Object ferait un objet image potable…
 
Dernière édition:

subsub

XLDnaute Nouveau
Re : Appel d'un Msgbox à l'aide de gosub

Pardon alors non je suis dans un userform, je reformule ma question autrement, je veux savoir si il existerait un moyen simple de tester si l'image que je tente de charger avec vue2.Picture = LoadPicture(Chem_nom2) du genre si l'image existe alors affiche et si elle n'existe pas redirection vers un msgbox. Je peux par mp vous faire parvenir le userform ainsi que mon code de merde cela vous donnera l'impression de passer le reveillon un 1er avril.
 

subsub

XLDnaute Nouveau
Re : Appel d'un Msgbox à l'aide de gosub

et bien voila je te remercie c'est juste que je ne connaissais pas le if err then donc maintenant ça marche, c'est un peu lourd, il doit être possible de simplifier mon gros bloubiboulga

photo2:
vue2.Picture = LoadPicture()
If Cells(no_ligne, 40) = "" Then
On Error Resume Next
vue2.Picture = LoadPicture(Chem_nom2)
If Err Then GoTo photo3
Cells(no_ligne, 40) = Cells(no_ligne, 1) & "-2.jpg"
GoTo photo3
End If
On Error Resume Next
vue2.Picture = LoadPicture(Chem_nom2)
If Err Then GoTo nopic2
GoTo photo3
nopic2:
MsgBox " photo 2 introuvable"
Cells(no_ligne, 40) = ""
photo3:
vue3.Picture = LoadPicture()
If Cells(no_ligne, 41) = "" Then
On Error Resume Next
vue3.Picture = LoadPicture(Chem_nom3)
If Err Then GoTo photo4
Cells(no_ligne, 41) = Cells(no_ligne, 1) & "-3.jpg"
GoTo photo4
End If
On Error Resume Next
vue3.Picture = LoadPicture(Chem_nom3)
If Err Then GoTo nopic3
GoTo photo4
nopic3:
MsgBox " photo 3 introuvable"
Cells(no_ligne, 41) = ""
photo4:
vue4.Picture = LoadPicture()
If Cells(no_ligne, 42) = "" Then
On Error Resume Next
vue4.Picture = LoadPicture(Chem_nom4)
If Err Then GoTo Photo5
Cells(no_ligne, 42) = Cells(no_ligne, 1) & "-4.jpg"
GoTo Photo5
End If
On Error Resume Next
vue4.Picture = LoadPicture(Chem_nom4)
If Err Then GoTo nopic4
GoTo Photo5
nopic4:
MsgBox " photo 4 introuvable"
Cells(no_ligne, 42) = ""
Photo5:
vue5.Picture = LoadPicture()
If Cells(no_ligne, 43) = "" Then
On Error Resume Next
vue5.Picture = LoadPicture(Chem_nom5)
If Err Then GoTo photo6
Cells(no_ligne, 43) = Cells(no_ligne, 1) & "-5.jpg"
GoTo photo6
End If
On Error Resume Next
vue5.Picture = LoadPicture(Chem_nom5)
If Err Then GoTo nopic5
GoTo photo6
nopic5:
MsgBox " photo 5 introuvable"
Cells(no_ligne, 43) = ""
photo6:
vue6.Picture = LoadPicture()
If Cells(no_ligne, 44) = "" Then
On Error Resume Next
vue6.Picture = LoadPicture(Chem_nom6)
If Err Then GoTo photo7
Cells(no_ligne, 44) = Cells(no_ligne, 1) & "-6.jpg"
GoTo photo7
End If
On Error Resume Next
vue6.Picture = LoadPicture(Chem_nom6)
If Err Then GoTo nopic6
GoTo photo7
nopic6:
MsgBox " photo 6 introuvable"
Cells(no_ligne, 44) = ""
photo7:
vue7.Picture = LoadPicture()
If Cells(no_ligne, 45) = "" Then
On Error Resume Next
vue7.Picture = LoadPicture(Chem_nom7)
If Err Then GoTo photo8
Cells(no_ligne, 45) = Cells(no_ligne, 1) & "-7.jpg"
GoTo photo8
End If
On Error Resume Next
vue7.Picture = LoadPicture(Chem_nom7)
If Err Then GoTo nopic7
GoTo photo8
nopic7:
MsgBox " photo 7 introuvable"
Cells(no_ligne, 45) = ""
photo8:
vue8.Picture = LoadPicture()
If Cells(no_ligne, 46) = "" Then
On Error Resume Next
vue8.Picture = LoadPicture(Chem_nom8)
If Err Then GoTo photo9
Cells(no_ligne, 46) = Cells(no_ligne, 1) & "-8.jpg"
GoTo photo9
End If
On Error Resume Next
vue8.Picture = LoadPicture(Chem_nom8)
If Err Then GoTo nopic8
GoTo photo9
nopic8:
MsgBox " photo 8 introuvable"
Cells(no_ligne, 46) = ""
photo9:
vue9.Picture = LoadPicture()
If Cells(no_ligne, 47) = "" Then
On Error Resume Next
vue9.Picture = LoadPicture(Chem_nom9)
If Err Then GoTo loadok
Cells(no_ligne, 47) = Cells(no_ligne, 1) & "-9.jpg"
GoTo loadok
End If
On Error Resume Next
vue9.Picture = LoadPicture(Chem_nom9)
If Err Then GoTo nopic9
GoTo loadok
nopic9:
MsgBox " photo 9 introuvable"
Cells(no_ligne, 47) = ""
loadok:
End Sub
 

subsub

XLDnaute Nouveau
Re : Appel d'un Msgbox à l'aide de gosub

j'ai tenté avec un truc comme cela mais il ne comprend pas mon x qui est une variable du nom de l'obj ou plutot je lui explique mal

test:
y = 40
For Z = 2 To 9
x = "vue" & Z
Root = chemin_photo & Cells(no_ligne, y) & "-" & Z & ".jpg"

phototest:
x.Picture = LoadPicture()
If Cells(no_ligne, y) = "" Then
On Error Resume Next
x.Picture = LoadPicture(Root)
If Err Then GoTo finfoto
Cells(no_ligne, y) = Cells(no_ligne, 1) & "-" & Z & ".jpg"
GoTo finfoto
End If
On Error Resume Next
x.Picture = LoadPicture(Root)
If Err Then GoTo fotomsg
GoTo finfoto
fotomsg:
MsgBox " photo " & Z & " introuvable"
Cells(no_ligne, y) = ""
finfoto:
y = y + 1
Next Z

GoTo loadok
 

Dranreb

XLDnaute Barbatruc
Re : Appel d'un Msgbox à l'aide de gosub

Essayez: Dim Img As MSForms.Image
Puis: Set Img = Me("vue" & Z)
Enfin: Img.Picture = LoadPicture(etc.

Et tâchez d'écrire votre code plus proprement, en enlevant tous les GoTo et toutes les étiquettes.
Vous savez, avant un End IF vous pouvez mettre une clause Else, et même encore avant un ou plusieurs ElseIf condition Then.
Décalez vers la droite le début des instructions soumises aux conditions: vous vous y retrouverez plus facilement. Ça s'appelle l'indentation.

Il me semble que votre If Cells(no_ligne, y) = "" Then vient trop tôt car dans les deux cas vous commencez par tentez le même Picture = LoadPicture ensuite.
Alors ne l'écrivez qu'une fois et testez la cellule vide après.

Ou alors au contraire mettez le plus haut et ne tentez rien du tout si la cellule est vide, à moins qu'il puisse existez une fichier s'appelant juste "-Z.jpg" ce qui m'étonnerait.

Et si vous m'expliquiez plutôt en français ce que vous voulez faire ? Parce que là c'est incompréhensible !
J'ai par exemple l'impression que vous voulez toujours tenter de charger une photo dont le début du nom est soit indiqué dans une colonne à partir de la 40, soit, à défaut de spécification, repris de la colonne 1.
C'est ça ?
 
Dernière édition:

subsub

XLDnaute Nouveau
Re : Appel d'un Msgbox à l'aide de gosub

Essayez: Dim Img As MSForms.Image
Puis: Set Img = Me("vue" & Z)
Enfin: Img.Picture = LoadPicture(etc.

excellent je vais tester l'année prochaine

Alors en fait oui vous avez bien compris dans mon userform j'affiche les images correspondant à un article
en fonction de la ligne les noms des images sont dans la colonne 40 à 47 imgarticle1-2,imgarticle1-3...imgarticle1-9 pour la cell 47
alors le répertoire image peut être alimenté par moi avec un copier collé d'un autre rep ou par moi dans la userform
Dans tous les cas dans la feuille excel, on vérifie si la cellule contient le nom de l'image.
- Si la cellule est vide on test le chargement avec le nom que devrait porter l'image
---- Si le chargement image est ok alors affichage de l'image et inscription du nom dans la cellule vide
---- Si le chargement image pas ok alors c'est normal que la cellule soit vide, on passe à la suivante
- Si la cellule est rempli, on test le chargement avec le nom contenu dans la cellule
-----Si chargement ok on passe à l'image suivante
-----Si chargement pas ok alors on vide la cellule et on passe à l'image suivante
 

subsub

XLDnaute Nouveau
Re : Appel d'un Msgbox à l'aide de gosub

pardon oui la cellule 1 comporte la référence de l'article et les images associées prennent le nom de référence & "-2.jpg"
j'aurais put mettre en cell 40 = cell1&"-2.jpg" et remplir le tableau complètement, mais lors de l'import du fichier CSV vers le site internet, cela aurait généré une multitude d’erreurs de chargement.
et encore merci pour votre aide et bonne année
 

Dranreb

XLDnaute Barbatruc
Re : Appel d'un Msgbox à l'aide de gosub

Je vois à peu près ce que vous expliquez poste précédent.
Mais ce n'est pas ce que vous aviez programmé: vous faisiez dans les deux cas .Picture = LoadPicture(Root) or Root (curieux nom au lieu de NomFic) n'était calculé qu'une fois. Donc pas d'un coté un nom spécifié et de l'autre un autre nom assumé !

Je verrais assez bien ça :
VB:
Dim N As Long, Img As MSForms.Image, Cel As Range, NomFic As String, _
   NoLigne As Long, CheminPhotos As String ' initialisés ailleurs ?…
' …
For N = 2 To 9
   Set Img = Me("vue" & N)
   Img.Picture = LoadPicture()
   Set Cel = Cells(NoLigne, N + 38)
   On Error Resume Next
   If Not IsEmpty(Cel.Value) Then
      NomFic = Cel.Value
      Img.Picture = LoadPicture(CheminPhotos & NomFic)
      If Err Then
         MsgBox "Fichier """ & NomFic & """ introuvable.", vbExclamation, Me.Name
         Cel.Value = Empty: Err.Clear
         End If
      End If
   If IsEmpty(Cel.Value) Then
      NomFic = Cells(NoLigne, 1) & "-" & N & ".jpg"
      Img.Picture = LoadPicture(CheminPhotos & NomFic)
      If Err = 0 Then Cel.Value = NomFic
      End If
   On Error GoTo 0
   Next N
Avec un changement par rapport à ce que vous avez prévu: si le fichier spécifié n'existe pas on l'efface d'accord, mais après on essaye quand même aussi à tout hasard le nom de fichier qu'il aurait dû avoir…

Bonne année !
 
Dernière édition:

Discussions similaires

Réponses
12
Affichages
441
Réponses
5
Affichages
1 K

Statistiques des forums

Discussions
312 185
Messages
2 086 009
Membres
103 089
dernier inscrit
johnjohn1969