Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Пользовательская функция на разных листах даёт равный итог - Мир MS Excel

Регистрация · Логин: · Пароль: · · Забыли пароль?
  • Страница 1 из 1
  • 1
Модератор форума: _Boroda_, Manyasha, SLAVICK, китин  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Пользовательская функция на разных листах даёт равный итог (Макросы/Sub)
Пользовательская функция на разных листах даёт равный итог
drugojandrew Дата: Вторник, 12.05.2020, 12:28 | Сообщение № 1
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 137
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
Приветствую.
Стоит такая задача.
Есть заполняемая третьими лицами таблица. Нужно подсчитать кол-во ответов "Да" в столбце. Количество строк может меняться периодически. Ранее считал формулой СЧЁТЕСЛИ, но это неудобно из-за периодического изменения диапазонов (больший диапазон, чем в столбце строк задавать нельзя).
Написал функцию на основе 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]
Пример приложил.
К сообщению приложен файл: Primer01.xls(66.0 Kb)
 
Ответить
СообщениеПриветствую.
Стоит такая задача.
Есть заполняемая третьими лицами таблица. Нужно подсчитать кол-во ответов "Да" в столбце. Количество строк может меняться периодически. Ранее считал формулой СЧЁТЕСЛИ, но это неудобно из-за периодического изменения диапазонов (больший диапазон, чем в столбце строк задавать нельзя).
Написал функцию на основе 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]
Пример приложил.

Автор - drugojandrew
Дата добавления - 12.05.2020 в 12:28
Hugo Дата: Вторник, 12.05.2020, 12:48 | Сообщение № 2
Группа: Друзья
Ранг: Участник клуба
Сообщений: 2946
Репутация: 649 ±
Замечаний: 0% ±

Если отключить автопересчёт - эффект пропадает.
Если отключить Application.Volatile - эффект пропадает.
Но тогда в обоих случаях нужно пересчитывать вручную.
Но есть выход - как аргумент указываем не ячейку, а весь столбец:
Код
=FinStatYes(D:D)

и всё работает. Если убрать Application.Volatile.


excel@nxt.ru
webmoney: E265281470651 R418926282008 Z422237915069


Сообщение отредактировал Hugo - Вторник, 12.05.2020, 13:04
 
Ответить
СообщениеЕсли отключить автопересчёт - эффект пропадает.
Если отключить Application.Volatile - эффект пропадает.
Но тогда в обоих случаях нужно пересчитывать вручную.
Но есть выход - как аргумент указываем не ячейку, а весь столбец:
Код
=FinStatYes(D:D)

и всё работает. Если убрать Application.Volatile.

Автор - Hugo
Дата добавления - 12.05.2020 в 12:48
drugojandrew Дата: Вторник, 12.05.2020, 17:33 | Сообщение № 3
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 137
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
Hugo, спасибо, то что надо.
 
Ответить
СообщениеHugo, спасибо, то что надо.

Автор - drugojandrew
Дата добавления - 12.05.2020 в 17:33
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Пользовательская функция на разных листах даёт равный итог (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

Яндекс цитирования
© 2010-2020 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!