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
| Option Explicit
Sub Lissage()
Dim LastLig As Long, i As Long, j As Long
Dim P As Double, Q As Double
Dim Tb, Ind()
Application.ScreenUpdating = False
With Worksheets("Feuil5")
.Range("C:E").ClearContents
LastLig = .Cells(.Rows.Count, "A").End(xlUp).Row + 1
Tb = .Range("A1:E" & LastLig)
Tb(1, 3) = "Y_Max": Tb(1, 4) = "Y_Min": Tb(1, 5) = "Y_Moy"
Ind = Maxim(Tb)
For j = 1 To UBound(Ind, 2) - 1
P = Ind(3, j)
Q = Ind(3, j)
For i = Ind(1, j) + 4 To Ind(1, j) + Ind(2, j) - 5
Q = IIf(Tb(i, 2) < Q, Tb(i, 2), Q)
Next i
For i = Ind(1, j) To Ind(1, j + 1) - 1
Tb(i, 3) = P
Tb(i, 4) = Q
Tb(i, 5) = (P + Q) / 2
Next i
Next j
.Range("A1:E" & LastLig) = Tb
End With
End Sub
Private Function Maxim(Tb) As Variant
Dim i As Long, j As Long, k As Long, Pos As Long
Dim First As Boolean
Dim P As Double
Dim Temp()
For i = 2 To UBound(Tb, 1)
If Tb(i, 2) >= 0 Then
If Not First Then Pos = i
P = IIf(Tb(i, 2) > P, Tb(i, 2), P)
First = True
j = j + 1
Else
If First Then
k = k + 1
ReDim Preserve Temp(1 To 3, 1 To k)
Temp(1, k) = Pos
Temp(2, k) = j
Temp(3, k) = P
First = False
j = 0
P = 0
End If
End If
Next i
Maxim = Temp
End Function |