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

Fermé
Ririe - 14 oct. 2021 à 21:22
yg_be Messages postés 23383 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 9 décembre 2024 - 15 oct. 2021 à 09:14
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
A voir également:

1 réponse

Utilisateur anonyme
15 oct. 2021 à 07:37
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.
0
yg_be Messages postés 23383 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 9 décembre 2024 1 556
15 oct. 2021 à 08:48
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
0
yg_be Messages postés 23383 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 9 décembre 2024 1 556 > yg_be Messages postés 23383 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 9 décembre 2024
15 oct. 2021 à 09:14
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
0