Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Fonction personnalisée VBA + erreur #valeur! lors des recalculs

13 réponses
Avatar
Byothe
J'ai créé une fonction relativement simple en vba :

------------------
Function Quotation_Solvabilite(secteur, Solvabilité)

If secteur = "Basic Materials" Then
a = Worksheets("Parametrage").Range("D4").Value
If Solvabilité < 0 Then
Quotation_Solvabilite = 7
Else: Quotation_Solvabilite = 7 - Solvabilité
End If
ElseIf secteur = "Industrie et Services" Then
a = Worksheets("Parametrage").Range("D5").Value
If Solvabilité > 0 Then
Quotation_Solvabilite = 7
Else: Quotation_Solvabilite = 7 - Solvabilité
End If
ElseIf secteur = "Oil&Gas" Then
a = Worksheets("Parametrage").Range("D6").Value
If Solvabilité < 0 Then
Quotation_Solvabilite = 7
Else: Quotation_Solvabilite = 7 - Solvabilité
End If
ElseIf secteur = "Telecom" Then
a = Worksheets("Parametrage").Range("D7").Value
If Solvabilité < 0 Then
Quotation_Solvabilite = 7
Else: Quotation_Solvabilite = 7 - Solvabilité
End If
ElseIf secteur = "Utilities" Then
a = Worksheets("Parametrage").Range("D8").Value
If Solvabilité < 0 Then
Quotation_Solvabilite = 7
Else: Quotation_Solvabilite = 7 - Solvabilité
End If
ElseIf secteur = "Finance" Then
a = Worksheets("Parametrage").Range("D9").Value
If Solvabilité < 0 Then
Quotation_Solvabilite = 7
Else: Quotation_Solvabilite = 7 - Solvabilité
End If
End If

End Function
-------------------------

Et dès que le fichier se recalcule cette fonction qui retournait une valeur
renvoie un #VALEUR!

Je ne sait pas comment resoudre ce problème.
Merci de m'aider.

10 réponses

1 2
Avatar
FxM
Bonsoir,

Insère une instruction STOP juste après la première ligne (function
...), demande un recalcul. La ligne contenant STOP va être surlignée en
jaune. Presse F8 pour exécuter la fonction en mode pas-à-pas et vérifie
les différentes valeurs et les définitions de variables.

