Option Explicit
Option Base 1
Sub ValueArea()
Dim TopCel As Range
Set TopCel = Range('H2:L2')
Range(TopCel, TopCel.End(xlDown)).ClearContents
Set TopCel = Range('A2')
'Pour affichage
Dim k As Integer
k = 1
Dim TargetCel1 as Range, TargetCel2 as Range, TargetCel3 as Range, TargetCel4 as Range, TargetCel5 As Range
Set TargetCel1 = Range('H2')
Set TargetCel2 = Range('I2')
Set TargetCel3 = Range('J2')
Set TargetCel4 = Range('K2')
Set TargetCel5 = Range('L2')
While Not IsEmpty(TopCel)
'Détermination du range
Dim varRowsCount As Integer
varRowsCount = 1
While TopCel(varRowsCount + 1) = TopCel
varRowsCount = varRowsCount + 1
Wend
Dim varHigh As Single, varLow As Single, varN As Integer
varHigh = Application.Max(Range(TopCel(1, 4), TopCel(varRowsCount, 4)))
varLow = Application.Min(Range(TopCel(1, 5), TopCel(varRowsCount, 5)))
varN = ((varHigh - varLow) * 10000) + 1
Dim varDailyRange() As Single
ReDim varDailyRange(1 To varN)
Dim i As Integer
For i = 1 To varN
varDailyRange(i) = varLow + (i / 10000) - 0.0001
Next i
'calcul des TPO
Dim varTPO() As Integer
ReDim varTPO(1 To varN)
Dim j As Integer
Dim CelAux1 As Range, CelAux2 As Range
Set CelAux1 = TopCel(1, 4)
Set CelAux2 = TopCel(1, 5)
For i = 1 To varN
varTPO(i) = 0
For j = 1 To 46
If (varDailyRange(i) >= CelAux2(j).Value) And (varDailyRange(i) varMaxTPO Then
varMaxTPO = varTPO(i)
End If
Next i
'détermination de l'indice du POC
Dim varIndices() As Integer
Dim varAux As Integer
varAux = 0
For i = 1 To varN
If varTPO(i) = varMaxTPO Then
varAux = varAux + 1
ReDim Preserve varIndices(varAux)
varIndices(varAux) = i
End If
Next i
'détermination du POC
Dim varPOC, varPOCIndice As Integer
varPOCIndice = varIndices(1)
'cas particulier : non unicité du POC
If varAux > 1 Then
Dim varDistanceToMid() As Single
ReDim varDistanceToMid(1 To varAux)
For i = 1 To varAux
varDistanceToMid(i) = Abs(varIndices(i) - 0.5 * (varN + 1))
Next i
For i = 1 To varAux - 1
If varDistanceToMid(i + 1) < varDistanceToMid(i) Then
varPOCIndice = varIndices(i + 1)
End If
Next i
End If
varPOC = varDailyRange(varPOCIndice)
'CALCUL DE LA VALUE AREA
Dim varSUM As Integer
Dim varVA_up As Single
Dim varVA_low As Single
Dim varAuxUp, varAuxDown As Integer
varSUM = varTPO(varPOCIndice)
varVA_up = varPOC
varVA_low = varPOC
varAuxUp = varPOCIndice
varAuxDown = varPOCIndice
While varSUM varN Then
varSUM = varSUM + (varTPO(varAuxDown - 1) + varTPO(varAuxDown - 2))
varVA_low = varDailyRange(varAuxDown - 2)
varAuxDown = varAuxDown - 2
End If
If (varAuxDown - 2) = (varTPO(varAuxDown - 1) + varTPO(varAuxDown - 2)) Then
varVA_up = varDailyRange(varAuxUp + 2)
varSUM = varSUM + (varTPO(varAuxUp + 1) + varTPO(varAuxUp + 2))
varAuxUp = varAuxUp + 2
Else
varVA_low = varDailyRange(varAuxDown - 2)
varSUM = varSUM + (varTPO(varAuxDown - 1) + varTPO(varAuxDown - 2))
varAuxDown = varAuxDown - 2
End If
End If
Wend
'AFFICHAGE
TargetCel1(k) = TopCel
TargetCel2(k).Value = varVA_low
TargetCel3(k).Value = varPOC
TargetCel4(k).Value = varVA_up
TargetCel5(k).Value = varMaxTPO
k = k + 1
Set TopCel = TopCel(1 + varRowsCount)
Wend
End Sub