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.

3 réponses

1 2
Avatar
FxM
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 !!!

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

Merci pour tout !












Avatar
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
Avatar
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 :-)
1 2