Points spécifiques :
- quelle est l'utilité de la variable 'a' puisqu'elle n'est utilisée
nulle part ?
-quelle est l'utilité de vérifier les secteurs puisque la reste de la
fonction utilise toujours les mêmes variables ?
- éviter les accents dans les noms, etc ...
- Basic Materials <> BAsic Materials, etc ...
- quid si solvabilité (arghh, l'accent) est >= 0 ?

@+
FxM


Byothe wrote:
J'ai créé une fonction relativement simple en vba :

------------------
Function Quotation_Solvabilite(secteur, Solvabilité)

If secteur = "Basic Materials" Then
a = Worksheets("Parametrage").Range("D4").Value
If Solvabilité < 0 Then
Quotation_Solvabilite = 7
Else: Quotation_Solvabilite = 7 - Solvabilité
End If
ElseIf secteur = "Industrie et Services" Then
a = Worksheets("Parametrage").Range("D5").Value
If Solvabilité > 0 Then
Quotation_Solvabilite = 7
Else: Quotation_Solvabilite = 7 - Solvabilité
End If
ElseIf secteur = "Oil&Gas" Then
a = Worksheets("Parametrage").Range("D6").Value
If Solvabilité < 0 Then
Quotation_Solvabilite = 7
Else: Quotation_Solvabilite = 7 - Solvabilité
End If
ElseIf secteur = "Telecom" Then
a = Worksheets("Parametrage").Range("D7").Value
If Solvabilité < 0 Then
Quotation_Solvabilite = 7
Else: Quotation_Solvabilite = 7 - Solvabilité
End If
ElseIf secteur = "Utilities" Then
a = Worksheets("Parametrage").Range("D8").Value
If Solvabilité < 0 Then
Quotation_Solvabilite = 7
Else: Quotation_Solvabilite = 7 - Solvabilité
End If
ElseIf secteur = "Finance" Then
a = Worksheets("Parametrage").Range("D9").Value
If Solvabilité < 0 Then
Quotation_Solvabilite = 7
Else: Quotation_Solvabilite = 7 - Solvabilité
End If
End If

End Function
-------------------------

Et dès que le fichier se recalcule cette fonction qui retournait une valeur
renvoie un #VALEUR!

Je ne sait pas comment resoudre ce problème.
Merci de m'aider.



Avatar
Byothe
Merci FxM,

J'ai essayé ce que tu m'as dit.
La plus grosse boulette étant le "a" qui ne servait à rien. J'ai modifié ma
formule puisque le a devait quand même servir. (enfin au final sa valeur est
sensée être 0).

Malheureusement mon problème existe toujours.

Je vais essayer d'être plus précis (en essayant de rester clair) !
- EN fait ce qu'il se passe c'est que j'ai un autre fichier qui pointe sur
le resultat de cette fonction. Hors quand cet autre fichier est ouvert et que
j'effectue des calculs dans cet autre fichier, la fonction se recalcule et
renvoie #VALEUR!.
Par contre si je fais recalculer (F9) le fichier sur lequel se trouve ma
fonction il ne se passe rien de spécial.
- Les 2 arguments de ma fonction :
+ secteur : il pointe sur une liste de choix qui se source dans un autre
onglet
+ solvabilite : il pointe sur une cellule qui renvoie une valeur calculée
à partir d'autre cellules aussi calculées... et j'ai le sentiment que le
problème vient de là !!!
En effet j'utilise ma fonction à un deuxième endroit mais l'argument
solvabilite pointe sur une cellule qui est un simple calcul réalisé à partir
de 2 autres cellules dans lesquelles les chiffres sont rentrés en dur.

Voila, j'espère que ce sera un peu plus clair.
J'ai modifié ma fonction de la sorte :

------------------------
Function Quotation_Solvabilite(secteur, Solvabilite)

If secteur = "Basic Materials" Then
a = Worksheets("Parametrage").Range("D4").Value
If Solvabilite < a Then
Quotation_Solvabilite = 7
ElseIf Solvabilite >= a Then
Quotation_Solvabilite = 7 - Solvabilite
End If
ElseIf secteur = "Industrie et Services" Then
a = Worksheets("Parametrage").Range("D5").Value
If Solvabilite > a Then
Quotation_Solvabilite = 7
ElseIf Solvabilite >= a Then
Quotation_Solvabilite = 7 - Solvabilite
End If
ElseIf secteur = "Oil&Gas" Then
a = Worksheets("Parametrage").Range("D6").Value
If Solvabilite < a Then
Quotation_Solvabilite = 7
ElseIf Solvabilite >= a Then
Quotation_Solvabilite = 7 - Solvabilite
End If
ElseIf secteur = "Telecom" Then
a = Worksheets("Parametrage").Range("D7").Value
If Solvabilite < a Then
Quotation_Solvabilite = 7
ElseIf Solvabilite >= a Then
Quotation_Solvabilite = 7 - Solvabilite
End If
ElseIf secteur = "Utilities" Then
a = Worksheets("Parametrage").Range("D8").Value
If Solvabilite < a Then
Quotation_Solvabilite = 7
ElseIf Solvabilite >= a Then
Quotation_Solvabilite = 7 - Solvabilite
End If
ElseIf secteur = "Finance" Then
a = Worksheets("Parametrage").Range("D9").Value
If Solvabilite < a Then
Quotation_Solvabilite = 7
ElseIf Solvabilite >= a Then
Quotation_Solvabilite = 7 - Solvabilite
End If
End If

End Function
----------

Voila si quelqu'un a compris quelque chose à mon charabia et trouve une
solution, cela m'aiderait beaucoup.
Avatar
FxM
Bonsoir,

Je n'ai toujours pas vraiment compris ton charabia :o) mais ta fonction
peut déjà se simplifier comme suit par exemple :

Function Quotation_Solvabilite(secteur, Solvabilite)
select case secteur
case "Basic Materials":cel="D4"
case "Industrie et Services":cel="D5"
case "Oil&Gas" :cel="D6"
case "Telecom":cel="D7"
case "Utilities":cel="D8"
case "Finance" :cel="D9"
a = Worksheets("Parametrage").Range(cel)
If Solvabilite < a Then
Quotation_Solvabilite = 7
else
Quotation_Solvabilite = 7 - Solvabilite
end if
end function


Comme je te l'indiquais dans mon message précédent, insère la commande
stop juste après la première ligne :

Function Quotation_Solvabilite(secteur, Solvabilite)
STOP 'ici !!!!!
select case secteur

lance un recalcul. Si ta fonction est appelée, la fonction va s'arrêter
sur cette commande stop.
Reste à jeter un zieux dans la valeur des variables aux différentes
étapes et voir si elles sont cohérentes avec ce qu'elles devraient être.
Les différentes avançant chaque fois que tu presseras la touche F8.

Le fait que tu aies #VALEUR! me laisse à penser que tu essayerais
d'ajouter ou de soustraire des cellules au format texte par exemple.

Teste également ce que renvoie ta fonction lorsque tu es dans le
classeur où elle est écrite. Mais cela ne devrait pas poser problème.

S'il n'y a rien de confidentiel, tu peux envoyer un extrait de ton
fichier + fonction : (enlever le dernier bout)
http://www.cerbermail.com/?k5ZVPVhNiy

@+
FxM



Byothe wrote:
Merci FxM,

J'ai essayé ce que tu m'as dit.
La plus grosse boulette étant le "a" qui ne servait à rien. J'ai modifié ma
formule puisque le a devait quand même servir. (enfin au final sa valeur est
sensée être 0).

Malheureusement mon problème existe toujours.

Je vais essayer d'être plus précis (en essayant de rester clair) !
- EN fait ce qu'il se passe c'est que j'ai un autre fichier qui pointe sur
le resultat de cette fonction. Hors quand cet autre fichier est ouvert et que
j'effectue des calculs dans cet autre fichier, la fonction se recalcule et
renvoie #VALEUR!.
Par contre si je fais recalculer (F9) le fichier sur lequel se trouve ma
fonction il ne se passe rien de spécial.
- Les 2 arguments de ma fonction :
+ secteur : il pointe sur une liste de choix qui se source dans un autre
onglet
+ solvabilite : il pointe sur une cellule qui renvoie une valeur calculée
à partir d'autre cellules aussi calculées... et j'ai le sentiment que le
problème vient de là !!!
En effet j'utilise ma fonction à un deuxième endroit mais l'argument
solvabilite pointe sur une cellule qui est un simple calcul réalisé à partir
de 2 autres cellules dans lesquelles les chiffres sont rentrés en dur.

Voila, j'espère que ce sera un peu plus clair.
J'ai modifié ma fonction de la sorte :

------------------------
Function Quotation_Solvabilite(secteur, Solvabilite)

If secteur = "Basic Materials" Then
a = Worksheets("Parametrage").Range("D4").Value
If Solvabilite < a Then
Quotation_Solvabilite = 7
ElseIf Solvabilite >= a Then
Quotation_Solvabilite = 7 - Solvabilite
End If
ElseIf secteur = "Industrie et Services" Then
a = Worksheets("Parametrage").Range("D5").Value
If Solvabilite > a Then
Quotation_Solvabilite = 7
ElseIf Solvabilite >= a Then
Quotation_Solvabilite = 7 - Solvabilite
End If
ElseIf secteur = "Oil&Gas" Then
a = Worksheets("Parametrage").Range("D6").Value
If Solvabilite < a Then
Quotation_Solvabilite = 7
ElseIf Solvabilite >= a Then
Quotation_Solvabilite = 7 - Solvabilite
End If
ElseIf secteur = "Telecom" Then
a = Worksheets("Parametrage").Range("D7").Value
If Solvabilite < a Then
Quotation_Solvabilite = 7
ElseIf Solvabilite >= a Then
Quotation_Solvabilite = 7 - Solvabilite
End If
ElseIf secteur = "Utilities" Then
a = Worksheets("Parametrage").Range("D8").Value
If Solvabilite < a Then
Quotation_Solvabilite = 7
ElseIf Solvabilite >= a Then
Quotation_Solvabilite = 7 - Solvabilite
End If
ElseIf secteur = "Finance" Then
a = Worksheets("Parametrage").Range("D9").Value
If Solvabilite < a Then
Quotation_Solvabilite = 7
ElseIf Solvabilite >= a Then
Quotation_Solvabilite = 7 - Solvabilite
End If
End If

End Function
----------

Voila si quelqu'un a compris quelque chose à mon charabia et trouve une
solution, cela m'aiderait beaucoup.




Avatar
Byothe
Bonjour,

Ta simplification est très interessante et marche très bien !
Cependant j'ai toujours le même problème. Malheureusement je ne peux pas
t'envoyer le fichier car c'est pour mon boulot et c'est confidentiel.

J'ai essayé de voir avec le STOP ! Les arguments sont tous correct. Je ne
pense pas que le problème vienne de la formule mais plutôt des arguments
demandés par la fonction à savoir : secteur mais surtout solvabilité.

C'est vraiment bizarre puisque la fonction me renvoie bien la bonne valeur
jusqu'à ce que je fasse un calcul quelconque dans un 2e fichier ouvert
quelconque. Après j'ai le fameux #VALEUR!. Mais par contre si je retourne sur
ma cellule où est entrée la fonction, que je la selectionne et que je fais
"entrée", je retrouve bien ma valeur !

Bref, merci pour ton aide !!!


Bonsoir,

Je n'ai toujours pas vraiment compris ton charabia :o) mais ta fonction
peut déjà se simplifier comme suit par exemple :

Function Quotation_Solvabilite(secteur, Solvabilite)
select case secteur
case "Basic Materials":cel="D4"
case "Industrie et Services":cel="D5"
case "Oil&Gas" :cel="D6"
case "Telecom":cel="D7"
case "Utilities":cel="D8"
case "Finance" :cel="D9"
a = Worksheets("Parametrage").Range(cel)
If Solvabilite < a Then
Quotation_Solvabilite = 7
else
Quotation_Solvabilite = 7 - Solvabilite
end if
end function


Comme je te l'indiquais dans mon message précédent, insère la commande
stop juste après la première ligne :

Function Quotation_Solvabilite(secteur, Solvabilite)
STOP 'ici !!!!!
select case secteur

lance un recalcul. Si ta fonction est appelée, la fonction va s'arrêter
sur cette commande stop.
Reste à jeter un zieux dans la valeur des variables aux différentes
étapes et voir si elles sont cohérentes avec ce qu'elles devraient être.
Les différentes avançant chaque fois que tu presseras la touche F8.

Le fait que tu aies #VALEUR! me laisse à penser que tu essayerais
d'ajouter ou de soustraire des cellules au format texte par exemple.

Teste également ce que renvoie ta fonction lorsque tu es dans le
classeur où elle est écrite. Mais cela ne devrait pas poser problème.

S'il n'y a rien de confidentiel, tu peux envoyer un extrait de ton
fichier + fonction : (enlever le dernier bout)
http://www.cerbermail.com/?k5ZVPVhNiy

@+
FxM



Byothe wrote:
Merci FxM,

J'ai essayé ce que tu m'as dit.
La plus grosse boulette étant le "a" qui ne servait à rien. J'ai modifié ma
formule puisque le a devait quand même servir. (enfin au final sa valeur est
sensée être 0).

Malheureusement mon problème existe toujours.

Je vais essayer d'être plus précis (en essayant de rester clair) !
- EN fait ce qu'il se passe c'est que j'ai un autre fichier qui pointe sur
le resultat de cette fonction. Hors quand cet autre fichier est ouvert et que
j'effectue des calculs dans cet autre fichier, la fonction se recalcule et
renvoie #VALEUR!.
Par contre si je fais recalculer (F9) le fichier sur lequel se trouve ma
fonction il ne se passe rien de spécial.
- Les 2 arguments de ma fonction :
+ secteur : il pointe sur une liste de choix qui se source dans un autre
onglet
+ solvabilite : il pointe sur une cellule qui renvoie une valeur calculée
à partir d'autre cellules aussi calculées... et j'ai le sentiment que le
problème vient de là !!!
En effet j'utilise ma fonction à un deuxième endroit mais l'argument
solvabilite pointe sur une cellule qui est un simple calcul réalisé à partir
de 2 autres cellules dans lesquelles les chiffres sont rentrés en dur.

Voila, j'espère que ce sera un peu plus clair.
J'ai modifié ma fonction de la sorte :

------------------------
Function Quotation_Solvabilite(secteur, Solvabilite)

If secteur = "Basic Materials" Then
a = Worksheets("Parametrage").Range("D4").Value
If Solvabilite < a Then
Quotation_Solvabilite = 7
ElseIf Solvabilite >= a Then
Quotation_Solvabilite = 7 - Solvabilite
End If
ElseIf secteur = "Industrie et Services" Then
a = Worksheets("Parametrage").Range("D5").Value
If Solvabilite > a Then
Quotation_Solvabilite = 7
ElseIf Solvabilite >= a Then
Quotation_Solvabilite = 7 - Solvabilite
End If
ElseIf secteur = "Oil&Gas" Then
a = Worksheets("Parametrage").Range("D6").Value
If Solvabilite < a Then
Quotation_Solvabilite = 7
ElseIf Solvabilite >= a Then
Quotation_Solvabilite = 7 - Solvabilite
End If
ElseIf secteur = "Telecom" Then
a = Worksheets("Parametrage").Range("D7").Value
If Solvabilite < a Then
Quotation_Solvabilite = 7
ElseIf Solvabilite >= a Then
Quotation_Solvabilite = 7 - Solvabilite
End If
ElseIf secteur = "Utilities" Then
a = Worksheets("Parametrage").Range("D8").Value
If Solvabilite < a Then
Quotation_Solvabilite = 7
ElseIf Solvabilite >= a Then
Quotation_Solvabilite = 7 - Solvabilite
End If
ElseIf secteur = "Finance" Then
a = Worksheets("Parametrage").Range("D9").Value
If Solvabilite < a Then
Quotation_Solvabilite = 7
ElseIf Solvabilite >= a Then
Quotation_Solvabilite = 7 - Solvabilite
End If
End If

End Function
----------

Voila si quelqu'un a compris quelque chose à mon charabia et trouve une
solution, cela m'aiderait beaucoup.







Avatar
FxM
Bonjour,

Je n'avais pas fait attention au second classeur :o(

Voici des points à vérifier :
a) transforme ta fonction de :
Function Quotation_Solvabilite(secteur, Solvabilite)
en :
Public Function Quotation_Solvabilite(secteur, Solvabilite)

