Plantage de ma macro excel 2k7 - afficher une image
bobbyfisher
Messages postés
105
Statut
Membre
-
eriiic Messages postés 25847 Date d'inscription Statut Contributeur Dernière intervention -
eriiic Messages postés 25847 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour à tous,
J'ai placé cette macro de Jacques boisgontier sur mon fichier: http://boisgontierjacques.free.fr/pages_site/lesimages.htm#FonctionAffiche
mais au moment de l'exécution, excel se ferme aussitôt.
Quelqu'un à une idée? Je n'ai pas réussi à afficher le mode pour voir où elle plante...
Merci par avance pour votre aide
J'ai placé cette macro de Jacques boisgontier sur mon fichier: http://boisgontierjacques.free.fr/pages_site/lesimages.htm#FonctionAffiche
mais au moment de l'exécution, excel se ferme aussitôt.
Quelqu'un à une idée? Je n'ai pas réussi à afficher le mode pour voir où elle plante...
Merci par avance pour votre aide
A voir également:
- Plantage de ma macro excel 2k7 - afficher une image
- Telecharger macro convertir chiffre en lettre excel - Télécharger - Tableur
- Liste déroulante excel - Guide
- Déplacer une colonne excel - Guide
- Word et excel gratuit - Guide
- Si ou excel - Guide
9 réponses
Bonsoir,
Avant d'utiliser la fonction va dale code et met en 1ère ligne Stop.
Ensuite fais en pas à pas avec F8 pour voir où ça plante et pourquoi (en regardant les valeurs des variable et des expression dans la fenetre Espion)
eric
Avant d'utiliser la fonction va dale code et met en 1ère ligne Stop.
Ensuite fais en pas à pas avec F8 pour voir où ça plante et pourquoi (en regardant les valeurs des variable et des expression dans la fenetre Espion)
eric
Je crois avoir réussi, voici le message que j'ai en faisant F8:
Nom ambigu détécté: AfficheImage
Ensuite, rien ne se passe si je refais F8.
Nom ambigu détécté: AfficheImage
Ensuite, rien ne se passe si je refais F8.
Voici:
J'ai recommencé à 0.
1) J'ai inscris ma formule dans ma case:
=afficheImage(S4&".jpg";"C:\Photos\")
2) Alt+F11 et j'ai copié le code ci-dessus dans un module, enregistrer en xlsm.
3) Je fais F9, la photo s'affiche. Je change la valeur de S4 et paf, excel se ferme.
4) J'ai ouvert mon fichier via alt+F11 et je n'arrive pas à afficher via F8 où elle plante...
Function AfficheImage(NomImage, Optional rep As String)
Application.Volatile
If IsMissing(rep) Then rep = ThisWorkbook.Path & "\"
Set f = Sheets(Application.Caller.Parent.Name)
Set adr = Application.Caller
Set adr2 = Range(adr.Address).MergeArea
temp = NomImage & "_" & adr.Address
Existe = False
For Each s In adr.Worksheet.Shapes
If s.Name = temp Then Existe = True
Next s
If Not Existe Then
For Each k In adr.Worksheet.Shapes
If Mid(k.Name, InStr(k.Name, "_") + 1) = adr.Address Then k.Delete
Next k
f.Shapes.AddPicture(rep & NomImage, True, True, adr.Left, adr.Top, adr2.Width, adr2.Height).Name = NomImage & "_" & adr.Address
End If
End Function
J'ai recommencé à 0.
1) J'ai inscris ma formule dans ma case:
=afficheImage(S4&".jpg";"C:\Photos\")
2) Alt+F11 et j'ai copié le code ci-dessus dans un module, enregistrer en xlsm.
3) Je fais F9, la photo s'affiche. Je change la valeur de S4 et paf, excel se ferme.
4) J'ai ouvert mon fichier via alt+F11 et je n'arrive pas à afficher via F8 où elle plante...
Nom ambigu détécté: AfficheImage
Pour moi pas d'autre explication que le même nom est utilisé pour une procédure et/ou une variable.
Regarde bien dans tous les modules y compris les modules feuille et thisworkbook.
Mais tu devrais avoir l'erreur dès le 1er appel. Tu es sûr que c'est toujours le même message d'erreur ?
J'ai essayé de reproduire le problème sur un fichier restreint et évidemment cela fonctionne...
Tu ne peux compter que sur toi alors. Remet le stop et pas à pas.
eric
Pour moi pas d'autre explication que le même nom est utilisé pour une procédure et/ou une variable.
Regarde bien dans tous les modules y compris les modules feuille et thisworkbook.
Mais tu devrais avoir l'erreur dès le 1er appel. Tu es sûr que c'est toujours le même message d'erreur ?
J'ai essayé de reproduire le problème sur un fichier restreint et évidemment cela fonctionne...
Tu ne peux compter que sur toi alors. Remet le stop et pas à pas.
eric
J'ai trouvé avec le stop, ça bloque ici:
If s.Name = temp Then Existe = True
Next s
Il revient tout le temps sur ces deux lignes!
If s.Name = temp Then Existe = True
Next s
Il revient tout le temps sur ces deux lignes!
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Je remarque que le fichier ne plante pas quand je désactive le calcul automatique et que je refresh moi même via F9 (ce qui n'est pas pratique) !
Voici le fichier :https://www.cjoint.com/?3Jjn4kZmdc0 (simplifié mais même souci)
Merci mille fois par avance !
Merci mille fois par avance !
Bonjour
Excusez l'incrustre
regarde : cette maquette semblerait correspondre à ta demande: tu cliques sur l'image voulue colonne A
pour voir le code: clic droit sur le nom d'onglet-visualiser le code
https://www.cjoint.com/?3JjoGkssg4V
Nota: il faut télécharger puis dézipper et non ouvrir directement
Excusez l'incrustre
regarde : cette maquette semblerait correspondre à ta demande: tu cliques sur l'image voulue colonne A
pour voir le code: clic droit sur le nom d'onglet-visualiser le code
https://www.cjoint.com/?3JjoGkssg4V
Nota: il faut télécharger puis dézipper et non ouvrir directement
Re,
Salut michel,
J'avais déjà analysé le pb avant que tu n'interviennes Michel, mais dû m'absenter avant de répondre.
Je livre quand même mon résultat.
C'est application.caller qui plante.
C'est l'action sur le checkbox qui génère l'appel à la fonction et il n'a pas ça de prévu. Ca génère un code d'erreur.
Je te propose de virer les checkbox (qui de toute façon deviennent pénibles sur une feuille s'ils dépassent la dizaine) et de remplacer par une petite macro qui met un X si clic dans la plage nommée Surv (D7:D8) et qui copie le nom de l'image dans la cellule ChoixIm (G5)
J'ai oté aussi le .volatile de la fonction qui ne me parait pas nécessaire dans ton cas.
https://www.cjoint.com/?BJjqfqI64L6
eric
Salut michel,
J'avais déjà analysé le pb avant que tu n'interviennes Michel, mais dû m'absenter avant de répondre.
Je livre quand même mon résultat.
C'est application.caller qui plante.
C'est l'action sur le checkbox qui génère l'appel à la fonction et il n'a pas ça de prévu. Ca génère un code d'erreur.
Je te propose de virer les checkbox (qui de toute façon deviennent pénibles sur une feuille s'ils dépassent la dizaine) et de remplacer par une petite macro qui met un X si clic dans la plage nommée Surv (D7:D8) et qui copie le nom de l'image dans la cellule ChoixIm (G5)
J'ai oté aussi le .volatile de la fonction qui ne me parait pas nécessaire dans ton cas.
https://www.cjoint.com/?BJjqfqI64L6
eric
La solution des cases à cocher est-elle applicable plusieurs fois sur un même onglet ?
J'ai créé sur mon fichier trois zones de checkbox successives (sorte de menu).
Peux tu stp m'expliquer comment appliquer ta macro à une zone unique de case à cocher ? Merci !!
J'ai créé sur mon fichier trois zones de checkbox successives (sorte de menu).
Peux tu stp m'expliquer comment appliquer ta macro à une zone unique de case à cocher ? Merci !!
Si tu parles des X ce ne sont plus des cases à cocher.
Si c'est 3 zones indépendantes (avec donc 3 X il faut adapter la macro.
Si c'est 3 zones dépendantes (1 seul X possible) il faut sélectionner tes 3 plages par cliqué-glissés successifs plus Ctrl appuyé pour les cumuler et nommer l'union des 3 plages (ou passer par le gestionnaire de noms pour éditer à la main)
eric
Si c'est 3 zones indépendantes (avec donc 3 X il faut adapter la macro.
Si c'est 3 zones dépendantes (1 seul X possible) il faut sélectionner tes 3 plages par cliqué-glissés successifs plus Ctrl appuyé pour les cumuler et nommer l'union des 3 plages (ou passer par le gestionnaire de noms pour éditer à la main)
eric
Tu peux mettre un traitement différent pour les autres plages.
eric
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not Intersect(Target, [Surv1]) Is Nothing Then
[Surv1].ClearContents
Target = "X"
[Choix1] = Target.Offset(0, -1)
ElseIf Not Intersect(Target, [Surv2]) Is Nothing Then
[Surv2].ClearContents
Target = "X"
[Choix2] = Target.Offset(0, -1)
ElseIf Not Intersect(Target, [Surv3]) Is Nothing Then
[Surv3].ClearContents
Target = "X"
[Choix3] = Target.Offset(0, -1)
End If
End Sub
eric
C'est parce que je l'ai fait sur 2003.
Sur 2010 oui tu es obligé d'enregistrer en .xlsm pour conserver les macros.
Tu peux aussi copier-coller le texte du code directement dans ton fichier.
D'ailleurs je vois que j'ai oublié de joindre le dernier fichier, ça t'aidera sûrement à comprendre :
https://www.cjoint.com/?BJjxEjxTV0a
J'ai changé les noms pour rester cohérent sur les 3 plages.
eric
Sur 2010 oui tu es obligé d'enregistrer en .xlsm pour conserver les macros.
Tu peux aussi copier-coller le texte du code directement dans ton fichier.
D'ailleurs je vois que j'ai oublié de joindre le dernier fichier, ça t'aidera sûrement à comprendre :
https://www.cjoint.com/?BJjxEjxTV0a
J'ai changé les noms pour rester cohérent sur les 3 plages.
eric
Bonsoir eric,
J'ai réussi à reproduire tout ça sur un fichier. Voila ce que ça donne: https://www.cjoint.com/?3JkwuH9PhtN (avec mon système de recherche).
C'est effectivement 10x plus pratique que les checkbox.
Néanmoins, j'ai plusieurs souci/bug:
- Quand je veux verrouiller mon onglet pour ne laisser que la possibilité de cocher les cases, ça plante
- Quand la personne choisit/coche sa case (X), la cellule apparait comme si on allait écrire dedans, ça ne donne pas vraiment l'effet "case à cocher"
A ton avis, la macro initiale est-elle utilisable avec les checkbox en virant "application.caller" ?
Merci beaucoup !!!
J'ai réussi à reproduire tout ça sur un fichier. Voila ce que ça donne: https://www.cjoint.com/?3JkwuH9PhtN (avec mon système de recherche).
C'est effectivement 10x plus pratique que les checkbox.
Néanmoins, j'ai plusieurs souci/bug:
- Quand je veux verrouiller mon onglet pour ne laisser que la possibilité de cocher les cases, ça plante
- Quand la personne choisit/coche sa case (X), la cellule apparait comme si on allait écrire dedans, ça ne donne pas vraiment l'effet "case à cocher"
A ton avis, la macro initiale est-elle utilisable avec les checkbox en virant "application.caller" ?
Merci beaucoup !!!
Bonsoir,
Bizarrement les macros ne se lancent pas quand j'ouvre ton fichier chez moi.
Il est tard, je n'ai pas le temps de chercher pourquoi.
Quand je veux verrouiller mon onglet pour ne laisser que la possibilité de cocher les cases, ça plante
Essaie en déverrouillant les cellules concernées.
Toutes les cellules devant changer (par macro ou par saisie) ne doivent pas être verrouillées par définition. Format cellule / protection.
On verra si ça plante toujours après ça
Quand la personne choisit/coche sa case (X), la cellule apparait comme si on allait écrire dedans, ça ne donne pas vraiment l'effet "case à cocher"
C'est qu'elles font un double-clic, c'est le fonctionnement normal d'excel.
Tu peux désactiver l'action du double-clic avec :
A ton avis, la macro initiale est-elle utilisable avec les checkbox en virant "application.caller" ?
Bien sûr, c'est là juste pour faire joli et tant pis si ça embête les autres...
eric
Bizarrement les macros ne se lancent pas quand j'ouvre ton fichier chez moi.
Il est tard, je n'ai pas le temps de chercher pourquoi.
Quand je veux verrouiller mon onglet pour ne laisser que la possibilité de cocher les cases, ça plante
Essaie en déverrouillant les cellules concernées.
Toutes les cellules devant changer (par macro ou par saisie) ne doivent pas être verrouillées par définition. Format cellule / protection.
On verra si ça plante toujours après ça
Quand la personne choisit/coche sa case (X), la cellule apparait comme si on allait écrire dedans, ça ne donne pas vraiment l'effet "case à cocher"
C'est qu'elles font un double-clic, c'est le fonctionnement normal d'excel.
Tu peux désactiver l'action du double-clic avec :
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Cancel = True
End Sub
mais vaut mieux le faire sur les plages concernées car elles vont dire après qu'elles ne peuvent plus éditer dans les cellules...
A ton avis, la macro initiale est-elle utilisable avec les checkbox en virant "application.caller" ?
Bien sûr, c'est là juste pour faire joli et tant pis si ça embête les autres...
eric
Bonjour eric,
J'ai donc tenté d'utiliser la macro initiale en supprimant Application.Caller
Ce qui me donne:
Et ça ne fonctionne pas. J'ai dû mal comprendre quelque chose... Merci
J'ai donc tenté d'utiliser la macro initiale en supprimant Application.Caller
Ce qui me donne:
Function AfficheImage(NomImage, Optional rep As String)
Application.Volatile
If IsMissing(rep) Then rep = ThisWorkbook.Path & "\"
Set f = Sheets(Application.Caller.Parent.Name)
Set adr2 = Range(adr.Address).MergeArea
temp = NomImage & "_" & adr.Address
Existe = False
For Each s In adr.Worksheet.Shapes
If s.Name = temp Then Existe = True
Next s
If Not Existe Then
For Each k In adr.Worksheet.Shapes
If Mid(k.Name, InStr(k.Name, "_") + 1) = adr.Address Then k.Delete
Next k
f.Shapes.AddPicture(rep & NomImage, True, True, adr.Left, adr.Top, adr2.Width, adr2.Height).Name = NomImage & "_" & adr.Address
End If
End Function
Et ça ne fonctionne pas. J'ai dû mal comprendre quelque chose... Merci
Je ne peux pas le désactiver car les gens doivent pouvoir éditer.
J'avais écrit : mais vaut mieux le faire sur les plages concernées
Les autres cellules resteront éditables sur double-clic.
eric
J'avais écrit : mais vaut mieux le faire sur les plages concernées
Les autres cellules resteront éditables sur double-clic.
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
If Not Intersect(Target, Union([Surv1], [Surv2], [Choix1], [Choix2])) Is Nothing Then Cancel = True
End Sub
eric