Fonction écrite sous VBA ne fonctionne pas dans Excel

fgehin

XLDnaute Junior
Bonjour,

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

End Function

D'avance merci pour un petit coup de main

Faustine
 

Dranreb

XLDnaute Barbatruc
Re : Fonction écrite sous VBA ne fonctionne pas dans Excel

Bonjour.
Faut-il déclarer la fonction de manière particulière pour que ça fonctionne?
Non.

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.
 
Dernière édition:

fgehin

XLDnaute Junior
Re : Fonction écrite sous VBA ne fonctionne pas dans Excel

Merci Dranreb pour votre réponse.

J'ai fait ce que vous m'avez suggéré, le msgbox affiche Range mais la fonction donne toujours lieu sous Excel à une erreur de type #VALUE.
 

Dranreb

XLDnaute Barbatruc
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 ?
 

fgehin

XLDnaute Junior
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.

Des suggestions?...
 

Pièces jointes

  • Test IsLocal.xlsm
    15.9 KB · Affichages: 62
  • Test IsLocal.xlsm
    15.9 KB · Affichages: 69
  • Test IsLocal.xlsm
    15.9 KB · Affichages: 70

Dranreb

XLDnaute Barbatruc
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 :
Code:
=Myvalue_1*SI(IsLocal(Myvalue_1);Exchange_rate;1)
 
Dernière édition:

fgehin

XLDnaute Junior
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...
 

Pièces jointes

  • Test IsLocal.xlsm
    18.2 KB · Affichages: 60
  • Test IsLocal.xlsm
    18.2 KB · Affichages: 67
  • Test IsLocal.xlsm
    18.2 KB · Affichages: 75

Dranreb

XLDnaute Barbatruc
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.
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
312 350
Messages
2 087 514
Membres
103 572
dernier inscrit
hamzahaha