b) s'assurer que le code est dans un module (insertion | module) et pas
dans le module d'une feuille.

c) vois si "worksheets" est la même chose que "sheets"

d) Par ailleurs, dans quel classeur se situe la feuille "paramétrage" ?
Tel qu'écrit, Excel considère dans le classeur qui contient la fonction.
Si ça doit faire référence à ton second classeur, on peut modifier
légèrement comme suit :

Public Function Quotation_Solvabilite(classeur, secteur, Solvabilite)

puis passer de :
a = Worksheets("Parametrage").Range(cel)
à :


a = workbooks(classeur).Worksheets("Parametrage").Range(cel)



Sinon, je commence à donner ma langue au chat (qui a dit Miaou ?).

@+
FxM



Byothe wrote:
Bonjour,

Ta simplification est très interessante et marche très bien !
Cependant j'ai toujours le même problème. Malheureusement je ne peux pas
t'envoyer le fichier car c'est pour mon boulot et c'est confidentiel.

J'ai essayé de voir avec le STOP ! Les arguments sont tous correct. Je ne
pense pas que le problème vienne de la formule mais plutôt des arguments
demandés par la fonction à savoir : secteur mais surtout solvabilité.

C'est vraiment bizarre puisque la fonction me renvoie bien la bonne valeur
jusqu'à ce que je fasse un calcul quelconque dans un 2e fichier ouvert
quelconque. Après j'ai le fameux #VALEUR!. Mais par contre si je retourne sur
ma cellule où est entrée la fonction, que je la selectionne et que je fais
"entrée", je retrouve bien ma valeur !

