Plantage de ma macro excel 2k7 - afficher une image

Fermé
bobbyfisher Messages postés 89 Date d'inscription vendredi 30 octobre 2009 Statut Membre Dernière intervention 17 octobre 2013 - 8 oct. 2012 à 23:02
eriiic Messages postés 24570 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 8 mai 2024 - 12 oct. 2012 à 18:34
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
A voir également:

9 réponses

eriiic Messages postés 24570 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 8 mai 2024 7 217
9 oct. 2012 à 00:26
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
0
bobbyfisher Messages postés 89 Date d'inscription vendredi 30 octobre 2009 Statut Membre Dernière intervention 17 octobre 2013 5
9 oct. 2012 à 10:25
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.
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
9 oct. 2012 à 10:41
Bojour,

Montre nous ton code !
code à insérer entre le balises (dernière vignette à droite dans les messages CCM)

dans l'attente
0
eriiic Messages postés 24570 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 8 mai 2024 7 217
9 oct. 2012 à 10:41
Bonjour,

ta fonction doit être déclarée à 2 endroits différents dans les modules.
(ou bien tu as réutilisé le nom pour autre chose...)

eric
0
bobbyfisher Messages postés 89 Date d'inscription vendredi 30 octobre 2009 Statut Membre Dernière intervention 17 octobre 2013 5
9 oct. 2012 à 11:47
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...
0
eriiic Messages postés 24570 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 8 mai 2024 7 217
9 oct. 2012 à 12:00
Je change la valeur de S4 et paf, excel se ferme.
Sûrement pas si ta 1ère ligne est Stop

sans fichier, rien à voir...
cjoint.com et coller ici le lien fourni

eric
0
bobbyfisher Messages postés 89 Date d'inscription vendredi 30 octobre 2009 Statut Membre Dernière intervention 17 octobre 2013 5
9 oct. 2012 à 12:13
J'ai pleins de données confidentielles dedans.
J'ai essayé de reproduire le problème sur un fichier restreint et évidemment cela fonctionne...
0
eriiic Messages postés 24570 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 8 mai 2024 7 217
Modifié par eriiic le 9/10/2012 à 12:27
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
0
bobbyfisher Messages postés 89 Date d'inscription vendredi 30 octobre 2009 Statut Membre Dernière intervention 17 octobre 2013 5
9 oct. 2012 à 12:30
yes j'ai trouvé où ça bloque. Maintenant, comment corriger, c'est une autre affaire...
0
bobbyfisher Messages postés 89 Date d'inscription vendredi 30 octobre 2009 Statut Membre Dernière intervention 17 octobre 2013 5
Modifié par bobbyfisher le 9/10/2012 à 12:23
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!
0
eriiic Messages postés 24570 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 8 mai 2024 7 217
9 oct. 2012 à 12:33
message d'erreur inchangé ?
éventuellement tu peux me passer le fichier en MP. Cliquer sur mon pseudo et en haut à droite 'lui envoyer en message'. Préciser les manip à faire pour reproduire l'erreur.

eric
0
bobbyfisher Messages postés 89 Date d'inscription vendredi 30 octobre 2009 Statut Membre Dernière intervention 17 octobre 2013 5
9 oct. 2012 à 12:43
Eric, comment fais tu stp pour afficher le message d'erreur ? Je ne vois pas où s'affiche ce message pour j'ai bien une console espions..
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
bobbyfisher Messages postés 89 Date d'inscription vendredi 30 octobre 2009 Statut Membre Dernière intervention 17 octobre 2013 5
9 oct. 2012 à 12:35
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) !
0
eriiic Messages postés 24570 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 8 mai 2024 7 217
9 oct. 2012 à 12:47
sans fichier je ne peux rien pour toi, désolé
eric
0
bobbyfisher Messages postés 89 Date d'inscription vendredi 30 octobre 2009 Statut Membre Dernière intervention 17 octobre 2013 5
9 oct. 2012 à 13:57
Voici le fichier :https://www.cjoint.com/?3Jjn4kZmdc0 (simplifié mais même souci)

