Utiliser une fonction sous vba en excel

Fermé
marie - 3 janv. 2008 à 18:01
 yassine - 17 nov. 2011 à 23:36
Bonjour,
C'est possible de definir une fonction sous VBA pour l'utiliser sous Excel? Si oui, comment?
merci pour votre réponse!!!
A voir également:

12 réponses

Bonjour

Ta fonction doit rendre une valeur, c'est celle qui sera affichée dans la cellule ou tu as mis =gestion(127)

Pour rendre une valeur, tu dois mettre quelque part dans ta fonction
gestion = quelque chose

C'est ce quelque chose qui apparaîtra dans ta cellule
8
lenrok Messages postés 1437 Date d'inscription mardi 22 juillet 2003 Statut Membre Dernière intervention 12 décembre 2009 376
3 janv. 2008 à 18:07
Bonjour marie,

Va sur les liens suivants :
https://vb.developpez.com/
https://silkyroad.developpez.com/VBA/FeuilleDeCalcul/

Tu devrais ton bonheur...
1
merci à toi!!
En fait ,j'ai cherché et j'ai trouvé que je dois enregistrer ma fonction dans un module comme ça elle devient une fonction personnalisée le probleme est que losque j'appelle la fonction dans excel ça marche pas erreur valeur!!
la fonction est la suivante :

Function gestion(N As Integer) As double
Dim i As Integer
Dim s As Double
Dim max As Double
Dim datecheance As Range
Dim datevalo As Range

'N = 127
s = 0
max = 0
Set datevalo = Range("B2")
Set datecheance = Range("B128")
For i = 1 To N

If max < Range("C2").Offset(i - 1) Then
max = Range("C2").Offset(i - 1)
End If

Range("E2").Offset(i - 1) = max

If Range("E2").Offset(i - 1) >= 1050 And Range("E2").Offset(i - 1) <= 1100 Then
Range("F2").Offset(i - 1) = 0.5 * (Range("E2").Offset(i - 1) + 1050)
ElseIf Range("E2").Offset(i) >= 1100 And Range("E2").Offset(i - 1) <= 1150 Then
Range("F2").Offset(i - 1) = 0.5 * (Range("E2").Offset(i - 1) + 1100)
ElseIf Range("E2").Offset(i - 1) >= 1150 Then
Range("F2").Offset(i - 1) = 0.5 * (Range("E2").Offset(i - 1) + 1150)
Else
Range("F2").Offset(i - 1) = 0.5 * (Range("E2").Offset(i - 1) + 1000)
End If


s = s + Range("F2").Offset(i - 1)
Range("G2").Offset(i - 1) = s
Range("h2").Offset(i - 1) = Exp((datecheance - datevalo.Offset(i - 1)) / 365)
Range("i2").Offset(i - 1) = Range("h2").Offset(i - 1) * Range("G2").Offset(i - 1) / Range("A2").Offset(i - 1)

Next i
ActiveSheet.Range("i2:i9").Clear
End Function

dans excel j'ai mis" =gestion(127) "mais ça marche pas
quelqu'un peut m'aider???
merci d'avance
marie
1
en fait j'ai une serie des dates (colonne A)et des vL (colonne B)
à la fin ma fonction va me donner une colone de N valeurs apres calcule de max entre ces vl dans chaque ligne et apres calcul de VLT puis la somme et la moyenne !!!!
je sais pas si c'est juste d'utiliser le boucle for qui sert à calculer la valeur de chaque cellule de colonne recherché!!!
c'est possible d'avoir plusieurs valeurs avec une fonction personnalisée!!!
merci d'avance pour votre aide
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
lenrok Messages postés 1437 Date d'inscription mardi 22 juillet 2003 Statut Membre Dernière intervention 12 décembre 2009 376
4 janv. 2008 à 18:44
Bonjour marie,

Tu écris : 'N = 127
Pourquoi as-tu mis une apostrohe devant N ? C'est normal ?
0
j'ai mis appostrophe pour dire que c'est une commentaire à fin que vba ne prends pas compte de cette valeur!!!
0
lenrok Messages postés 1437 Date d'inscription mardi 22 juillet 2003 Statut Membre Dernière intervention 12 décembre 2009 376
4 janv. 2008 à 18:54
Bonjour marie,

OK pour moi, j'utilise plus le language C...
Pas trop de similitude au niveau des écritures codes....
Par contre, tu devrais avoir une fenêtre de debugage.As-tu mis ta variable dedans, et tu travailles en mode pas à pas.
Cela, va te permetrre de voir l'évolution de ta bouche : For i = 1 To N jusqu'au Next i
0
merci à toi
je pense que je dois travailler avec les tableaux car j'ai N valeur a chercher et apparament les fonctions personnalisées envoient qu'une seule valeur !!!
je sais pas ,,,??? c'est juste ou j'ai tort??
0
gbinforme Messages postés 14946 Date d'inscription lundi 18 octobre 2004 Statut Contributeur Dernière intervention 24 juin 2020 4 711
4 janv. 2008 à 18:58
bonjour

