Excel VBA Попытка написать формулу "MAX" для ячеек с разными диапазонами с помощью For-Loop - PullRequest
0 голосов
/ 05 апреля 2019

Я пытаюсь заставить VBA записать формулу в разные ячейки, которая найдет максимальное значение для диапазона, определяемого некоторыми переменными.Мои переменные I и J (числа / целые числа).

Вот мой код.

Sub AddMAX()
    Dim I As Integer
    Dim J As Integer
    Dim L As Integer

    I = InputBox("Number of columns to check max value")
    J = InputBox("Number of Rows to add formula inn and find max value of that row")

    For L = 5 To 4 + J
        Worksheets(1).Cells(L, 4 + I).Formula = "=" & Max(Range(Cells(L, 4), Cells(L, 3 + I)))
    Next L
End Sub

Пытались переписать вторую часть (часть после знака равенства) несколько раз.Обычно я получаю сообщение об ошибке компиляции: Sub или Function не определены, и это отмечает «Макс».Я думал, что Max (также пробовал с большими буквами) была встроенной функцией, такой как SUM и т. Д.

Я пытаюсь заставить ее записать в ячейки формулу Excel, подобную этой:

Для I=2 и J=3:

Ячейка F5: =MAX(D5:E5)
Ячейка F6: =MAX(D6:E6)
Ячейка F7: =MAX(D7:E7)

т.е. IЯ хочу, чтобы в ячейках была формула, которую я написал в ячейках вручную, чтобы вычислить максимальное значение, чтобы при изменении значения в ячейках D5, D7 и E5 до E7 было найдено новое максимальное значение без необходимости выполнения каких-либо сценариев..

Дайте мне знать, если что-то неясно.

Ответы [ 2 ]

2 голосов
/ 05 апреля 2019

Не следует помещать Range и Cells в строку формулы, они ничего не значат для механизма формул Excel. Вам нужно Address клеток:

Dim I As Long
Dim J As Long
Dim L As Long

I = InputBox("Number of columns to check max value")
J = InputBox("Number of Rows to add formula inn and find max value of that row")
L = 5

With Worksheets(1)
  .Range(.Cells(L, 4 + I), .Cells(4 + J, 4 + I)).Formula = "=MAX(" & .Cells(L, 4).Address(False, False) & ":" & .Cells(L, I + 3).Address(False, False) & ")"
End With

Формула фактически одинакова для всех ячеек, поэтому ее можно назначить одним назначением для всего диапазона. В ссылочной нотации A1 это выглядит иначе, но если вы переключитесь на R1C1 в настройках Excel, вы увидите, что они одинаковы. Это также означает, что проще создать эту формулу , используя в первую очередь запись R1C1 :

Dim I As Long
Dim J As Long
Dim L As Long

I = InputBox("Number of columns to check max value")
J = InputBox("Number of Rows to add formula inn and find max value of that row")
L = 5

With Worksheets(1)
  .Range(.Cells(L, 4 + I), .Cells(4 + J, 4 + I)).FormulaR1C1 = "=MAX(RC[-" & I & "]:RC[-1])"
End With

Но мне кажется, что вместо этого вы должны использовать интерфейс Excel по назначению. Выберите ячейки, в которых должна быть формула MAX. Сохраняя весь выбранный диапазон, поместите формулу MAX в любую из ее ячеек, как если бы вы создавали ее только для этой ячейки, но вместо нажатия клавиши Enter нажмите Ctrl + Enter .

1 голос
/ 05 апреля 2019

Вы должны быть осторожны, чтобы различать часть, которую видит 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 и поместит адрес в строку формулы.

...