Merci mille fois par avance !
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
9 oct. 2012 à 14:35
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
0
bobbyfisher Messages postés 89 Date d'inscription vendredi 30 octobre 2009 Statut Membre Dernière intervention 17 octobre 2013 5
9 oct. 2012 à 14:44
Bonjour Michel,
Je souhaite avoir une cellule unique de référence (où la valeur (en l'occurence le nom de la photo) change). Tu as une idée comment faire ?
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
9 oct. 2012 à 14:56
HE,HO !!! :-(

j'ai fait suivant ton classeur où tu présentes une liste !!!

Si je t'envoie un truc avec une cellule unique (ou autre), tu vas me dire quoi?
0
eriiic Messages postés 24570 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 8 mai 2024 7 217
9 oct. 2012 à 16:05
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
0
bobbyfisher Messages postés 89 Date d'inscription vendredi 30 octobre 2009 Statut Membre Dernière intervention 17 octobre 2013 5
9 oct. 2012 à 16:13
C'est parfait, magnifique! Je tente de l'adapter à mon fichier de suite. Merci !!!
0
bobbyfisher Messages postés 89 Date d'inscription vendredi 30 octobre 2009 Statut Membre Dernière intervention 17 octobre 2013 5
9 oct. 2012 à 16:59
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 !!
0
eriiic Messages postés 24570 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 8 mai 2024 7 217
9 oct. 2012 à 18:09
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
0
bobbyfisher Messages postés 89 Date d'inscription vendredi 30 octobre 2009 Statut Membre Dernière intervention 17 octobre 2013 5
9 oct. 2012 à 18:32
Oui, ce sont des zones indépendantes...
0
eriiic Messages postés 24570 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 8 mai 2024 7 217
9 oct. 2012 à 18:51
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
0
bobbyfisher Messages postés 89 Date d'inscription vendredi 30 octobre 2009 Statut Membre Dernière intervention 17 octobre 2013 5
9 oct. 2012 à 22:44
J'ai vraiment trop de mal mais je me m'accroche...
Dis moi, ton fichier est un .xls mais comporte une macro. On est pas obligé de l'enregistrer en .xlsm ?
0
eriiic Messages postés 24570 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 8 mai 2024 7 217
Modifié par eriiic le 9/10/2012 à 23:36
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
0
bobbyfisher Messages postés 89 Date d'inscription vendredi 30 octobre 2009 Statut Membre Dernière intervention 17 octobre 2013 5
Modifié par bobbyfisher le 10/10/2012 à 22:40
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 !!!
0
eriiic Messages postés 24570 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 8 mai 2024 7 217
11 oct. 2012 à 00:44
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 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
0
bobbyfisher Messages postés 89 Date d'inscription vendredi 30 octobre 2009 Statut Membre Dernière intervention 17 octobre 2013 5
12 oct. 2012 à 15:41
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
0
eriiic Messages postés 24570 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 8 mai 2024 7 217
12 oct. 2012 à 16:57
Bonjour,

Et ça ne fonctionne pas
je plaisantais en disant que c'était pour faire joli...
On ne met pas de lignes de code pour rien.

As-tu déverrouillé tes cellules et expliqué aux gens que lorsqu'on double-clique sur une cellule c'est pour l'éditer (ou désactivé le double-clic comme indiqué) ?

eric
0
bobbyfisher Messages postés 89 Date d'inscription vendredi 30 octobre 2009 Statut Membre Dernière intervention 17 octobre 2013 5
12 oct. 2012 à 17:05
Non, pour l'instant, les gens ne l'utilisent pas. Je ne peux pas le désactiver car les gens doivent pouvoir éditer.

Je n'avais pas saisi que tu plaisantais... Donc je n'ai aucun moyen de modifier la macro initiale pour qu'elle fonctionne dans mon cas ?
0
eriiic Messages postés 24570 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 8 mai 2024 7 217
12 oct. 2012 à 17:34
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
0