Объект Range, связ. яч. на разных листах
=СУММ('Лист1:Лист30'!$F$9)
Но как это в коде VBA через объект Range сделать - непонятно.
Нужно объявить объект типа Range, который бы объединял ячейки на разных листах. Необходимо для функции WorksheetFunction.Sum(). А то приходится перечислять кучу объектов Range, для каждого листа. Отдельно можно сформировать функцию:
=СУММ('Лист1:Лист30'!$F$9)
Но как это в коде VBA через объект Range сделать - непонятно.
Напиши свою функцию. Она ж несложная будет.
Напиши свою функцию. Она ж несложная будет.
Это понятно. :-) Только как это сделать? Я б не писал сюда, если б знал. У меня есть один вариант, но он уж больно страшный. Можешь пример привести?
Это понятно. :-) Только как это сделать? Я б не писал сюда, если б знал. У меня есть один вариант, но он уж больно страшный. Можешь пример привести?
Ну как-то так:
MsgBox SumSheet("Лист2", "Лист4", "B3:C10")
End Sub
Function SumSheet(FirstSheetName As String, LastSheetName As String, CellName As String) As Double
Dim n As Long, NMin As Long, NMax As Long, d As Range
SumSheet = 0
NMin = ThisWorkbook.Worksheets(FirstSheetName).Index
NMax = ThisWorkbook.Worksheets(LastSheetName).Index
If NMin > NMax Then
n = NMin
NMin = NMax
NMax = n
End If
For n = NMin To NMax
For Each d In ThisWorkbook.Worksheets(n).Range(CellName).Cells
SumSheet = SumSheet + d.Value
Next d
Next n
End Function
Сейчас эта функция считает суммы в той книге, в которой находится. Если тебе надо будет считать в другой книге, напиши, внесем соответствующие изменения.
Значит, объявить Range по разным листам в коде VBA нельзя?
Функция работает - но мой вариант быстрее, и практически не зависит от количества листов:
=======================
tmpFormula.Value = StrFmt("=SUM('%1№1:%1№%2'!R%3C%4)", CurrentWB, ВсегоЛистов - 1, cRowFrom, .Column)
.Value = tmpFormula.Value
=======================
где у нас tmpFormula это какая-то отвлеченная ячейка только для того, чтоб туда формулу пихнуть,
StrFmt - ф-ия, вовр. строку, где заменяет %n на n-ый параметр.
Просто этот вариант мне не особо нравится. Хотя придется им обойтись, наверное. Если другого не будет предложено.
Если тебе уж очень хочется структуризовать свой код (да и так на будущее), то можно создать свой класс_модуль, вернее достаточно объявить свою коллекцию. Сам класс Collection - стандартный. Методы Add, Remove уже есть, пихай в него чего хочешь, а потом напиши функцию, которая в качестве параметра будет принимать однй переменную - эту коллекцию. Ну а внутри функции подсчет как уже было написано, для каждого Range отд. сумма и сумма сумм...
ОК, спасибо.
Значит, объявить Range по разным листам в коде VBA нельзя?
Функция работает - но мой вариант быстрее, и практически не зависит от количества листов:
=======================
tmpFormula.Value = StrFmt("=SUM('%1№1:%1№%2'!R%3C%4)", CurrentWB, ВсегоЛистов - 1, cRowFrom, .Column)
.Value = tmpFormula.Value
=======================
где у нас tmpFormula это какая-то отвлеченная ячейка только для того, чтоб туда формулу пихнуть,
StrFmt - ф-ия, вовр. строку, где заменяет %n на n-ый параметр.
Просто этот вариант мне не особо нравится. Хотя придется им обойтись, наверное. Если другого не будет предложено.
Ну так нечестно. Представь, двое мужиков соревнуются, кто быстрее установит раковину. Один справился за полтора часа, а другой за 10 минут сбегал за сантехником, который поставил раковину за час.
А если серьезно, то конечно можно и так как у тебя.
Ну так нечестно. Представь, двое мужиков соревнуются, кто быстрее установит раковину. Один справился за полтора часа, а другой за 10 минут сбегал за сантехником, который поставил раковину за час.
А если серьезно, то конечно можно и так как у тебя.
Хороший пример. :-)
На самом деле, рекомендуется иногда пользоваться функциями Worksheetfunction, поскольку они работают быстрее аналогичных в VBA. Я проверял.
Я и хотел воспользоваться SUM, но не смог. :-( пришлось в лоб делать. Зато работает и быстро. Надо еще с коллекцие попробовать... ВДруг быстрее будет?