Bref, merci pour ton aide !!!


Bonsoir,

Je n'ai toujours pas vraiment compris ton charabia :o) mais ta fonction
peut déjà se simplifier comme suit par exemple :

Function Quotation_Solvabilite(secteur, Solvabilite)
select case secteur
case "Basic Materials":cel="D4"
case "Industrie et Services":cel="D5"
case "Oil&Gas" :cel="D6"
case "Telecom":cel="D7"
case "Utilities":cel="D8"
case "Finance" :cel="D9"
a = Worksheets("Parametrage").Range(cel)
If Solvabilite < a Then
Quotation_Solvabilite = 7
else
Quotation_Solvabilite = 7 - Solvabilite
end if
end function


Comme je te l'indiquais dans mon message précédent, insère la commande
stop juste après la première ligne :

Function Quotation_Solvabilite(secteur, Solvabilite)
STOP 'ici !!!!!
select case secteur

lance un recalcul. Si ta fonction est appelée, la fonction va s'arrêter
sur cette commande stop.
Reste à jeter un zieux dans la valeur des variables aux différentes
étapes et voir si elles sont cohérentes avec ce qu'elles devraient être.
Les différentes avançant chaque fois que tu presseras la touche F8.

Le fait que tu aies #VALEUR! me laisse à penser que tu essayerais
d'ajouter ou de soustraire des cellules au format texte par exemple.

