J'ai écrit une fonction sous VBA, qui fonctionne parfaitement lorsque je l'appelle depuis une macro. Par contre j'ai besoin de l'appeler depuis Excel (dans le champ "=" de la cellule) et ça ne fonctionne pas.
Faut-il déclarer la fonction de manière particulière pour que ça fonctionne? Ou s'y prendre autrement?
Le code de ma fonction:
Function IsLocal(rowname As String)
Dim unit As String
unit = Cells(Range(rowname).Row, 3).Value
If InStr(1, unit, "AED", 1) <> 0 Then
IsLocal = 1
Else
IsLocal = 0
End If
Et ne me demandez pas "mais alors pourquoi ça ne fonctionne pas ?", parce que ça on n'a aucun moyen de le savoir tant les causes possibles sont nombreuses. Entre autre elle peut être écrite dans une autre sorte de module qu'un module ordinaire (auquel cas elle en est Private, et même si elle est déclarée Public c'en est une méthode), il peut y avoir incompatibilité de type sur l'argument passé. Déclarez le ByVal RowName As Variant et mettez en 1er dans la fonction un MsgBox TypeName(RowName)
P.S. La fonction semble rédigée de telle sorte que le paramètre doive être une référence de plage (y compris un nom éventuel) spécifiée entre double guillemets. Si vous déclarez le paramètre comme ByVal Plage As Range son numéro de ligne sera directement Plage.Row et vous n'airez plus à le spécifier entre doubles guillemets.
Re : Fonction écrite sous VBA ne fonctionne pas dans Excel
Dans ce cas il essaye de dégager un texte de la propriété Value du Range. Ça ne peut pas marcher si ce Range comporte plusieurs cellules. S'il n'en comporte bien qu'une, sa valeur peut ne pas être un texte représentant un nom ou une adresse de plage.
Voir aussi mon post scriptum précédent.
vous allez continuer longtemps à nous faire perdre notre temps à ne pas joindre votre classeur ?
Re : Fonction écrite sous VBA ne fonctionne pas dans Excel
Je n'avais pas vu le PS! Ci-joint un fichier de test. L'ensemble n'a bien évidemment pas de sens pour un cas de figure aussi simple, mon exemple est beaucoup plus complexe et j'ai volontairement fourni une version simplifiée.
J'ai partiellement résolu le problème: je parviens maintenant à utiliser la fonction sous Excel, en écrivant le nom de la cellule nommée entre " " dans l'argument de la fonction.
Le problème est que cette fonction 1 est écrite dans Excel via une macro qui utilise une autre fonction 2. Et lorsque je tente de mettre des " " dans l'argument de la fonction 2, j'ai une erreur à la compilation.
Re : Fonction écrite sous VBA ne fonctionne pas dans Excel
En l'écrivant ainsi ça marche sur votre exemple en enlevant les doubles guillemets dans les cellules :
VB:
Function IsLocal(ByVal RowName As Range) As Double
Dim Unit As String
Unit = Cells(RowName.Row, 3).Value
If InStr(1, Unit, "EUR", 1) <> 0 Then
IsLocal = 1
Else
IsLocal = 0
End If
End Function
Maintenant si vous voulez utiliser le nom spécifié en colonne B ce serait possible en se rerapprochant de ce que vous avez fait.
Attention la fonction pourrait ne pas être réévaluée si voous changez un paramètre qui, bien qu'intervenant, ne lui est pas transmis.
P.S. mais je ne vois pas trop pourquoi vous faites des formules si compliquées. Plutôt, en D12 par exemple :
Re : Fonction écrite sous VBA ne fonctionne pas dans Excel
Merci beaucoup, ça marche effectivement bien dans le fichier test comme ça. J'ai cherché depuis hier à comprendre pourquoi ça ne marchait pas dans mon fichier réel, du coup... Jusqu'à ce que je réalise que j'utilise la fonction IsLocal dans un autre onglet que celui où sont situées les cellules nommées.
J'ai refait le test sur le fichier test... et ça ne marche pas non plus. Que faut-il modifier pour que la fonction IsLocal fonctionne sur tous les onglets?...
En PJ le fichier test, sur lequel on voit bien que la fonction marche en onglet 1 et pas en onglet 2...
Re : Fonction écrite sous VBA ne fonctionne pas dans Excel
Bonsoir.
J'ai ouvert votre classeur (converti en .xls), chez moi la formule fonctionne sur les 2 feuilles.
Le "=1" est inutile dans la condition. Dans le SI Excel comme dans le If VBA l'expression est considérée vraie si elle est différente de 0.