Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Объект Range, связ. яч. на разных листах

4.9K
28 августа 2003 года
Denicce
6 / / 28.08.2003
Нужно объявить объект типа Range, который бы объединял ячейки на разных листах. Необходимо для функции WorksheetFunction.Sum(). А то приходится перечислять кучу объектов Range, для каждого листа. Отдельно можно сформировать функцию:

=СУММ('Лист1:Лист30'!$F$9)

Но как это в коде VBA через объект Range сделать - непонятно.
267
28 августа 2003 года
Cutty Sark
1.2K / / 17.10.2002
Цитата:
Originally posted by Denicce
Нужно объявить объект типа Range, который бы объединял ячейки на разных листах. Необходимо для функции WorksheetFunction.Sum(). А то приходится перечислять кучу объектов Range, для каждого листа. Отдельно можно сформировать функцию:

=СУММ('Лист1:Лист30'!$F$9)

Но как это в коде VBA через объект Range сделать - непонятно.



Напиши свою функцию. Она ж несложная будет.

4.9K
29 августа 2003 года
Denicce
6 / / 28.08.2003
Цитата:
Originally posted by Cutty Sark


Напиши свою функцию. Она ж несложная будет.



Это понятно. :-) Только как это сделать? Я б не писал сюда, если б знал. У меня есть один вариант, но он уж больно страшный. Можешь пример привести?

267
29 августа 2003 года
Cutty Sark
1.2K / / 17.10.2002
Цитата:
Originally posted by Denicce


Это понятно. :-) Только как это сделать? Я б не писал сюда, если б знал. У меня есть один вариант, но он уж больно страшный. Можешь пример привести?



Ну как-то так:

Код:
Sub Test()
    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


Сейчас эта функция считает суммы в той книге, в которой находится. Если тебе надо будет считать в другой книге, напиши, внесем соответствующие изменения.
4.9K
29 августа 2003 года
Denicce
6 / / 28.08.2003
ОК, спасибо.
Значит, объявить Range по разным листам в коде VBA нельзя?

Функция работает - но мой вариант быстрее, и практически не зависит от количества листов:

=======================
tmpFormula.Value = StrFmt("=SUM('%1№1:%1№%2'!R%3C%4)", CurrentWB, ВсегоЛистов - 1, cRowFrom, .Column)

.Value = tmpFormula.Value
=======================

где у нас tmpFormula это какая-то отвлеченная ячейка только для того, чтоб туда формулу пихнуть,
StrFmt - ф-ия, вовр. строку, где заменяет %n на n-ый параметр.

Просто этот вариант мне не особо нравится. Хотя придется им обойтись, наверное. Если другого не будет предложено.
258
29 августа 2003 года
SergeySV
1.5K / / 19.03.2003
Range должен обязательно относится к какому-нибудь Листу, а сразу две разных области содержать не может...так что

Если тебе уж очень хочется структуризовать свой код (да и так на будущее), то можно создать свой класс_модуль, вернее достаточно объявить свою коллекцию. Сам класс Collection - стандартный. Методы Add, Remove уже есть, пихай в него чего хочешь, а потом напиши функцию, которая в качестве параметра будет принимать однй переменную - эту коллекцию. Ну а внутри функции подсчет как уже было написано, для каждого Range отд. сумма и сумма сумм...
267
29 августа 2003 года
Cutty Sark
1.2K / / 17.10.2002
Цитата:
Originally posted by Denicce
ОК, спасибо.
Значит, объявить 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 минут сбегал за сантехником, который поставил раковину за час.

А если серьезно, то конечно можно и так как у тебя.

4.9K
29 августа 2003 года
Denicce
6 / / 28.08.2003
Цитата:
Originally posted by Cutty Sark


Ну так нечестно. Представь, двое мужиков соревнуются, кто быстрее установит раковину. Один справился за полтора часа, а другой за 10 минут сбегал за сантехником, который поставил раковину за час.

А если серьезно, то конечно можно и так как у тебя.



Хороший пример. :-)

На самом деле, рекомендуется иногда пользоваться функциями Worksheetfunction, поскольку они работают быстрее аналогичных в VBA. Я проверял.
Я и хотел воспользоваться SUM, но не смог. :-( пришлось в лоб делать. Зато работает и быстро. Надо еще с коллекцие попробовать... ВДруг быстрее будет?

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог