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 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142
| Sub CalcArbitrageN()
'Déclaration des variables utilisée
Dim DateEntree As Date
Dim LigneBase As Long, LigneResult As Long, LigneBase2 As Long
Dim Seuil, Gain, Perte, Dif, Calcul As Variant
Dim GainPerteH, GainPerteB, ID As Variant
Dim DerLig As Long
Dim MaPlage As Range, Cel As Range, PlageRecherche As Range, c As Range
' Nettoyage de la feuille de résultat
WsResult.Range(WsResult.Range("A2"), WsResult.Cells(WsResult.Rows.Count, "Z")).ClearContents
' Initialisation des variables
LigneBase = 2
LigneResult = 1
Seuil = WsMenu.Range("g12")
Gain = WsMenu.Range("g10")
Perte = WsMenu.Range("g11")
Do Until IsEmpty(WSBase.Range("a" & LigneBase))
'vérif qu'il s'agit d'une date avant traitement
If IsDate(WSBase.Range("A" & LigneBase)) Then
DateEntree = WSBase.Range("A" & LigneBase)
Else
MsgBox "La colonne A ne doit contenir que des dates"
Exit Do
End If
Dif = WSBase.Range("h" & LigneBase)
ID = WSBase.Range("i" & LigneBase)
'Si on a une erreur dans la colonne différence, on l'ignore et on passe à la ligne suivante
If IsError(Dif) = True Then
'La différence est supérieure au seuil d'initation indiqué
ElseIf Abs(Dif) >= Abs(Seuil) And DateSerial(Year((DateEntree) - 1), 5, 10) < DateEntree < DateSerial(Year(DateEntree), 2, 15) Then
LigneResult = LigneResult + 1
'Libellés dans la feuille ResultatsN
With WsResult
.Range("a1") = "Date d'entrée"
.Range("b1") = "Différence"
.Range("c1") = "Spread In"
.Range("d1") = "Prix Euronext In"
.Range("e1") = "Prix CBOT In"
.Range("f1") = "Date de sortie"
.Range("g1") = "Spread Out"
.Range("h1") = "Prix Euronext Out"
.Range("i1") = "Prix CBOT Out"
.Range("j1") = "Gain/Perte"
.Range("k1") = "Nombre de jours en position"
.Range("l1") = "Appel de marge moyen"
.Range("m1") = "Appel de marge maximum"
.Range("n1") = "ID référent"
End With
'Récupération des données à l'entrée sur le marché
WsResult.Range("a" & LigneResult) = DateEntree
DateRef = WsResult.Range("a" & LigneResult)
WsResult.Range("b" & LigneResult) = Dif
WsResult.Range("c" & LigneResult) = WSBase.Range("f" & LigneBase)
WsResult.Range("n" & LigneResult) = ID
ID2 = WsResult.Range("n" & LigneResult)
'Si la différence est supérieure à 0
If WsResult.Range("b" & LigneResult) > 0 Then
WsResult.Range("d" & LigneResult) = WSBase.Range("d" & LigneBase)
WsResult.Range("e" & LigneResult) = WSBase.Range("e" & LigneBase) * -1
'Si la différence est inférieure à 0
ElseIf WsResult.Range("b" & LigneResult) < 0 Then
WsResult.Range("d" & LigneResult) = WSBase.Range("d" & LigneBase) * -1
WsResult.Range("e" & LigneResult) = WSBase.Range("e" & LigneBase)
End If
End If
LA PARTIE QUI BUGG :
Set PlageRecherche = WSBase.Columns("i")
With WsResult
'Dernière ligne renseignée dans la colonne A de "Result"
DerLig = .Range("A" & .Rows.Count).End(xlUp).Row
'On déclare la plage de "Results" qui contient toutes les dates à rechercher
Set MaPlage = .Range("n2:n" & DerLig)
'Pour chacune de ces dates, on recherche une correspondance dans "Base"
For Each Cel In MaPlage
Set c = PlageRecherche.Find(Cel.Value, LookIn:=xlValues)
'Si on trouve, on effectue le traitement
If Not c Is Nothing Then
.Range("o" & LigneResult) = c.Address(0, 0)
'Do Until IsEmpty(WSBase.Range("i" & (LigneBase)))
'If WsResult.Range("b" & LigneResult) > 0 Then
'Do
'Calcul = (-WSBase.Range("f" & (LigneBase2) + WsResult.Range("c" & LigneResult)))
'If Calcul >= Gain Then
'WsResult.Range("f" & LigneResult) = WSBase.Range("a" & (LigneBase2))
'WsResult.Range("g" & LigneResult) = WSBase.Range("f" & (LigneBase2))
'WsResult.Range("h" & LigneResult) = WSBase.Range("d" & (LigneBase2)) * -1
'WsResult.Range("i" & LigneResult) = WSBase.Range("e" & (LigneBase2))
'WsResult.Range("j" & LigneResult) = Calcul
'ElseIf Calcul <= Perte Then
'WsResult.Range("f" & LigneResult) = WSBase.Range("a" & (LigneBase2))
'WsResult.Range("g" & LigneResult) = WSBase.Range("f" & (LigneBase2))
'WsResult.Range("h" & LigneResult) = WSBase.Range("d" & (LigneBase2)) * -1
'WsResult.Range("i" & LigneResult) = WSBase.Range("e" & (LigneBase2))
'WsResult.Range("j" & LigneResult) = Calcul
'End If
'Loop
'Else
'Do
'Calcul = (WSBase.Range("f" & (LigneBase2) - WsResult.Range("c" & LigneResult)))
'If Calcul >= Gain Then
'WsResult.Range("f" & LigneResult) = WSBase.Range("a" & (LigneBase2))
'WsResult.Range("g" & LigneResult) = WSBase.Range("f" & (LigneBase2))
'WsResult.Range("h" & LigneResult) = WSBase.Range("d" & (LigneBase2))
'WsResult.Range("i" & LigneResult) = WSBase.Range("e" & (LigneBase2)) * -1
'WsResult.Range("j" & LigneResult) = Calcul
'ElseIf Calcul <= Perte Then
'WsResult.Range("f" & LigneResult) = WSBase.Range("a" & (LigneBase2))
'WsResult.Range("g" & LigneResult) = WSBase.Range("f" & (LigneBase2))
'WsResult.Range("h" & LigneResult) = WSBase.Range("d" & (LigneBase2))
'WsResult.Range("i" & LigneResult) = WSBase.Range("e" & (LigneBase2)) * -1
'WsResult.Range("j" & LigneResult) = Calcul
'End If
'LigneBase2 = LigneBase2 + 1
'Loop
'End If
'LigneBase = LigneBase + 1
'Loop
'Traitement
'MsgBox "La date " & Cel & " de la feuille " & .Name & " a été trouvée à l'adresse " & _
c.Address & " de la feuille ""Données d'arbitrage"""
End If
Next Cel
End With
LigneBase = LigneBase + 1
Loop
end sub |
Partager