Я пытаюсь написать функцию в VBA, которая вычисляет средневзвешенное по времени значение, но появляется ошибка #VALUE!
, когда я пытаюсь использовать эту функцию в своем рабочем листе.
При попытке отладки мне удалось проверить мой подход к изменению CurRPM
путем итерации CurOffset
и использования CurRng = rng.Offset(CurOffset, 0)
. Эффект изменения CurRng
состоит в том, чтобы выполнить итерацию по столбцу RPM, проверяя, является ли ячейка под CurRng
пустой, такой же, как CurRPM
, или непустой и отличается от CurRPM
.
Public Function TIMEAVERAGE(rng As Range) As Long
'Initializing Variables
Dim CurTime As Integer
Dim CurRPM As Integer
Dim CurSum As Integer
Dim CurOffset As Integer
CurOffset = 0
CurSum = 0
'The input cell is the first RPM
'The cell to the left of the input cell is the second RPM
CurTime = rng.Offset(0, -1)
CurRPM = rng
'Keep calculating as long as the cell below CurRng isn't empty
While IsEmpty(CurRng.Offset(1, 0)) = False
'If the cell below has the same RPM, look at next cell
If CurRng.Offset(1, 0) = CurRPM Then
CurOffset = CurOffset + 1
CurRng = rng.Offset(CurOffset, 0)
Else:
'Otherwise, add the previous RPM's contribution to the average
'CurTime, as shown, is the start of the previous RPM
CurSum = CurSum + CurRPM * (CurRng.Offset(0, -1) - CurTime)
'Change CurRPM and CurTime for the new RPM
CurRPM = CurRng.Offset(1, 0)
CurTime = CurRng.Offset(0, -1)
CurOffset = CurOffset + 1
CurRng = rng.Offset(CurOffset, 0)
End If
Wend
'Add the contributions of the final RPM
CurSum = CurSum + CurRPM * (CurRng.Offset(0, -1) - CurTime)
'Return the final TIMEAVERAGE
TIMEAVERAGE = CurSum / CurRng.Offset(0, -1)
End Function
Требуемый результат от этой программы возвращает 150, если пользователь вводит =TIMEAVERAGE(B2)
для ячеек ниже. Вместо этого возвращается ошибка #VALUE!
.
A B
________________
1| Time | RPM
2| 0 | 100
3| 1 | 100
4| 2 | 100
5| 3 | 200
6| 4 | 200
7| 5 | 200
8| 6 | 200