Erreur valeur fonction VBA personnalisée avec plage de cellules en paramètre

Signaler
-
Messages postés
17095
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
15 octobre 2021
-
Bonjour,

Je souhaite créer une fonction personnalisée en VBA qui prend en paramètre une cellule et une plage de cellule afin de retourner une valeur dans une cellule.
La fonction marche quand je la teste dans une procédure mais ne fonctionne pas dans le tableur : par exemple quand j'écris =cover(A6;B6:C6) elle affiche soit 0 soit #VALEUR

Je pense que le problème vient du type de la plage de cellule mais je ne trouve pas de solution...

Toute aide est bienvenue, merci beaucoup !!

Voici le code;
Public Function cover(landing As Variant, ParamArray forecast() As Variant) As Double

Application.Volatile
Dim lan As Variant
Dim i As Single

Dim varg As Range
varg = forecast(0)

If landing < 0 Then
cover = 0
Else
If landing > Application.WorksheetFunction.Sum(forecast) Then
cover = landing / Application.WorksheetFunction.Average(forecast)

Else
lan = landing
i = 0
While lan - varg(i) > 0
lan = lan - varg(i)
i = i + 1
Wend
cover = i + lan / varg(i)
Debug.Print (cover)

End If
End If

End Function

Ririe

1 réponse

Messages postés
16337
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
15 octobre 2021
747
Bonjour

Pour tes prochains post, merci d’utiliser la coloration syntaxique, voir ici https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code un petit tuto.

Pour ton problème, je code assez peu en VBA, mais comme tu n’as pas encore reçu de réponse, je tente un truc.
Il me semble que le type demandé doit être Range. Quoiqu’il en soit utiliser Variant est une mauvaise habitude en gros tu dis à l’interpréteur « débrouille toi » de vba à vba ça marche pas trop mal ( mais pas toujours et quand ça ne marche pas c’est compliqué de comprendre pourquoi m) mais de excel à vba comme tu le vois c’est pas ça qui est ça.

Prends l’habitude de déclarer tes variables avec le type dont tu as réellement besoin.
Messages postés
17095
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
15 octobre 2021
906
bonjour,
comme suggéré par Whismeril (bonjour), ceci est préférable:
Public Function cover(landing As range, forecast As range) As Double


tu écris "La fonction marche quand je la teste dans une procédure", sans montrer comment tu la testes.

en cas de soucis, n'hésite pas à utiliser les possibilités de débogage de VBA: https://www.commentcamarche.net/contents/1381-debogage
Messages postés
17095
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
15 octobre 2021
906 >
Messages postés
17095
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
15 octobre 2021

je ne comprends pas comment tu as pu tester ta fonction.
ceci devrait toujours causer une erreur:
Dim varg As Range
varg = forecast(0)

un exemple dont tu pourrais t'inspirer, si jamais tu as réellement un nombre variable de paramètres justifiant l'utilisation de ParamArray:
Option Explicit

Public Function fyf(a As Range, ParamArray b()) As Long
Dim rg As Range, i As Long
fyf = a.Count
For i = LBound(b) To UBound(b)
    Set rg = b(i)
    fyf = fyf + rg.Count
Next i
End Function
Private Sub tt()
Debug.Print fyf([a1], [B6:C6], [B6:d10])
End Sub