Teste également ce que renvoie ta fonction lorsque tu es dans le
classeur où elle est écrite. Mais cela ne devrait pas poser problème.

S'il n'y a rien de confidentiel, tu peux envoyer un extrait de ton
fichier + fonction : (enlever le dernier bout)
http://www.cerbermail.com/?k5ZVPVhNiy

@+
FxM



Byothe wrote:
Merci FxM,

J'ai essayé ce que tu m'as dit.
La plus grosse boulette étant le "a" qui ne servait à rien. J'ai modifié ma
formule puisque le a devait quand même servir. (enfin au final sa valeur est
sensée être 0).

Malheureusement mon problème existe toujours.

Je vais essayer d'être plus précis (en essayant de rester clair) !
- EN fait ce qu'il se passe c'est que j'ai un autre fichier qui pointe sur
le resultat de cette fonction. Hors quand cet autre fichier est ouvert et que
j'effectue des calculs dans cet autre fichier, la fonction se recalcule et
renvoie #VALEUR!.
Par contre si je fais recalculer (F9) le fichier sur lequel se trouve ma
fonction il ne se passe rien de spécial.
- Les 2 arguments de ma fonction :
+ secteur : il pointe sur une liste de choix qui se source dans un autre
onglet
+ solvabilite : il pointe sur une cellule qui renvoie une valeur calculée
à partir d'autre cellules aussi calculées... et j'ai le sentiment que le
problème vient de là !!!
En effet j'utilise ma fonction à un deuxième endroit mais l'argument
solvabilite pointe sur une cellule qui est un simple calcul réalisé à partir
de 2 autres cellules dans lesquelles les chiffres sont rentrés en dur.

Voila, j'espère que ce sera un peu plus clair.
J'ai modifié ma fonction de la sorte :

------------------------
Function Quotation_Solvabilite(secteur, Solvabilite)

If secteur = "Basic Materials" Then
a = Worksheets("Parametrage").Range("D4").Value
If Solvabilite < a Then
Quotation_Solvabilite = 7
ElseIf Solvabilite >= a Then
Quotation_Solvabilite = 7 - Solvabilite
End If
ElseIf secteur = "Industrie et Services" Then
a = Worksheets("Parametrage").Range("D5").Value
If Solvabilite > a Then
Quotation_Solvabilite = 7
ElseIf Solvabilite >= a Then
Quotation_Solvabilite = 7 - Solvabilite
End If
ElseIf secteur = "Oil&Gas" Then
a = Worksheets("Parametrage").Range("D6").Value
If Solvabilite < a Then
Quotation_Solvabilite = 7
ElseIf Solvabilite >= a Then
Quotation_Solvabilite = 7 - Solvabilite
End If
ElseIf secteur = "Telecom" Then
a = Worksheets("Parametrage").Range("D7").Value
If Solvabilite < a Then
Quotation_Solvabilite = 7
ElseIf Solvabilite >= a Then
Quotation_Solvabilite = 7 - Solvabilite
End If
ElseIf secteur = "Utilities" Then
a = Worksheets("Parametrage").Range("D8").Value
If Solvabilite < a Then
Quotation_Solvabilite = 7
ElseIf Solvabilite >= a Then
Quotation_Solvabilite = 7 - Solvabilite
End If
ElseIf secteur = "Finance" Then
a = Worksheets("Parametrage").Range("D9").Value
If Solvabilite < a Then
Quotation_Solvabilite = 7
ElseIf Solvabilite >= a Then
Quotation_Solvabilite = 7 - Solvabilite
End If
End If

End Function
----------

Voila si quelqu'un a compris quelque chose à mon charabia et trouve une
solution, cela m'aiderait beaucoup.








Avatar
Byothe
Bonjour !!

