Использование подхода Variant Array
будет намного быстрее для 200 000 строк
Простой цикл for для массива, идентифицирующий первую и последнюю строку каждого цикла, затем цикл для обработки данных.
Что-то вроде этого
Я включил пример того, как вы можете обрабатывать данные: вернуть минимальное, максимальное, среднее и стандартное отклонение совокупности температуры и нажатия, помещенные в строку рядом с первой записью каждого цикла
(поскольку вы не говорите, какова ваша фактическая обработка, рассматривайте это как шаблон и обновляйте в соответствии с вашими потребностями)
На моем оборудовании работает за 1,7 с на случайном наборе данных, 200 000 строк
Sub Demo()
Dim rngDat As Range
Dim rngRes As Range
Dim dat As Variant
Dim res As Variant
Dim FirstOfCycle As Long
Dim LastOfCycle As Long
Dim Cycle As Long
Dim i As Long, j As Long
Set rngDat = Range(Cells(2, 3), Cells(Rows.Count, 1).End(xlUp))
'Example: set return range to 4 columns next to data
Set rngRes = rngDat.Columns(rngDat.Columns.Count + 1).Resize(, 8)
dat = rngDat.Value2
rngRes.ClearContents
res = rngRes.Value2
FirstOfCycle = 1
For i = 1 To UBound(dat, 1) - 1
If dat(i + 1, 1) <> dat(i, 1) Then
LastOfCycle = i
Cycle = dat(i, 1)
ProcessCycle dat, res, FirstOfCycle, LastOfCycle
FirstOfCycle = i + 1
End If
Next
If dat(i, 1) = dat(FirstOfCycle, 1) Then
ProcessCycle dat, res, FirstOfCycle, i
Else
ProcessCycle dat, res, i, i
End If
rngRes.Value = res
End Sub
Private Sub ProcessCycle(dat As Variant, result As Variant, FirstOfCycle As Long, LastOfCycle As Long)
Dim i As Long
Dim MnT As Double, MxT As Double
Dim AvgT As Double, SdT As Double
Dim SumT As Double, SumT2 As Double
Dim MnP As Double, MxP As Double
Dim AvgP As Double, SdP As Double
Dim SumP As Double, SumP2 As Double
MnT = dat(FirstOfCycle, 2)
MxT = dat(FirstOfCycle, 2)
MnP = dat(FirstOfCycle, 3)
MxP = dat(FirstOfCycle, 3)
For i = FirstOfCycle To LastOfCycle
If dat(i, 2) < MnT Then MnT = dat(i, 2)
If dat(i, 2) > MxT Then MxT = dat(i, 2)
If dat(i, 3) < MnP Then MnP = dat(i, 3)
If dat(i, 3) > MxP Then MxP = dat(i, 3)
SumT = SumT + dat(i, 2)
SumT2 = SumT2 + dat(i, 2) ^ 2
SumP = SumP + dat(i, 3)
SumP2 = SumP2 + dat(i, 3) ^ 2
Next
result(FirstOfCycle, 1) = MnT
result(FirstOfCycle, 2) = MxT
result(FirstOfCycle, 3) = SumT / (LastOfCycle - FirstOfCycle + 1)
result(FirstOfCycle, 4) = Sqr(SumT2 / (LastOfCycle - FirstOfCycle + 1) - result(FirstOfCycle, 3) ^ 2)
result(FirstOfCycle, 5) = MnP
result(FirstOfCycle, 6) = MxP
result(FirstOfCycle, 7) = SumP / (LastOfCycle - FirstOfCycle + 1)
result(FirstOfCycle, 8) = Sqr(SumP2 / (LastOfCycle - FirstOfCycle + 1) - result(FirstOfCycle, 7) ^ 2)
End Sub