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 :

problème avec la fonction Find et un passage en argument


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Inscrit en
    Décembre 2009
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 13
    Points : 11
    Points
    11
    Par défaut problème avec la fonction Find et un passage en argument
    Bonjour à tous,
    je suis en train de développer un pricer de swap et j'ai un problème lié à la fonction find d'Excel.
    Si celà peut vous servir je laisse dispo le fichier excel.
    Pour pricer mon swap j'ai besoin d'une fonction getcdtyCurve qui me rend les valeurs nécessaires (entre la date de début et la date de fin). Ce sont les prix des colonnes qui s'appellent HSFO ect... Pour trouver les bonnes valeurs j'utilise donc la méthode getcdtyCurve(startdate,enddate).

    J'ai testé ma fonction getcdtyCurve(...,...) elle est dans le module functions. J'appelle cette méthode depuis le module MAIN également pour créer la fonction swap que je pourrai utiliser dans les feuilles pour faire un pricer dynamique. Le problème est que si je lance le programme suivant tout fonctionne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Sub toto()
    plouf = getCdtyCurve("HSFO 3,5% CIF MED", "02--2010", "12--2010")
    End Sub
    alors que la fonction suivante ne fonctionne pas:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Public Function cdtyCurve(product, startdate, enddate)
    cdtyCurve = getCdtyCurve(product, startdate, enddate)(2)
    End Function
    Je l'appelle dans une sheet XL product, startdate et enddate sont des cases qui contiennent les dates et le product cherchés. Il n'y a pas de faute de frappe ou de format, j'en suis certain on peut introduire un if product="HSFO ect..." then msgbox "ok" et la fonction affiche OK. Le problème est donc ailleurs. J'avoue y perdre mes cheveux!!

    Vous trouverez ci dessous le code de la fonction litigieuse, je pense que si vous m'aidez à résoudre ce bug tout coulera de source. Je vous joins également le fichier Excel si il peut vous être utile.
    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
     
    'Function builds a Array with the market data for the wanted product between the startDate and the endDate
    'cdtyCurve = getCdtyCurve(product, startDate, EndDate)
     
    Public Function getCdtyCurve(ByVal product As String, ByVal startdate As String, ByVal enddate As String) As Double()
    Dim var() As Double
    Dim mainsheet As Worksheet
    Set mainsheet = ThisWorkbook.Sheets("MAIN")
    Dim startDateString As String
     
    'récupération de la colonne des données
    mainsheet.Cells.Select
    Selection.Find(What:=product, After:=ActiveCell, LookIn:= _
            xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:= _
            xlNext, MatchCase:=False, SearchFormat:=False).Activate
    'on trouve d'abord le nom du product dans la barre de sélection puis notre colonne
    Selection.FindNext(After:=ActiveCell).Activate
    colonne = ActiveCell.Column
    'récupération de la ligne startDate
    Range(mainsheet.Cells(1, 1), mainsheet.Cells(5000, 5)).Select
    Selection.Find(What:=startdate, After:=ActiveCell, LookIn:= _
            xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:= _
            xlNext, MatchCase:=True, SearchFormat:=True).Activate
    'on trouve d'abord le sélecteur puis notre ligne
    Selection.FindNext(After:=ActiveCell).Activate
    lignestartdate = ActiveCell.Row
     
    'récupération de la ligne endDate
    Range(Cells(1, 1), Cells(5000, 5)).Select
    Selection.Find(What:=enddate, After:=ActiveCell, LookIn:= _
            xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:= _
            xlNext, MatchCase:=True, SearchFormat:=True).Activate
     
    'on trouve d'abord le sélecteur puis notre ligne
    Selection.FindNext(After:=ActiveCell).Activate
    ligneenddate = ActiveCell.Row
    mainsheet.Cells(1, 1).Select
     
    'redimentionne le variant
    taille = ligneenddate - lignestartdate + 1
    ReDim var(taille)
    'on remplit le variant
    For i = 1 To taille
        var(i) = mainsheet.Cells(i + lignestartdate - 1, colonne).Value
    Next i
     
    getCdtyCurve = var
    'test de la fonction
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets("Feuil1")
    ws.Cells(1, 10) = "getCdtyCurve"
    For i = 1 To UBound(var)
    ws.Cells(i + 1, 10) = var(i)
    Next i
     
    End Function

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 130
    Points : 2 443
    Points
    2 443
    Par défaut
    Salut paiva44 et le forum
    Pas envie de chercher, et l'aide reste muette sur ta fonction, mais...
    alors que la fonction suivante ne fonctionne pas
    ç& aide... .
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Public Function cdtyCurve(product, startdate, enddate
    cdtyCurve = getCdtyCurve(product, startdate, enddate)(2)
    End Function)
    n'ayant pas d'aide, et sans connaissance réelle de la formul, juste des idées
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Sub toto()
    plouf = getCdtyCurve("HSFO 3,5% CIF MED", "02--2010", "12--2010")(2)
    End Sub
    Fonctionne ? Parce que sinon, enlève le "(2)".
    Ta fonction demande des arguments. as-tu vérifié la nature de ces arguments ? : dans ta macrto suivante, tu les déclares en string : pour les date, j'aurais plutot vu un format date
    Pour le premier argument, du texte me semble bizarre, j'aurais plutot vu une plage de cellule.
    A+

  3. #3
    Membre à l'essai
    Inscrit en
    Décembre 2009
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 13
    Points : 11
    Points
    11
    Par défaut
    Bonjour Gorfael,

    Déjà merci de ton aide, la sub que tu me donnes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Sub toto()
    plouf = getCdtyCurve("HSFO 3,5% CIF MED", "02--2010", "12--2010")(2)
    End Sub
    marche très bien.

    Le premier argument est le nom de la colonne où je cherche les données, son nom est un peu bizare mais j'ai pas le choix. De même que pour les format de date qui sont mm--yyyy. ce sont tous des argument string.

    Il y a des fonctions find qui recherchent les positions des ces strings dans le fichier Excel et qui me retournent la colonne et la ligne de début et de fin (comme je sélectionne les dates, je ne prends pas toute la colonne).

    La fonction marche quand on donne les strings de façon explicite mais pas quand on les passe en argument.

    Dans la sub suivante qui ne larche pas:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Public Function cdtyCurve(product, startdate, enddate
    cdtyCurve = getCdtyCurve(product, startdate, enddate)(2)
    End Function)
    product est une case où j'écris le nom du produit, startdate et enddate sont les dates. Il n'y a pas d'erreur de frappe comme je l'explique dans mon post précédent. Je suis donc très étonné que ca ne marche pas.

    Dans Excel si je mets dans une case =cdtyCurve(C3,C4,C5) par exemple pour aller chercher les donnée dasn C3, 4 et 5 Excel me mets toujours #VALEURS donc je pense que le problème est au niveau du passage en argument.

    @+

  4. #4
    Membre à l'essai
    Inscrit en
    Décembre 2009
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 13
    Points : 11
    Points
    11
    Par défaut
    En fait je comprends mon problème. La fonction fait appel à une sub find. Je pense que le problème vient de là.
    Si par exemple j'écris azerty dans une cellule et que je veux faire une fonction swap2 pour trouver la colonne où est azerty:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Public Function swap2() As Integer
     
    Cells.Select
    Selection.Find(What:="azerty", After:=ActiveCell, LookIn:= _
            xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:= _
            xlNext, MatchCase:=False, SearchFormat:=False).Activate
    'on trouve d'abord le nom du product dans la barre de sélection puis notre colonne
     
    swap2 = ActiveCell.Column
     
    End Function
    Je peux appeler swap2 depuis une sub mais =swap2() dans une cellule XL renvoie #VALEURS. Est-ce que quelqu'un sait comment faire une fonction swap2 qui ne me renvoie pas #VALEURS? Savoir faire ça résoudra mon problème.

    Merci!

  5. #5
    Membre éclairé
    Inscrit en
    Décembre 2006
    Messages
    891
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 891
    Points : 831
    Points
    831
    Par défaut c'est ce qu'il me semblait hier soir...
    Deux problèmes encore :

    Comment sont définit les paramètres de la fonction "Public Function cdtyCurve(product, startdate, enddate)" dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Public Function cdtyCurve(product, startdate, enddate
    cdtyCurve = getCdtyCurve(product, startdate, enddate)(2)
    End Function)
    En "Sting" j'espère (dans le vrai code). Sinon c'est normal. Dans la fonction "cdtyCurve()" les valeurs de "product" et autres ne soient pas des "String" et soient donc mal passés dans la fonction "getCdtyCurve()" qui nécessite le type "String". C'est le problème du basic et de ses convertions automatiques de type de variable.


    Second point, on ne passe pas les valeurs des cellules par leurs références. Ou il faut les mettre entre crochets "cdtyCurve([C3], [C4], [C5])"

    Attention : vérifie dans ce dernier cas que ce ne sont pas des variables type "Variant" qui seraient mal interprétées en "String".

    ESVBA

  6. #6
    Membre éclairé
    Inscrit en
    Décembre 2006
    Messages
    891
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 891
    Points : 831
    Points
    831
    Par défaut
    Il faut mettre la fonction dans un module de code "BAS".
    Si ce n'est pas fait l'erreur est de type "#nom". Car le nom de la fonction n'est pas reconnu.

    si "#VALEUR" c'est que les paramètres ne sont pas du bon type par exemple.
    Voir le post précédent.

    Un petit coup de F1 sur "colomn" indique qu'il s'agit d'un valeur de type "LONG".

    Il faut transformer la fonction "Function Swap2 As Integer" en
    "Function Swap2 as Long".


    ESVBA

  7. #7
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 130
    Points : 2 443
    Points
    2 443
    Par défaut
    Salut paiva44 et le forum
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Public Function swap2(Cherch As String) As Variant
    Dim Cel As Range
    Dim X
    Application.Volatile
    Set Cel = Cells.Find(What:=Cherch, after:=Range(Application.Caller.Address), LookIn:= _
    xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:= _
    xlNext, MatchCase:=False, SearchFormat:=False)
    If Cel.Address = Application.Caller.Address Then
        swap2 = "Pas de valeur"
    Else
        swap2 = Cel.Column
    End If
    End Function
    Désolé, mais le forum a jugé bon de publié avant que je teste
    Dans une cellule : Soit elle trouve une autre cellule contenant "aa", et elle donne le numéro de la colonne de la première occurence par rapport à la cellule contenant la formule, soit elle boucle et devrais trouver la cellule contenant la formule (qui contient effectivement "aa") et c'est qu'on n'a pas trouvé de cellule autre, et on prévient.
    A+

Discussions similaires

  1. [XL-2010] Problème avec la fonction find-Envoi de mails à différentes adresses
    Par clemmb dans le forum Macros et VBA Excel
    Réponses: 13
    Dernier message: 28/10/2014, 12h12
  2. Problème avec la fonction find
    Par lil900 dans le forum MATLAB
    Réponses: 5
    Dernier message: 06/04/2014, 12h50
  3. Problème avec la fonction Find
    Par kyros21 dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 19/01/2013, 13h50
  4. [E - 03] Problème avec la fonction Find
    Par documentation dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 13/02/2009, 17h54
  5. [VBA-E]Problème avec la fonction Find
    Par Mirx1 dans le forum Macros et VBA Excel
    Réponses: 17
    Dernier message: 27/04/2006, 18h43

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