Fonction VBA : Accepte mal le résultat d'une formule

Kiseki

XLDnaute Occasionnel
Bonjour,

J'utilise une fonction pour afficher une image d'un répertoire /Photo/NOM PRÉNOM.jpg

Elle fonctionne très bien si je remplis les cellules pour le NOM/PRÉNOM, mais lorsque ce résultat est donné par une formule Excel bug, relance et charge l'image correctement.

Ensuite il ne veux plus afficher la moindre image avant d'être relancé.

Code:
Function AfficheImage(NomImage, Optional rep)
  Application.Volatile
  If IsMissing(rep) Then rep = ThisWorkbook.Path & "\Photo\"
  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
        p = InStr(k.Name, "_")
        If Mid(k.Name, p + 1) = adr.Address Then k.Delete
     Next k
     If Dir(rep & NomImage) = "" Then
        AfficheImage = "Photo"
     Else
       Set myShell = CreateObject("Shell.Application")
       If TypeName(rep) = "Range" Then
          Set myFolder = myShell.Namespace(rep.Value)
       Else
          Set myFolder = myShell.Namespace(rep)
       End If
       Set myFile = myFolder.Items.Item(NomImage)
       Taille = myFolder.GetDetailsOf(myFile, 26)
       H = Val(Split(Taille, "x")(1))
       L = Val(Split(Taille, "x")(0))
       echH = adr2.Height / H
       EchL = adr2.Width / L
       If L * echH > adr2.Width Then ech = EchL Else ech = echH
       H = H * ech
       L = L * ech - 2
       Set s = adr.Worksheet.Shapes.AddPicture(rep & NomImage, True, True, adr.Left, adr.Top, L, H)
       s.Name = NomImage & "_" & adr.Address
       AfficheImage = ""
    End If
  End If
End Function

Je fait appel à cette fonction par :
Code:
=AfficheImage($E$5 & " " & $E$6 & ".jpg")

Mais si E5 et E6 son une formule, Excel bug.

Par contre manuellement ça fonctionne très bien.



D'où pourrai venir ce désagrément ?


Merci,
 

Dranreb

XLDnaute Barbatruc
Re : Fonction VBA : Accepte mal le résultat d'une formule

Bonjour.
Dans une Function, il vaut mieux éviter de tenter de modifier quoi que ce soit dans une feuille,
même apparemment des shapes. Ce serait plutôt le travail d'une Sub.
Si vous tenez à la fonction, qui aurait l'avantage de détecter la charge de changer la photo si vous envelez le Application.Volatile, mettez les informations nécessaires au traitemement dans des tableaux Public, interrogez ces informations dans une Workseet.Calculate du module de la feuille qui effectuera le traitement quand Excel sera à même de le faire.
Ou voyez si le traitement ne peut pas s'écrire dans une Workseet_Change
À part ça remarques en vrac:
De grâce, déclarez vos variables typées explicitement.
Range(adr.Address) est une ânerie, c'est la même chose que adr tout simplement (à déclarer As Range).
Vous auriez peut être intérêt à travailler plutôt avec des objets images de la boîte à outils contrôles plutôt qu'avec des shapes.
Essayez de joindre un fichier avec seulement 2 photos maxi, minuscules.
À+
 

Kiseki

XLDnaute Occasionnel
Re : Fonction VBA : Accepte mal le résultat d'une formule

Bonjour,

Merci,


Excuse moi mais ce code ne viens pas de moi et je débute, donc je comprend la moitié de ce que tu me dit et j'ai un peu de mal à trouver quel déclaration pour tel variable.


Selon ce que je comprend il faudrait éviter des formules dans les paramètres d'une fonction personnalisée ? Mais pourquoi les fonctions de base les géreraient très bien et non une personnalisée ?


Je vais tenter de déclarer toutes les variables.
 

Dranreb

XLDnaute Barbatruc
Re : Fonction VBA : Accepte mal le résultat d'une formule

Selon ce que je comprend il faudrait éviter des formules dans les paramètres d'une fonction personnalisée
Je n'ai jamais dit ça. Il faudrait éviter qu'une fonction personnalisée aboutisse à des changements dans une feuille effectués pendant son évaluation.
 

Statistiques des forums

Discussions
312 466
Messages
2 088 677
Membres
103 918
dernier inscrit
comite des fets allonzier