Вы должны быть осторожны, чтобы различать часть, которую видит VBA, и окончательную формулу.
Если вы пишете
Worksheets(1).Cells(L, 4 + I).Formula = "=" & Max(Range(Cells(L, 4), Cells(L, 3 + I)))
Max
(и все следующие вещи) рассматривается интерпретатором VBA, а не Excel.Но функции Max
нет, и вы получите ошибку (компилятора).
Если вы напишите
Worksheets(1).Cells(L, 4 + I).Formula = "=Max(Range(Cells(L, 4), Cells(L, 3 + I)))"
, интерпретатор VBA воспринимает весь материал как строку.Он не может заботиться о таких переменных, как L
или I
, потому что is не видит их.Таким образом, в итоге вы получаете формулу, точно такую же, как вы ее пишете - и Excel (не VBA) покажет вам ошибку, потому что он не понимает L
или I
.
Что вам нужнооператор (в VBA), который создает строку, содержащую фактические значения ваших переменных, и присваивает ее ячейке cell.formula.Я настоятельно рекомендую сначала назначить это для строковой переменной - это значительно упрощает отладку:
Dim formula As String
formula = "=Max(Range(Cells(" & L & ", 4), Cells(" & L & ", 3 + " & I & ")))"
Debug.Print formula
Worksheets(1).Cells(L, 4 + I).Formula = formula
Обновление : Извините, я не смотрел на содержание формулы ввсе, конечно, Range
и Cells
-объекты являются объектами VBA.В вашей формуле вам нужен адрес диапазона, поэтому измените строку на
formula = "=MAX(" & Range(Cells(L, 4), Cells(L, 3 + i)).Address & ")"
Теперь VBA создаст Range
и поместит адрес в строку формулы.