En fait tu n'as pas écris une fonction personnalisée mais une procédure macro qui ne fourni aucun résultat mais va modifier des cellules bien précises.

Tu ferais mieux de voir si tu peux lancer ta macro de manière événementielle, par exemple lorsque ta valeur 127 change.
0
est ce que je peux mettre les 127 valeurs que j'ai dans un tableau ? j'arrive pas à identifier les variables d'entrer dans la fonction
j'ai essayé ça mais ça marche pas!!!
function gestion(tab1(127)as date , tab2 (127) as string )as tab(127)as string
pour dire que ma fonction va me donner un tableau de 127 variables (nombres réels)
quelqu'un pourrais me guider??
merci
0
Utilisateur anonyme
4 janv. 2008 à 21:03
Bonjour,

Quelques observations !

La déclaration suivante est douteuse :
Dim max As Double 


Le mot [ max ] est un mot réservé.


La déclaration suivante est incomplète :
If max < Range("C2").Offset(i - 1) Then


La méthode offset possède 2 dimensions !
Perso je ne l'ai jamais utilisé de façon implicite
a une dimension, je recommande l'utilisation de :
Offset( i - 1, 0 )

Pour retourner une valeur, celle-ci doit être affecté !

La fonction est déclaré comme suit :
Function gestion(N As Integer) As double


Par analogie, il faut lire : [ Dim Gestion As Double ]
d'où le besoin de faire l'affectation !
        ...
        Range("i2").Offset(i - 1) = Range("h2").Offset(i - 1) * Range("G2").Offset(i - 1) / Range("A2").Offset(i - 1) 
    Next i 
    ActiveSheet.Range("i2:i9").Clear 

    Gestion = s

End Function 


J'ai bien testé le code, mais celui-ci tombe dans une
boucle récursive, lors de l'instruction :
Range("E2").Offset(i - 1,0) = Ce_max 

En fait je suis un peu d'accord avec gbinforme, cette fonction devrait
plutôt être une procédure évènementielle.

Lupin
0
Utilisateur anonyme
4 janv. 2008 à 21:15
re :

À placer derrière la feuille visé !

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)

    Dim Resultat As Double

    If (Target.Address = "$A$1") Then
        If ((Target > 0) And (Target < 250)) Then
            Resultat = Gestion(Target.Value)
        End If
    End If

End Sub
'

Function Gestion(N As Integer) As Double

    Dim i As Integer
    Dim s As Double
    Dim CeMax As Double
    Dim datecheance As Range
    Dim datevalo As Range

    s = 0
    CeMax = 0
    Set datevalo = Range("B2")
    Set datecheance = Range("B128")

    For i = 1 To N
        If CeMax < Range("C2").Offset(i - 1, 0) Then
            CeMax = Range("C2").Offset(i - 1, 0)
        End If
        
        Range("E2").Offset(i - 1, 0) = CeMax
    
        If Range("E2").Offset(i - 1, 0) >= 1050 And Range("E2").Offset(i - 1, 0) <= 1100 Then
            Range("F2").Offset(i - 1, 0) = 0.5 * (Range("E2").Offset(i - 1, 0) + 1050)
        ElseIf Range("E2").Offset(i, 0) >= 1100 And Range("E2").Offset(i - 1, 0) <= 1150 Then
            Range("F2").Offset(i - 1, 0) = 0.5 * (Range("E2").Offset(i - 1, 0) + 1100)
        ElseIf Range("E2").Offset(i - 1, 0) >= 1150 Then
            Range("F2").Offset(i - 1, 0) = 0.5 * (Range("E2").Offset(i - 1, 0) + 1150)
        Else
            Range("F2").Offset(i - 1, 0) = 0.5 * (Range("E2").Offset(i - 1, 0) + 1000)
        End If
   
        s = s + Range("F2").Offset(i - 1, 0)
        Range("G2").Offset(i - 1, 0) = s
        Range("h2").Offset(i - 1, 0) = Exp((datecheance - datevalo.Offset(i - 1, 0)) / 365)
        If (Range("A2").Offset(i - 1, 0).Value > 0) Then
            Range("i2").Offset(i - 1, 0) = Range("h2").Offset(i - 1, 0) * Range("G2").Offset(i - 1, 0) / Range("A2").Offset(i - 1, 0)
        Else
            Range("i2").Offset(i - 1, 0).Value = 0
        End If
    Next i
    
    ActiveSheet.Range("i2:i9").Clear
   
    Gestion = s
    
End Function
'


attention, le code n'est pas testé, n'ayant pas de données.

Lupin
0
salut à vous j'ai une petite remarque à ajouter sur cette fonction
je pense qu'en plus de tout ca tu dois déclarer ta fonction comme une fonction public comme cela : Public Function Gestion ( N as Integer) as Double
par ce que sous VBA tout est classe : la feuille Excel est une classe alors si tu veux que cette classe pourra utiliser cette fonction ( autrement dit avoir un nouveau comportement ou une nouvelle méthode) tu dois enregistrer cette fonction dans un module standard et déclarer cette fonction comme Public
Cordialement yassine
0