Option Explicit
Const SpotFileName = "Spot CAC40 2506-0207 v1.xls"
Const SpotSheetName = "Rapport1"
Const FinalSheetName = "FINAL"
Sub MAC_Copy_valueCAC()
Dim refRg As Range, RefValues(), NewValues
Dim Nrow, i, D, T, D_T, Y
Dim topN As Long, middleN As Long, bottomN As Long
'tri des données du fichier SPOT
With Workbooks(SpotFileName).Sheets(SpotSheetName)
Set refRg = .Cells(.Rows.Count, "b").End(xlUp).Offset(, 4)
Set refRg = .Range(.Cells(3, "b"), refRg)
refRg.Sort key1:=refRg(1, 1), order1:=xlAscending, key2:=refRg(1, 2), _
order2:=xlAscending, Header:=xlYes
'récupération des données du fichier SPOT
Set refRg = refRg.Offset(1).Resize(refRg.Rows.Count - 1)
RefValues = refRg.Value
End With
'Si la date ou heure est du texte, on transforme en date et heure
For i = LBound(RefValues) To UBound(RefValues)
If VarType(RefValues(i, 1)) = vbString Then RefValues(i, 1) = DateValue(RefValues(i, 1))
If VarType(RefValues(i, 2)) = vbString Then RefValues(i, 2) = TimeValue(RefValues(i, 2))
RefValues(i, 3) = RefValues(i, 1) + RefValues(i, 2)
Next i
With ThisWorkbook.Sheets(FinalSheetName)
Nrow = .Cells(.Rows.Count, "a").End(xlUp).Row
'tableau du résultats
ReDim NewValues(2 To Nrow)
For i = 2 To Nrow
'Calcul de la clef
D = .Cells(i, "a")
T = .Cells(i, "e")
If VarType(D) = vbString Then D = DateValue(D)
If VarType(T) = vbString Then T = TimeValue(T)
If Second(T) <= 29 Then
D_T = D + TimeSerial(Hour(T), Minute(T), 0)
Else
D_T = D + TimeSerial(Hour(T), Minute(T), 30)
End If
'recherche par dichotomie dela clef dans RefValues
topN = UBound(RefValues): bottomN = LBound(RefValues)
Do
middleN = (topN + bottomN) / 2
If D_T > RefValues(middleN, 3) Then bottomN = middleN + 1 Else topN = middleN - 1
Loop Until (D_T = RefValues(middleN, 3)) Or (bottomN > topN)
If D_T = RefValues(middleN, 3) Then NewValues(i) = RefValues(middleN, 5) Else NewValues(i) = ""
Next i
'Affichage du résultat dans la colonne H
.Cells(2, "h").Resize(Nrow - 1).Value = Application.Transpose(NewValues)
End With
End Sub
Sub PC_Copy_valueCAC()
Dim Dict, RefValues(), NewValues
Dim Nrow, i, D, T, D_T
Set Dict = CreateObject("Scripting.Dictionary")
With Workbooks(SpotFileName).Sheets(SpotSheetName)
RefValues = .Range(.Cells(5, "b"), .Cells(Rows.Count, "b").End(xlUp)).Resize(, 5).Value
For i = LBound(RefValues) To UBound(RefValues)
Dict.Add RefValues(i, 1) + TimeValue(RefValues(i, 2)), RefValues(i, 5)
Next i
End With
With ThisWorkbook.Sheets(FinalSheetName)
Nrow = .Cells(.Rows.Count, "a").End(xlUp).Row
ReDim NewValues(2 To Nrow)
For i = 2 To Nrow
D = .Cells(i, "a")
T = .Cells(i, "e")
If Second(T) <= 29 Then
D_T = D + TimeSerial(Hour(T), Minute(T), 0)
Else
D_T = D + TimeSerial(Hour(T), Minute(T), 30)
End If
If Dict.Exists(D_T) Then NewValues(i) = Dict.Item(D_T)
Next i
.Cells(2, "h").Resize(Nrow - 1).Value = Application.Transpose(NewValues)
End With
End Sub