Rechercher : dans
Par :

Utiliser une fonction sous vba en excel

Dernière réponse le 4 jan 2008 à 21:15:27 marie, le 3 jan 2008 à 18:01:34 
 Signaler ce message aux modérateurs

Bonjour,
C'est possible de definir une fonction sous VBA pour l'utiliser sous Excel? Si oui, comment?
merci pour votre réponse!!!

Configuration: Windows XP
Internet Explorer 6.0

1

lenrok, le 3 jan 2008 à 18:07:15

Bonjour marie,

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

Tu devrais ton bonheur...
Bonne continuation...
A tous problèmes, une solution.

Répondre à lenrok

2

marie, le 4 jan 2008 à 17:46:54

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

Répondre à marie

3

le père, le 4 jan 2008 à 17:59:32

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

Répondre à le père

4

marie, le 4 jan 2008 à 18:29:04

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

Répondre à marie

5

lenrok, le 4 jan 2008 à 18:44:23

Bonjour marie,

Tu écris : 'N = 127
Pourquoi as-tu mis une apostrohe devant N ? C'est normal ?

Bonne continuation...
A tous problèmes, une solution.

Répondre à lenrok

6

marie, le 4 jan 2008 à 18:47:18

J'ai mis appostrophe pour dire que c'est une commentaire à fin que vba ne prends pas compte de cette valeur!!!

Répondre à marie

7

lenrok, le 4 jan 2008 à 18:54:13

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
Bonne continuation...
A tous problèmes, une solution.

Répondre à lenrok

8

marie, le 4 jan 2008 à 18:57:27

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??

Répondre à marie

9

gbinforme, le 4 jan 2008 à 18:58:20

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.

toujours zen

Répondre à gbinforme

10

marie, le 4 jan 2008 à 19:14:05

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

Répondre à marie

11

Lupin.A, le 4 jan 2008 à 21:03:22

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

Répondre à Lupin.A

12

 Lupin.A, le 4 jan 2008 à 21:15:27
  • +1

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

Répondre à Lupin.A