Encore une fois merci... mais malheureusement, la solution n'est toujours
pas là !
La fonction et l'onglet parametrage sont bien dans le même classeur.
Ce que j'essayai d'expliquer c'est que quand le classeur dans lequel
apparaît cette fonction est ouvert, que j'ouvre un autre calsseur quelconque
(qui n'a aucun lien avec ce premier classeur) et que je tape quelque chose
dans une cellule et je fais "Enter"... eh bien paf... ma fonction dans le
premier classeur se retrouve en #VALEUR!.
Il suffit alors que j'aille sur la cellule où est ma fonction en #VALEUR!
que je clique dessus et que je fasse "Enter" et hop je retrouve le bon
chiffre !!!

Bref c'est pas gagné et je desespère !!!

Merci pour tout !



Bonjour,

Je n'avais pas fait attention au second classeur :o(

Voici des points à vérifier :
a) transforme ta fonction de :
Function Quotation_Solvabilite(secteur, Solvabilite)
en :
Public Function Quotation_Solvabilite(secteur, Solvabilite)

b) s'assurer que le code est dans un module (insertion | module) et pas
dans le module d'une feuille.

c) vois si "worksheets" est la même chose que "sheets"

d) Par ailleurs, dans quel classeur se situe la feuille "paramétrage" ?
Tel qu'écrit, Excel considère dans le classeur qui contient la fonction.
Si ça doit faire référence à ton second classeur, on peut modifier
légèrement comme suit :

Public Function Quotation_Solvabilite(classeur, secteur, Solvabilite)

puis passer de :
a = Worksheets("Parametrage").Range(cel)
à :


a = workbooks(classeur).Worksheets("Parametrage").Range(cel)



Sinon, je commence à donner ma langue au chat (qui a dit Miaou ?).

@+
FxM



Byothe wrote:
Bonjour,

Ta simplification est très interessante et marche très bien !
Cependant j'ai toujours le même problème. Malheureusement je ne peux pas
t'envoyer le fichier car c'est pour mon boulot et c'est confidentiel.

J'ai essayé de voir avec le STOP ! Les arguments sont tous correct. Je ne
pense pas que le problème vienne de la formule mais plutôt des arguments
demandés par la fonction à savoir : secteur mais surtout solvabilité.

C'est vraiment bizarre puisque la fonction me renvoie bien la bonne valeur
jusqu'à ce que je fasse un calcul quelconque dans un 2e fichier ouvert
quelconque. Après j'ai le fameux #VALEUR!. Mais par contre si je retourne sur
ma cellule où est entrée la fonction, que je la selectionne et que je fais
"entrée", je retrouve bien ma valeur !

Bref, merci pour ton aide !!!


Bonsoir,

Je n'ai toujours pas vraiment compris ton charabia :o) mais ta fonction
peut déjà se simplifier comme suit par exemple :

Function Quotation_Solvabilite(secteur, Solvabilite)
select case secteur
case "Basic Materials":cel="D4"
case "Industrie et Services":cel="D5"
case "Oil&Gas" :cel="D6"
case "Telecom":cel="D7"
case "Utilities":cel="D8"
case "Finance" :cel="D9"
a = Worksheets("Parametrage").Range(cel)
If Solvabilite < a Then
Quotation_Solvabilite = 7
else
Quotation_Solvabilite = 7 - Solvabilite
end if
end function


Comme je te l'indiquais dans mon message précédent, insère la commande
stop juste après la première ligne :

Function Quotation_Solvabilite(secteur, Solvabilite)
STOP 'ici !!!!!
select case secteur

lance un recalcul. Si ta fonction est appelée, la fonction va s'arrêter
sur cette commande stop.
Reste à jeter un zieux dans la valeur des variables aux différentes
étapes et voir si elles sont cohérentes avec ce qu'elles devraient être.
Les différentes avançant chaque fois que tu presseras la touche F8.

Le fait que tu aies #VALEUR! me laisse à penser que tu essayerais
d'ajouter ou de soustraire des cellules au format texte par exemple.

Teste également ce que renvoie ta fonction lorsque tu es dans le
classeur où elle est écrite. Mais cela ne devrait pas poser problème.

S'il n'y a rien de confidentiel, tu peux envoyer un extrait de ton
fichier + fonction : (enlever le dernier bout)
http://www.cerbermail.com/?k5ZVPVhNiy

@+
FxM



Byothe wrote:
Merci FxM,

J'ai essayé ce que tu m'as dit.
La plus grosse boulette étant le "a" qui ne servait à rien. J'ai modifié ma
formule puisque le a devait quand même servir. (enfin au final sa valeur est
sensée être 0).

Malheureusement mon problème existe toujours.

Je vais essayer d'être plus précis (en essayant de rester clair) !
- EN fait ce qu'il se passe c'est que j'ai un autre fichier qui pointe sur
le resultat de cette fonction. Hors quand cet autre fichier est ouvert et que
j'effectue des calculs dans cet autre fichier, la fonction se recalcule et
renvoie #VALEUR!.
Par contre si je fais recalculer (F9) le fichier sur lequel se trouve ma
fonction il ne se passe rien de spécial.
- Les 2 arguments de ma fonction :
+ secteur : il pointe sur une liste de choix qui se source dans un autre
onglet
+ solvabilite : il pointe sur une cellule qui renvoie une valeur calculée
à partir d'autre cellules aussi calculées... et j'ai le sentiment que le
problème vient de là !!!
En effet j'utilise ma fonction à un deuxième endroit mais l'argument
solvabilite pointe sur une cellule qui est un simple calcul réalisé à partir
de 2 autres cellules dans lesquelles les chiffres sont rentrés en dur.

