Fonction personnalisée VBA + erreur #valeur! lors des recalculs
13 réponses
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.
Merci pour ton analyse et fichier. En relisant le fil, Excel a du hurler dès la compilation pour ce manque d'end select.
Bises FxM
bonjour FxM,
j'ai reproduit ta fonction (très bien remaniée en passant) dans le classeur suivant, il y manquait un End Select, mais cela mis à 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 !
Bonjour Isabelle,
Merci pour ton analyse et fichier.
En relisant le fil, Excel a du hurler dès la compilation pour ce manque
d'end select.
Bises
FxM
bonjour FxM,
j'ai reproduit ta fonction (très bien remaniée en passant) dans le
classeur suivant, il y manquait un End Select,
mais cela mis à 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 !!!
Merci pour ton analyse et fichier. En relisant le fil, Excel a du hurler dès la compilation pour ce manque d'end select.
Bises FxM
bonjour FxM,
j'ai reproduit ta fonction (très bien remaniée en passant) dans le classeur suivant, il y manquait un End Select, mais cela mis à 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 !
AV
Si je puis... Je ne comprends pas du tout l'intérêt d'une fonction perso (qui ne fonctionnera d'ailleurs plus si on déplace les plages de référence !) alors ques les fonctions XL suffisent... En reprenant l'exemple du "cjoint" d'Isabelle :
=SI(I5<INDEX(D4:D9;EQUIV(I6;C4:C9;0));7;7-I5)
AV
Si je puis...
Je ne comprends pas du tout l'intérêt d'une fonction perso (qui ne fonctionnera
d'ailleurs plus si on déplace les plages de référence !) alors ques les
fonctions XL suffisent...
En reprenant l'exemple du "cjoint" d'Isabelle :
Si je puis... Je ne comprends pas du tout l'intérêt d'une fonction perso (qui ne fonctionnera d'ailleurs plus si on déplace les plages de référence !) alors ques les fonctions XL suffisent... En reprenant l'exemple du "cjoint" d'Isabelle :
=SI(I5<INDEX(D4:D9;EQUIV(I6;C4:C9;0));7;7-I5)
AV
Byothe
Tout d'abord un grand merci à vous trois (en particulier à FxM qui s'est vraiment acharné :) ) !!! Au final j'ai opté pour la solution de AV... j'aurais préféré passer par une fonction mais j'ai déjà perdu trop de temps et l'essentiel c'est que ça marche.
Bon WE et encore merci :-)
Tout d'abord un grand merci à vous trois (en particulier à FxM qui s'est
vraiment acharné :) ) !!!
Au final j'ai opté pour la solution de AV... j'aurais préféré passer par une
fonction mais j'ai déjà perdu trop de temps et l'essentiel c'est que ça
marche.
Tout d'abord un grand merci à vous trois (en particulier à FxM qui s'est vraiment acharné :) ) !!! Au final j'ai opté pour la solution de AV... j'aurais préféré passer par une fonction mais j'ai déjà perdu trop de temps et l'essentiel c'est que ça marche.