Я просмотрел ваш код и не нашел в этом ничего плохого. Мне кажется, что изменения, которые я сделал, имеют косметическую природу. Вот результат.
Sub findAvg2()
' 005
Dim maxVal As Double
Dim preHr As Double
Dim nextHr As Double
Dim cVal As Double
Dim pVal As Double
Dim nVal As Double
Dim Avg As Double
Dim maxAvg As Double
Dim Cl As Long ' last used column
Dim Rl As Long ' last used row
Dim C As Long ' column
Dim R As Long ' row
' Find the number of used columns and roaws in the sheet
Cl = Cells(1, Columns.Count).End(xlToLeft).Column
Rl = Cells(Rows.Count, 1).End(xlUp).Row
For R = 19 To Rl
For C = 2 To Cl
maxVal = Cells(2, C).Value
preHr = Cells(8, C).Value
nextHr = Cells(9, C).Value
maxAvg = (maxVal + preHr + nextHr) / 3
cVal = Cells(R, C).Value
If cVal > 0 Then
pVal = Cells(R - 1, C).Value
nVal = Cells(R + 1, C).Value
Avg = (pVal + cVal + nVal) / 3
If Avg > maxAvg Then maxAvg = Avg
End If
Cells(12, C).Value = maxAvg
'Debug.Print maxAvg
Next C
Next R
End Sub
Возможно, в этой строке вашего кода есть слабые места. For R = 19 To Rl
. Поскольку вы включаете предыдущую строку в свой расчет средних значений, строка 18 должна содержать данные. Если это не так, и вы не можете исключить первую строку данных из оценки, необходимо предусмотреть специальное условие для расчета начальной maxAvg.
Все действия происходят в ActiveSheet. Это расположение, которое я инстинктивно не люблю. Если вы не вызываете подпрограмму с помощью кнопки на этом листе - и даже тогда, если умный эль c захочет использовать F5 вместо этого - я назову лист в коде. Используйте CodeName как для большей безопасности, так и для предоставления пользователям свободы переименования листа. Этот код будет выполняться на любом листе, который оказался активным. Это даже не должно быть в одной книге.