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   -
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 25847 Date d'inscription   Statut Contributeur Dernière intervention   7 282
 
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 105 Statut Membre 5
 
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 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 318
 
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 25847 Date d'inscription   Statut Contributeur Dernière intervention   7 282
 
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 105 Statut Membre 5
 
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 25847 Date d'inscription   Statut Contributeur Dernière intervention   7 282
 
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 105 Statut Membre 5
 
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 25847 Date d'inscription   Statut Contributeur Dernière intervention   7 282
 
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 105 Statut Membre 5
 
yes j'ai trouvé où ça bloque. Maintenant, comment corriger, c'est une autre affaire...
0
bobbyfisher Messages postés 105 Statut Membre 5
 
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 25847 Date d'inscription   Statut Contributeur Dernière intervention   7 282
 
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 105 Statut Membre 5
 
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 105 Statut Membre 5
 
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 25847 Date d'inscription   Statut Contributeur Dernière intervention   7 282
 
sans fichier je ne peux rien pour toi, désolé
eric
0
bobbyfisher Messages postés 105 Statut Membre 5
 
Voici le fichier :https://www.cjoint.com/?3Jjn4kZmdc0 (simplifié mais même souci)

Merci mille fois par avance !
0
michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 318
 
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 105 Statut Membre 5
 
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 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 318
 
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 25847 Date d'inscription   Statut Contributeur Dernière intervention   7 282
 
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 105 Statut Membre 5
 
C'est parfait, magnifique! Je tente de l'adapter à mon fichier de suite. Merci !!!
0
bobbyfisher Messages postés 105 Statut Membre 5
 
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 25847 Date d'inscription   Statut Contributeur Dernière intervention   7 282
 
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 105 Statut Membre 5
 
Oui, ce sont des zones indépendantes...
0
eriiic Messages postés 25847 Date d'inscription   Statut Contributeur Dernière intervention   7 282
 
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 105 Statut Membre 5
 
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 25847 Date d'inscription   Statut Contributeur Dernière intervention   7 282
 
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 105 Statut Membre 5
 
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 25847 Date d'inscription   Statut Contributeur Dernière intervention   7 282
 
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 105 Statut Membre 5
 
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 25847 Date d'inscription   Statut Contributeur Dernière intervention   7 282
 
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 105 Statut Membre 5
 
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 25847 Date d'inscription   Statut Contributeur Dernière intervention   7 282
 
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