#excel #vba #excel-formula
#excel #vba #excel-формула
Вопрос:
Пожалуйста, смотрите таблицу ниже, я хочу поставить промежуточные итоги на 1 строку ниже от последней строки. Это хорошо сработало для строк C и D (используя приведенный ниже код), однако остальные столбцы не всегда содержат информацию в каждой строке.
lastrow = Cells(Rows.Count, "C").End(xlUp).Row 1
Cells(lastrow 1, 3).Formula = "=sum(C1:C" amp; lastrow amp; ")"
lastrow = Cells(Rows.Count, "D").End(xlUp).Row 1
Cells(lastrow 1, 4).Formula = "=sum(D1:D" amp; lastrow amp; ")"
Как я могу вставить формулу справа от других моих промежуточных итогов (выделено желтым), поскольку они мне нужны все в одной строке?
Комментарии:
1. Вы можете либо использовать
OffSet
, либо, поскольку у вас уже есть строка, в которую вы хотите ввести итоговые данные, просто увеличьте значение столбца в:Cells(lastrow 1, 4).Formula
. Итак, чтобы задать значение для столбцаE
:Cells(lastrow 1, 5).Formula
. Что еще более важно, откуда вы знаете, сколько столбцов нужно в сумме? Если столбцы будут статическими, у вас может бытьFOR
цикл для заполнения значений. Если они динамические, вам нужно будет получить количество столбцов
Ответ №1:
Просто используйте один столбец для определения последней строки (используя Column A
здесь)
Кроме того, нижняя часть вашего диапазона сумм обозначается последней строкой ( LR
), но то, куда вы хотите поместить свои формулы, находится на 2 строки ниже (отсюда LR 2
)
Dim ws as Worksheet: Set ws = ThisWorkbook.Sheets("Sheet1") '<-- Update
Dim LR as Long
LR = ws.Range("A" amp; ws.Rows.Count).End(xlUp).Row
ws.Range("C" amp; LR 2).Formula = "=Sum(C2:C" amp; LR amp; ")"
ws.Range("D" amp; LR 2).Formula = "=Sum(D2:D" amp; LR amp; ")"
Комментарии:
1. Возможно, стоит просто добавить
2
, когда вы получите количество строк. Тогда вам не нужно2
каждый раз добавлять формулу2. Затем вам нужно использовать
LR - 2
при выполнении формулы. Или можно задать другую переменную с помощьюLR - 2
. В любом случае, переменная используется для определения двух отдельных местоположений здесь (диапазон сумм и расположение формулы на листе), поэтому она не заканчивается просто настройкойLR.Offset(2)
. Этот способ показался более интуитивным. Если бы было намного больше кода, которому нужно следовать, я бы обосновал вторую переменную, возможно3. @urdearboy вы могли бы записать все формулы в одной строке:
ws.Range("C" amp; LR 2 amp; ":J" amp; LR 2).Formula = "=Sum(C2:C" amp; LR amp; ")"
4. Блестяще! Я знал, что это что-то простое, я просто слишком много думал об этом. Спасибо!
Ответ №2:
Попробуйте:
Option Explicit
Sub test()
Dim LastRow As Long, LastColumn As Long, Column As Long
With ThisWorkbook.Worksheets("Sheet1")
LastRow = .Cells(.Rows.Count, "A").End(xlUp).Row
For Column = 3 To 10
.Cells(LastRow 2, Column) = Application.WorksheetFunction.Sum(.Range(.Cells(2, Column), Cells(LastRow, Column)))
Next Column
End With
End Sub
Комментарии:
1. Стоит упомянуть, что при этом сумма вычисляется в VBA и не отражает никаких последующих изменений в данных , пока строка суммы не будет удалена вручную и код не будет запущен снова. Вычисление суммы в VBA и написание формулы с помощью VBA заканчиваются двумя совершенно разными подходами.
2. Кроме того, если вы внесете изменения и снова запустите код, у вас возникнет проблема с вычислением последней строки.