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   -
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

9 réponses

  1. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
     
    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
  2. 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
    1. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      Bojour,

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

      dans l'attente
      0
    2. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
       
      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
  3. 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
    1. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
       
      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
    2. 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
    3. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
       
      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
    4. bobbyfisher Messages postés 105 Statut Membre 5
       
      yes j'ai trouvé où ça bloque. Maintenant, comment corriger, c'est une autre affaire...
      0
  4. 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
    1. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
       
      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
    2. 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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. 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
    1. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
       
      sans fichier je ne peux rien pour toi, désolé
      eric
      0
    2. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      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
    3. 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
    4. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      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
  7. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
     
    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
  8. bobbyfisher Messages postés 105 Statut Membre 5
     
    C'est parfait, magnifique! Je tente de l'adapter à mon fichier de suite. Merci !!!
    0
  9. 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
    1. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
       
      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
    2. bobbyfisher Messages postés 105 Statut Membre 5
       
      Oui, ce sont des zones indépendantes...
      0
    3. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
       
      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
    4. 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
    5. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
       
      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
  10. 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
    1. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
       
      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
    2. 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
    3. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
       
      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
    4. 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
    5. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
       
      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