Приветствую. Стоит такая задача. Есть заполняемая третьими лицами таблица. Нужно подсчитать кол-во ответов "Да" в столбце. Количество строк может меняться периодически. Ранее считал формулой СЧЁТЕСЛИ, но это неудобно из-за периодического изменения диапазонов (больший диапазон, чем в столбце строк задавать нельзя). Написал функцию на основе WorksheetFunction.CountIf, но чтобы диапазон при расчёте ставился в зависимости от заполненных строк. Считает правильно - всё хорошо. Но если сделать пересчёт на втором листе, то на первом листе подставляются результаты пересчёта второго листа. Вопрос такой: как сделать так, чтобы на листах всегда был правильный результат не зависимо от того, какой лист активен или пересчитывался последним? Вот код функции: [vba]
Код
Function FinStatYes(RngColumn As Range) As Long Application.Volatile Dim iLastRowSchet As Long, RngSchet As Range, vUslovie As Variant, lColumnSchet As Long Dim sSchetSheet As Worksheet lColumnSchet = RngColumn.Column 'номер столбца, указанного в функции iLastRowSchet = Cells(Rows.Count, 1).End(xlUp).Row 'последняя заполненная строка в первом столбце на листе 'диапазон проверки условия Set RngSchet = Range(Cells(4, lColumnSchet), Cells(iLastRowSchet, lColumnSchet)) vUslovie = "Да" 'условие 'функция приравнивается к функции листа счётесли FinStatYes = Application.WorksheetFunction.CountIf(RngSchet, vUslovie) End Function
[/vba] Пример приложил.
Приветствую. Стоит такая задача. Есть заполняемая третьими лицами таблица. Нужно подсчитать кол-во ответов "Да" в столбце. Количество строк может меняться периодически. Ранее считал формулой СЧЁТЕСЛИ, но это неудобно из-за периодического изменения диапазонов (больший диапазон, чем в столбце строк задавать нельзя). Написал функцию на основе WorksheetFunction.CountIf, но чтобы диапазон при расчёте ставился в зависимости от заполненных строк. Считает правильно - всё хорошо. Но если сделать пересчёт на втором листе, то на первом листе подставляются результаты пересчёта второго листа. Вопрос такой: как сделать так, чтобы на листах всегда был правильный результат не зависимо от того, какой лист активен или пересчитывался последним? Вот код функции: [vba]
Код
Function FinStatYes(RngColumn As Range) As Long Application.Volatile Dim iLastRowSchet As Long, RngSchet As Range, vUslovie As Variant, lColumnSchet As Long Dim sSchetSheet As Worksheet lColumnSchet = RngColumn.Column 'номер столбца, указанного в функции iLastRowSchet = Cells(Rows.Count, 1).End(xlUp).Row 'последняя заполненная строка в первом столбце на листе 'диапазон проверки условия Set RngSchet = Range(Cells(4, lColumnSchet), Cells(iLastRowSchet, lColumnSchet)) vUslovie = "Да" 'условие 'функция приравнивается к функции листа счётесли FinStatYes = Application.WorksheetFunction.CountIf(RngSchet, vUslovie) End Function
Если отключить автопересчёт - эффект пропадает. Если отключить Application.Volatile - эффект пропадает. Но тогда в обоих случаях нужно пересчитывать вручную. Но есть выход - как аргумент указываем не ячейку, а весь столбец:
Код
=FinStatYes(D:D)
и всё работает. Если убрать Application.Volatile.
Если отключить автопересчёт - эффект пропадает. Если отключить Application.Volatile - эффект пропадает. Но тогда в обоих случаях нужно пересчитывать вручную. Но есть выход - как аргумент указываем не ячейку, а весь столбец:
Код
=FinStatYes(D:D)
и всё работает. Если убрать Application.Volatile.Hugo