Plantage de ma macro excel 2k7 - afficher une image
bobbyfisher
Messages postés
105
Statut
Membre
-
eriiic Messages postés 24581 Date d'inscription Statut Contributeur Dernière intervention -
eriiic Messages postés 24581 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
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
-
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. -
Voici:
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 -
-
-
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! -
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 ! -
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 -
-
-
-
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
-
C'est parfait, magnifique! Je tente de l'adapter à mon fichier de suite. Merci !!!
-
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 !!-
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 -
-
Tu peux mettre un traitement différent pour les autres plages.
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
-
-
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 !!!-
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 :Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) Cancel = True End Submais 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:
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.
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
-