Voila, j'espère que ce sera un peu plus clair.
J'ai modifié ma fonction de la sorte :

------------------------
Function Quotation_Solvabilite(secteur, Solvabilite)

If secteur = "Basic Materials" Then
a = Worksheets("Parametrage").Range("D4").Value
If Solvabilite < a Then
Quotation_Solvabilite = 7
ElseIf Solvabilite >= a Then
Quotation_Solvabilite = 7 - Solvabilite
End If
ElseIf secteur = "Industrie et Services" Then
a = Worksheets("Parametrage").Range("D5").Value
If Solvabilite > a Then
Quotation_Solvabilite = 7
ElseIf Solvabilite >= a Then
Quotation_Solvabilite = 7 - Solvabilite
End If
ElseIf secteur = "Oil&Gas" Then
a = Worksheets("Parametrage").Range("D6").Value
If Solvabilite < a Then
Quotation_Solvabilite = 7
ElseIf Solvabilite >= a Then
Quotation_Solvabilite = 7 - Solvabilite
End If
ElseIf secteur = "Telecom" Then
a = Worksheets("Parametrage").Range("D7").Value
If Solvabilite < a Then
Quotation_Solvabilite = 7
ElseIf Solvabilite >= a Then
Quotation_Solvabilite = 7 - Solvabilite
End If
ElseIf secteur = "Utilities" Then
a = Worksheets("Parametrage").Range("D8").Value
If Solvabilite < a Then
Quotation_Solvabilite = 7
ElseIf Solvabilite >= a Then
Quotation_Solvabilite = 7 - Solvabilite
End If
ElseIf secteur = "Finance" Then
a = Worksheets("Parametrage").Range("D9").Value
If Solvabilite < a Then
Quotation_Solvabilite = 7
ElseIf Solvabilite >= a Then
Quotation_Solvabilite = 7 - Solvabilite
End If
End If

End Function
----------

Voila si quelqu'un a compris quelque chose à mon charabia et trouve une
solution, cela m'aiderait beaucoup.











Avatar
FxM
Bonsoir,

Teste avec un application.volatile :
Function Quotation_Solvabilite(secteur, Solvabilite)
application.volatile 'ici !
select case secteur

Ajouter application.volatile va forcer un recalcul de la fonction lors
de chaque recalcul.
L'avantage est d'avoir une valeur à jour même lorsqu'aucune valeur
impliquée dans la formule n'a changé.
L'inconvénient est que ça ralentit un petit peu ou un gros peu en
fonction de ce qu'il y a déjà à faire.

Si ta fonction est destinée à être utilisée dans un seul classeur, tu
pourrais également commencer par une gestion d'erreur en vérifiant si le
classeur actif (activeworkbook.name) est celui dans lequel est la
fonction (thisworkbook.name). Si problème, quitter par un exit function.

@+
FxM






Byothe wrote:
Bonjour !!

Encore une fois merci... mais malheureusement, la solution n'est toujours
pas là !
La fonction et l'onglet parametrage sont bien dans le même classeur.
Ce que j'essayai d'expliquer c'est que quand le classeur dans lequel
apparaît cette fonction est ouvert, que j'ouvre un autre calsseur quelconque
(qui n'a aucun lien avec ce premier classeur) et que je tape quelque chose
dans une cellule et je fais "Enter"... eh bien paf... ma fonction dans le
premier classeur se retrouve en #VALEUR!.
Il suffit alors que j'aille sur la cellule où est ma fonction en #VALEUR!
que je clique dessus et que je fasse "Enter" et hop je retrouve le bon
chiffre !!!

Bref c'est pas gagné et je desespère !!!

Merci pour tout !




Avatar
Byothe
Bonjour,

Ca ne marche toujours pas... argh !!!
j'ai essayé de mettre "application.volatile" sans succès.

Quant à la gestion d'erreur je n'ai pas trop compris ce qu'il fallait que je
fasses !!!
Merci pour tout.

A bientôt :-)



Bonsoir,

Teste avec un application.volatile :
Function Quotation_Solvabilite(secteur, Solvabilite)
application.volatile 'ici !
select case secteur

Ajouter application.volatile va forcer un recalcul de la fonction lors
de chaque recalcul.
L'avantage est d'avoir une valeur à jour même lorsqu'aucune valeur
impliquée dans la formule n'a changé.
L'inconvénient est que ça ralentit un petit peu ou un gros peu en
fonction de ce qu'il y a déjà à faire.

Si ta fonction est destinée à être utilisée dans un seul classeur, tu
pourrais également commencer par une gestion d'erreur en vérifiant si le
classeur actif (activeworkbook.name) est celui dans lequel est la
fonction (thisworkbook.name). Si problème, quitter par un exit function.

@+
FxM






Byothe wrote:
Bonjour !!

