Utiliser une fonction sous vba en excel

marie -  
 yassine -
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

12 réponses

  1. le père
     
    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
  2. marie
     
    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
  3. marie
     
    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
  4. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  5. lenrok Messages postés 1442 Statut Membre 376
     
    Bonjour marie,

    Tu écris : 'N = 127
    Pourquoi as-tu mis une apostrohe devant N ? C'est normal ?
    0
  6. marie
     
    j'ai mis appostrophe pour dire que c'est une commentaire à fin que vba ne prends pas compte de cette valeur!!!
    0
  7. lenrok Messages postés 1442 Statut Membre 376
     
    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
  8. marie
     
    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
  9. gbinforme Messages postés 14930 Date d'inscription   Statut Contributeur Dernière intervention   4 744
     
    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
  10. marie
     
    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
  11. Utilisateur anonyme
     
    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
  12. Utilisateur anonyme
     
    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
    1. yassine
       
      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