IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Petit problème byref


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Homme Profil pro
    Actuaire
    Inscrit en
    Juillet 2012
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Actuaire
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2012
    Messages : 49
    Points : 42
    Points
    42
    Par défaut Petit problème byref
    Bonjour
    j'ai créé cette fonction qui prend en argument un numéro de ligne (pour une boucle)
    celle ci ne marche pas et je ne sais pas pourquoi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Function mise_a_jour(line As Integer)
     
     
    Sheets("B&S").Range("D7") = Sheets("inputs").Range("L" & line) * Sheets("inputs").Range("P" & line) 'strike price
    Sheets("B&S").Range("D8") = Sheets("inputs").Range("M" & line) 'volatilité
    Sheets("B&S").Range("D16") = Sheets("inputs").Range("K" & line) * Sheets("inputs").Range("P" & line) 'stock price
    Sheets("B&S").Range("D21") = Sheets("inputs").Range("K" & line) * Sheets("inputs").Range("P" & line) 'stock price
     
    End Function
    il me met une erreur de type:
    "Type d'argument byref incompatible"

    merci d'avance pour votre aide
    Guillaume

  2. #2
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 825
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 825
    Points : 28 731
    Points
    28 731
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Bien que je m'interroge sur la pertinence de l'utilisation d'une procédure Function plutôt que Sub puisque celle-ci ne renvoie pas de valeur, je ne vois aucun problème et ne constate aucun problème
    Comment invoques-tu cette procédure
    Les trois appels ci-dessous fonctionnent parfaitement
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    debug.print  mise_a_jour(3)
    ou encore
    Bien que le message d'erreur serait différent, les valeurs des colonnes L, K et P contiennent-elles toutes des valeurs numériques et ne dépasses-tu pas la valeur maximum d'un entier avec la variable Line ?
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  3. #3
    Membre chevronné
    Avatar de NVCfrm
    Homme Profil pro
    Administrateur Système/Réseaux - Developpeur - Consultant
    Inscrit en
    Décembre 2012
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Administrateur Système/Réseaux - Developpeur - Consultant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2012
    Messages : 1 036
    Points : 1 917
    Points
    1 917
    Billets dans le blog
    5
    Par défaut
    Bonsoir Metodrone8

    Salut Phillipe.

    il me met une erreur de type:
    "Type d'argument byref incompatible"
    la variable utilisée dans l'argument line de l'appel n'a pas le même type que celui attendu dans le prototype de la fonction.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Dim i as Integer, x as Double, y as Long, z as Variant
    mise_a_jour(x)
    mise_a_jour(y)
    mise_a_jour(z)
    mise_a_jour(i)
    Seule, la dernière ligne contient un argument compatible avec la fonction.
    Les autres représentent un dépassement que le compilateur rejettera.
    Ousmane


    Quand on tombe dans l'eau, la pluie ne fait plus peur.

  4. #4
    Membre du Club
    Homme Profil pro
    Actuaire
    Inscrit en
    Juillet 2012
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Actuaire
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2012
    Messages : 49
    Points : 42
    Points
    42
    Par défaut
    voila comment j'utilise mes fonctions (hors fonction mise à jour)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    Sub calcul_vol()
     
    Dim ligne, j  As Integer
    Dim date_eval As Range
     
    Set date_eval = Sheets("Tableau de bord").Range("D11")
     
    ligne = 22
     
        While Sheets("inputs").Range("a" & ligne) <> ""
     
     
            Call calcul_taux_ss_risque(ligne, date_eval)
            Call return_on_equity(ligne, date_eval)
     
     
            ligne = ligne + 1
     
     
        Wend
     
     
     
     
    End Sub
     
     
    Sub test()
    Dim date_eval As Range
     
    Set date_eval = Sheets("Tableau de bord").Range("D11")
     
    Call calcul_taux_ss_risque(22, date_eval)
    Call return_on_equity(22, date_eval)
     
    End Sub
    dans test cela marche parfaitement, mais des que je veux faire une boucle dans la fonction calcul vol cela ne fonctionne plus, il me met la meme erreur.

    Les 2 fonctions que j'appelle sont comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    Function calcul_taux_ss_risque(line As Integer, date_eval As Range)
     
    Dim i, j, year_col As Integer
    Dim borne_sup, borne_inf As Integer
    Dim ligne_borne_sup, ligne_borne_inf As Integer
     
    Dim devise As String
     
    Dim redemp_term, redemp_month, redemp_year As Double
    Dim eval_year, eval_month As Double
    Dim df_year, taux_borne_sup, taux_borne_inf, a, b As Double
    Dim taux As Double
     
     
        'calcul de la maturité de l'option
        eval_year = Year(date_eval)
        eval_month = Month(date_eval)
        redemp_year = Sheets("inputs").Range("H" & line).Value
        redemp_month = Sheets("inputs").Range("I" & line).Value
     
        redemp_term = ((redemp_year - eval_year) * 12 + (redemp_month - eval_month)) / 12
        Sheets("B&S").Range("D9").Value = redemp_term
     
     
     
        'détermination de la devise de l'option
        If Sheets("inputs").Range("F" & line).Value = "CHF" Then
            i = 8
            devise = "CHF"
     
        ElseIf Sheets("inputs").Range("F" & line).Value = "EUR" Then
            devise = "EUR"
            i = 39
     
     
        ElseIf Sheets("inputs").Range("F" & line).Value = "USD" Then
            i = 60
            devise = "USD"
     
     
        ElseIf Sheets("inputs").Range("F" & line).Value = "GBP" Then
            i = 74
            devise = "GBP"
     
     
        ElseIf Sheets("inputs").Range("F" & line).Value = "CAD" Then
            i = 88
            devise = "CAD"
     
     
        End If
     
        'encadrement de redemp_term
     
         While Sheets("ESG").Range("B" & i).Value = devise
     
     
            If redemp_term > Sheets("ESG").Range("E" & i).Value Then
     
     
                i = i + 1
     
     
            ElseIf redemp_term < Sheets("ESG").Range("E" & i).Value Then
                ligne_borne_sup = i
                ligne_borne_inf = i - 1
                devise = "stop"
     
            End If
         Wend
     
     
     
     
        borne_sup = Sheets("ESG").Cells(ligne_borne_sup, 5).Value
        borne_inf = Sheets("ESG").Cells(ligne_borne_inf, 5).Value
     
     
        'détermination de l'année du discount factor
        If eval_month <> 12 Then
            df_year = eval_year - 1
     
        ElseIf eval_month < 12 Then
            df_year = eval_year
     
        End If
     
     
        j = 1
     
        While Sheets("ESG").Cells(1, j).Value <> df_year
        j = j + 1
        Wend
     
     
        'Passage en taux ZC
        taux_borne_sup = (Sheets("ESG").Cells(ligne_borne_sup, j)) ^ (-1 / borne_sup) - 1
        taux_borne_inf = (Sheets("ESG").Cells(ligne_borne_inf, j)) ^ (-1 / borne_inf) - 1
     
     
        'interpolation linéaire
        a = (taux_borne_sup - taux_borne_inf) / (borne_sup - borne_inf)
        b = taux_borne_sup - a * borne_sup
     
     
     
        'Calcul du taux sans risque
        taux = a * redemp_term + b
        Sheets("B&S").Range("D10") = calcul_taux_ss_risque
     
     
     
     
    End Function
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    Function return_on_equity(line As Integer, date_eval As Range)
     
    Dim i, j, year_col As Integer
     
    Dim eval_year, eval_month As Double
     
    Dim ry_year, return_equity As Double
     
        eval_year = Year(date_eval)
        eval_month = Month(date_eval)
     
     
     
     
        'détermination de la devise de l'option pour récuperer RNY_PC
        If Sheets("inputs").Range("F" & line).Value = "CHF" Then
            i = 5
     
         ElseIf Sheets("inputs").Range("F" & line).Value = "EUR" Then
     
            i = 22
     
         ElseIf Sheets("inputs").Range("F" & line).Value = "USD" Then
            i = 53
     
         End If
     
     
        'détermination de l'année du return on equity
        If eval_month <> 12 Then
            ry_year = eval_year - 1
     
        ElseIf eval_month < 12 Then
            ry_year = eval_year
     
        End If
     
     
        j = 1
     
        While Sheets("ESG").Cells(1, j).Value <> ry_year
        j = j + 1
        Wend
     
        return_equity = Sheets("ESG").Cells(i, j).Value
        return_equity = return_equity / 100
     
     
     
        Sheets("B&S").Range("D19").Value = return_equity
     
     
     
    End Function
    elles marchent parfaitement dans le sub test...
    ca m'embete, je suis près du but...

  5. #5
    Membre du Club
    Homme Profil pro
    Actuaire
    Inscrit en
    Juillet 2012
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Actuaire
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2012
    Messages : 49
    Points : 42
    Points
    42
    Par défaut
    ca semble s'être mis à marcher quand j'ai mis
    dim ligne as integer
    au lieux de
    dim ligne, j as integer

    cool

  6. #6
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 825
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 825
    Points : 28 731
    Points
    28 731
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Citation Envoyé par Methodrone8 Voir le message
    ca semble s'être mis à marcher quand j'ai mis
    dim ligne as integer
    au lieux de
    dim ligne, j as integer
    cool
    Faute régulièrement faite dans les déclarations de variables.
    La ligne Dim i, j, year_col As Integer ne type comme entier que la variable year_col, les autres variables étant alors de type Variant.

    Attention toutefois que tu déclares la variable Line comme étant un entier et que Line représente dans ton code un n° de lignes d'une feuille Excel et qu'une feuille excel contient 65536 lignes pour les versions avant 2007 et 1.048.576 lignes
    Il serait donc plus judicieux d'utiliser un type Long, un entier ne pouvant contenir une valeur supérieure à 32.7367

    Un bon tutoriel à lire sur le sujet Utiliser les variables en VBA Excel et tout particulièrement ce chapitre et celui-ci.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. un petit problème d'algo
    Par supertramp dans le forum Algorithmes et structures de données
    Réponses: 22
    Dernier message: 12/10/2004, 20h13
  2. Petit problème de décimales !
    Par ridan dans le forum Langage SQL
    Réponses: 5
    Dernier message: 11/09/2004, 21h24
  3. Réponses: 17
    Dernier message: 13/07/2004, 20h37
  4. petit problème premier plan, arrière plan
    Par gros bob dans le forum OpenGL
    Réponses: 4
    Dernier message: 19/04/2004, 12h00
  5. [jointure] Petit problème sur le type de jointure...
    Par SteelBox dans le forum Langage SQL
    Réponses: 13
    Dernier message: 13/02/2004, 18h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo