[RESOLU]Optimisation de 2 fonctions specifiques

Yaniv

XLDnaute Junior
Bonjour a tous , je dispose de 2 fonctions FIndAsk et FindBid qui me donne le bid et le ask d un produit financier
autrement pour un produit (chaine de caractere): "2m10y 100wc 245/123"
le bid est le chiffre a gauche du /
le ask celui situe a droite du /
J aimerais savoir comment ameliorer mes fonctions pour rendre le chiffre situe exactement a droite ou a gauche du / et dans le cas ou il n y en a pas de rien renvoyer .Exemples ou mes fonctions ne marchent pas
1) "2m10y 123/" (dans ce cas je ne renvoie que le bid (pas de ask))
2) "2m10y @147 /145" (la on remarque que je n ai que le ask , pas de bid )
ps le bid et le ask ne st jamais separe par un espace siils existent.


Code:
Function FindBid(code As String) As Variant
Dim pos1 As Integer
If code Like ("*/*") Then
pos1 = InStr(code, "/")
FindBid = RightNum(Mid(code, Len(FindDates(code)), pos1 - Len(FindDates(code))))
Else
FindBid = ""
End If
End Function



Function FindAsk(code As String) As Variant
 Dim pos As Integer
 If code Like ("*/*") Then
   pos = InStr(code, "/")
 FindAsk = RightNum(Mid(code, pos))
Else: FindAsk = ""
End If

End Function

ma fonction rightnum est defini comme tel

Code:
Function RightNum(str As String) As Double
    Dim n As Integer, i As Integer, ch As String, str0 As String, str1 As String, bln As Boolean
    str0 = Replace(str, ",", ".")
    n = Len(str0)
    For i = 1 To n
        ch = Mid(str0, i, 1)
        If IsNumeric(ch) Or ch = "." Then
            str1 = str1 + ch
            bln = True
            
        ElseIf bln = True Then
            Exit For
        End If
    Next i
    RightNum = CDbl(str1)
End Function
 
Dernière édition:

Misange

XLDnaute Barbatruc
Re : Optimisation de 2 fonctions specifiques

Bonjour

essaie comme cela

Code:
Function bid(code As String) As String
tblo = Split(code, "/")
bid = Trim(tblo(0))
End Function

Function ask(code As String) As String
tblo = Split(code, "/")
ask = Trim(tblo(1))
End Function

dans la feuille directement, tu peux utiliser données/convertir en utilisant le / comme séparateur.
 

Dranreb

XLDnaute Barbatruc
Re : Optimisation de 2 fonctions specifiques

Bonjour.

Dans les deux cas où une seule info est renvoyée, il ne faudrait rien renvoyer du tout, si je comprend bien.
Je le ferais comme ça:
VB:
Function FindBid(ByVal Code As String) As Variant
FindBid = BidAsk(Code)(1)
End Function

Function FindAsk(ByVal Code As String) As Variant
FindAsk = BidAsk(Code)(2)
End Function

Function BidAsk(ByVal Code As String) As Variant()
Dim Résu(1 To 2) As Variant, SplG() As String, Gauche As String, SplD() As String, Droite As String
On Error Resume Next
SplD = Split(Code, "/")
SplG = Split(SplD(UBound(SplD) - 1), " ")
SplD = Split(SplD(UBound(SplD)), " ")
Gauche = SplG(UBound(SplG))
Droite = SplD(LBound(SplD))
If IsNumeric(Gauche) And IsNumeric(Droite) Then
   Résu(1) = CDbl(Gauche): Résu(2) = CDbl(Droite)
Else
   Résu(1) = "": Résu(2) = ""
   End If
BidAsk = Résu
End Function
Remarque: si le Bid et le Ask sont à renvoyer dans deux cellules consécutives horizontalement on peut utiliser la fonction BidAsc en validation matricielle (Ctrl+Maj+Entrée)

Bonjour Misange.
 

Yaniv

XLDnaute Junior
Re : Optimisation de 2 fonctions specifiques

Bonjour dranreb et misange , en fait je me suis peut etre mal exprime mais justement dans le cas ou je n ai qu une seule info j aimerais renvoyer cette info (par exemple si je connais le bid j aimerais renvoye sa valeur et rien pour le ask et vice versa). et je ne connais pas forcement le nb d espaces de ma chaines de caracteres ni sa longueur dc en gros ma solution que j ai en tete ressemblerait a la votre dranreb
Spliter la chaine de caractere de depart avec des espaces
Parcours les element du tableau en cherchant un /
Verifier ac isNumeric(d apres moi) si y a des valeurs a gauche (ds ce cas on revoie le bid) et/ou a droite (on renvoie le ask)
 

Dranreb

XLDnaute Barbatruc
Re : Optimisation de 2 fonctions specifiques