Encore une fois merci... mais malheureusement, la solution n'est toujours
pas là !
La fonction et l'onglet parametrage sont bien dans le même classeur.
Ce que j'essayai d'expliquer c'est que quand le classeur dans lequel
apparaît cette fonction est ouvert, que j'ouvre un autre calsseur quelconque
(qui n'a aucun lien avec ce premier classeur) et que je tape quelque chose
dans une cellule et je fais "Enter"... eh bien paf... ma fonction dans le
premier classeur se retrouve en #VALEUR!.
Il suffit alors que j'aille sur la cellule où est ma fonction en #VALEUR!
que je clique dessus et que je fasse "Enter" et hop je retrouve le bon
chiffre !!!

Bref c'est pas gagné et je desespère !!!

Merci pour tout !







Avatar
FxM
J'avoue qu'à défaut d'exemple concret je vais de voir jeter l'éponge [et
je ne parle de personne en particulier - les personnes qui se sentent
visées se reconnaitront :o)) ]

@+
FxM



Bonjour,

Ca ne marche toujours pas... argh !!!
j'ai essayé de mettre "application.volatile" sans succès.

Quant à la gestion d'erreur je n'ai pas trop compris ce qu'il fallait que je
fasses !!!
Merci pour tout.

A bientôt :-)



Bonsoir,

Teste avec un application.volatile :
Function Quotation_Solvabilite(secteur, Solvabilite)
application.volatile 'ici !
select case secteur

Ajouter application.volatile va forcer un recalcul de la fonction lors
de chaque recalcul.
L'avantage est d'avoir une valeur à jour même lorsqu'aucune valeur
impliquée dans la formule n'a changé.
L'inconvénient est que ça ralentit un petit peu ou un gros peu en
fonction de ce qu'il y a déjà à faire.

Si ta fonction est destinée à être utilisée dans un seul classeur, tu
pourrais également commencer par une gestion d'erreur en vérifiant si le
classeur actif (activeworkbook.name) est celui dans lequel est la
fonction (thisworkbook.name). Si problème, quitter par un exit function.

@+
FxM






Byothe wrote:
Bonjour !!

Encore une fois merci... mais malheureusement, la solution n'est toujours
pas là !
La fonction et l'onglet parametrage sont bien dans le même classeur.
Ce que j'essayai d'expliquer c'est que quand le classeur dans lequel
apparaît cette fonction est ouvert, que j'ouvre un autre calsseur quelconque
(qui n'a aucun lien avec ce premier classeur) et que je tape quelque chose
dans une cellule et je fais "Enter"... eh bien paf... ma fonction dans le
premier classeur se retrouve en #VALEUR!.
Il suffit alors que j'aille sur la cellule où est ma fonction en #VALEUR!
que je clique dessus et que je fasse "Enter" et hop je retrouve le bon
chiffre !!!

Bref c'est pas gagné et je desespère !!!

Merci pour tout !








Avatar
isabelle
bonjour FxM,

j'ai reproduit ta fonction (très bien remanier en passant) dans le classeur suivant, il y manquait un End Select,
mais cela mit à part tout fonctionne correctement, même au recalcul.

http://cjoint.com/?buaGj8lrK6

isabelle

J'avoue qu'à défaut d'exemple concret je vais de voir jeter l'éponge [et
je ne parle de personne en particulier - les personnes qui se sentent
visées se reconnaitront :o)) ]

@+
FxM




Bonjour,

Ca ne marche toujours pas... argh !!!
j'ai essayé de mettre "application.volatile" sans succès.

Quant à la gestion d'erreur je n'ai pas trop compris ce qu'il fallait
que je fasses !!!
Merci pour tout.

A bientôt :-)



Bonsoir,

Teste avec un application.volatile :
Function Quotation_Solvabilite(secteur, Solvabilite)
application.volatile 'ici !
select case secteur

Ajouter application.volatile va forcer un recalcul de la fonction
lors de chaque recalcul.
L'avantage est d'avoir une valeur à jour même lorsqu'aucune valeur
impliquée dans la formule n'a changé.
L'inconvénient est que ça ralentit un petit peu ou un gros peu en
fonction de ce qu'il y a déjà à faire.

Si ta fonction est destinée à être utilisée dans un seul classeur, tu
pourrais également commencer par une gestion d'erreur en vérifiant si
le classeur actif (activeworkbook.name) est celui dans lequel est la
fonction (thisworkbook.name). Si problème, quitter par un exit function.

@+
FxM






Byothe wrote:

Bonjour !!

Encore une fois merci... mais malheureusement, la solution n'est
toujours pas là !
La fonction et l'onglet parametrage sont bien dans le même classeur.
Ce que j'essayai d'expliquer c'est que quand le classeur dans lequel
apparaît cette fonction est ouvert, que j'ouvre un autre calsseur
quelconque (qui n'a aucun lien avec ce premier classeur) et que je
tape quelque chose dans une cellule et je fais "Enter"... eh bien
paf... ma fonction dans le premier classeur se retrouve en #VALEUR!.
Il suffit alors que j'aille sur la cellule où est ma fonction en
#VALEUR! que je clique dessus et que je fasse "Enter" et hop je
retrouve le bon chiffre !!!

Bref c'est pas gagné et je desespère !!!

Merci pour tout !










1 2