Allez y alors. Je pense que vous avez les billes pour le mettre au point comme il vous le faut.
Cherchez plutôt le dernier SplG <> "" et renvoyez le toujours s'il est numérique, de même pour le 1er SplD <> "".
Le groupement dans une fonction BidAsk n'est peur être plus judicieux puis-qu’alors les deux ne semblent plus liés.
 

Yaniv

XLDnaute Junior
Re : Optimisation de 2 fonctions specifiques

Voila le resultat que j ai trouve , je me suis fortement inspire de votre code dranreb (je m en excuse mais je ne suis pas encore vraiment complet d un point de vue vba et programmmation en general) j ai obtenu ca

Code:
Function FindBid1(ByVal code As String) As Variant
 Dim Resu(1) As Variant, SplG() As String, Gauche As String, SplD() As String, Droite As String
 On Error Resume Next
 SplD = Split(code, "/")
 SplG = Split(SplD(UBound(SplD) - 1), " ")
 SplD = Split(SplD(UBound(SplD)), " ")
 Gauche = SplG(UBound(SplG))
 Droite = SplD(LBound(SplD))
 If IsNumeric(Gauche) Then
    Resu(1) = CDbl(Gauche)
 Else
    Resu(1) = ""
    End If
 FindBid1 = Resu
 End Function
 
 Function FindAsk1(ByVal code As String) As Variant
 Dim Resu(1) As Variant, SplG() As String, Gauche As String, SplD() As String, Droite As String
 On Error Resume Next
 SplD = Split(code, "/")
 SplG = Split(SplD(UBound(SplD) - 1), " ")
 SplD = Split(SplD(UBound(SplD)), " ")
 Gauche = SplG(UBound(SplG))
 Droite = SplD(LBound(SplD))
 If IsNumeric(Droite) Then
    Resu(1) = CDbl(Droite)
 Else
    Resu(1) = ""
    End If
 FindAsk1 = Resu
 End Function
 

Dranreb

XLDnaute Barbatruc
Re : Optimisation de 2 fonctions specifiques

Ça ne marche pas parce que vous avez déclaré Resu(1). Il assume donc Resu(0 To 1). Or vous le renvoyez dans son intégralité. La cellule ne reproduit que le premier élément Resu(0) qui vaut 0.
En fait vous pouvez supprimer la déclaration de Résu et simplement affecter ce qu'il faut respectivement à FindBid1 et FindAsk1 derrière les Then et Else, et supprimer l'affectation finale.
De plus il n'est plus utile de traiter la partie droite dans FindBid1 ni la partie gauche dans FindAsk1. Ça devrait beaucoup se simplifier.
À +

P.S. Enfin non, juste un peu:
VB:
Function FindBid1(ByVal Code As String) As Variant
Dim Spl() As String, Z As String
On Error Resume Next
Spl = Split(Code, "/")
Spl = Split(Spl(UBound(Spl) - 1), " ")
Z = Spl(UBound(Spl))
If IsNumeric(Z) Then
   FindBid1 = CDbl(Z)
Else
   FindBid1 = ""
   End If
End Function

Function FindAsk1(ByVal Code As String) As Variant
Dim Spl() As String, Z As String
On Error Resume Next
Spl = Split(Code, "/")
Spl = Split(Spl(UBound(Spl)), " ")
Z = Spl(LBound(Spl))
If IsNumeric(Z) Then
   FindAsk1 = CDbl(Z)
Else
   FindAsk1 = ""
   End If
End Function
'
 
Dernière édition:

Yaniv

XLDnaute Junior
Re : Optimisation de 2 fonctions specifiques

Merci tres bien j ai applique vos precieux conseils et ca a marche enfin , je suis content et ce grace a vous merci beaucoup.
je poste mon code si jamais d autres personnes en ont besoin


Code:
Function FindBid1(ByVal code As String) As Variant
 Dim SplG() As String, SplD() As String, Gauche As String
 On Error Resume Next
 SplD = Split(code, "/")
 SplG = Split(SplD(UBound(SplD) - 1), " ")
 Gauche = SplG(UBound(SplG))
 If IsNumeric(Gauche) Then
    FindBid1 = CDbl(Gauche)
 Else
    FindBid1 = ""
    End If
 End Function
 
 Function FindAsk1(ByVal code As String) As Variant
 Dim Gauche As String, SplD() As String, Droite As String
 On Error Resume Next
 SplD = Split(code, "/")
 SplD = Split(SplD(UBound(SplD)), " ")
 Droite = SplD(LBound(SplD))
 If IsNumeric(Droite) Then
    FindAsk1 = CDbl(Droite)
 Else
    FindAsk1 = ""
    End If
 End Function
 

Discussions similaires

Statistiques des forums

Discussions
311 725
Messages
2 081 940
Membres
101 845
dernier inscrit
annesof