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

Вход

Регистрация

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

 

= Мир MS Excel/Функция не пересчитывается при открытии документа - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Функция не пересчитывается при открытии документа
maonang Дата: Четверг, 14.12.2017, 18:55 | Сообщение № 1
Группа: Пользователи
Ранг: Прохожий
Сообщений: 7
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
Доброго времени суток.
Использую Excel 2016.

Структура документа (для понимания): В документе ведется учет сотрудников некой фирмы с формированием статистических данных.
Листы:
- приложения отчета, в которые сводятся все данные по критериям отбора сотрудников;
- список сотрудников с указанием личных данных и перерасчетом стажа работы (и многое другое);
- список сотрудников по отделам с подкатегориями:
Принятые на работу
* Руководители
* Специалисты
* Технические исполнители
Уволенные с работы
* Руководители
* Специалисты
* Технические исполнители

Задача, при решении которой возникла проблема:
Необходимо сформировать отчет, в котором будет подсчитано количество сотрудников по трем критериям:
1. Возраст - попадание возраста сотрудника в один из шести диапазонов (1) до 30 лет, 2) от 30 до 39 лет и т.д.)
2. Специальность - одна из четырех специальностей (Врач, ММП, СМП, Прочие)
3. Образование - одно из шести вариантов (среднее полное, среднее специальное, высшее, 2 и более высших, основное общее и неполное высшее). Два последних входят по отдельности в сумму к среднему полному и среднему специальному.

Данный отчет должен содержать в себе статистику из трех подразделов принятых сотрудников (Руководители, Специалисты и Технические исполнители)

Проблема заключается в том, что ячейки, в которых записан вызов макроса, реализующий выполнение поставленной задачи, не обновляют данные при открытии документа, выводят везде ноль вместо того, что должно быть.
Если в таких ячейках нажать F2, а потом Enter, то данные пересчитываются локально.
Комбинации F9 и Shift+F9 не помогают.
Параметры вычислений везде стоят в автоматическом режиме (На панели и во вкладке Параметры - Формулы).
Остальные мною написанные функции сбоя при работе не дают, но они не обрабатывают массив данных через циклы.

Макрос прописан в модуле под стандартным названием "Module1".
Текст макроса:
[vba]
Код
Public Function КоличествоТекущийГод(ДиапазонНачало, ДиапазонКонец As Integer, _
                    СпециальностьНазвание As String, _
                    СпециальностьСтолбец As Range, _
                    Высшее As String, _
                    ОбразованиеСтолбец, КНСтолбец, ДНСтолбец, ВозрастСтолбец As Range) As Integer
    'Application.Volatile
    Dim ОбщаяСумма As Integer
    ОбщаяСумма = 0
    Dim i As Integer
        For i = ДиапазонНачало To ДиапазонКонец Step 1
            If cells(i, ВозрастСтолбец.Column).Value <> "" And _
               cells(i, СпециальностьСтолбец.Column).Value = СпециальностьНазвание Then
               If cells(i, ОбразованиеСтолбец.Column).Value = "+" Or (Высшее <> "" And _
               (cells(i, КНСтолбец.Column).Value = "+" Or _
                cells(i, ДНСтолбец.Column).Value = "+")) Then
                   ОбщаяСумма = ОбщаяСумма + 1
               End If
           End If
       Next i
    КоличествоТекущийГод = ОбщаяСумма
End Function
[/vba]

Упрощенную выдержку из рабочей таблицы прилагаю в формате xls 2003. В основном документе много других расчетов и выделений ячеек по условиям.

Как сделать автоматическое обновление значений ячеек с использованием вышеуказанного макроса при изменении данных и перезапуске самого документа?
К сообщению приложен файл: 12.xls (71.0 Kb)


Сообщение отредактировал maonang - Пятница, 15.12.2017, 02:47
 
Ответить
СообщениеДоброго времени суток.
Использую Excel 2016.

Структура документа (для понимания): В документе ведется учет сотрудников некой фирмы с формированием статистических данных.
Листы:
- приложения отчета, в которые сводятся все данные по критериям отбора сотрудников;
- список сотрудников с указанием личных данных и перерасчетом стажа работы (и многое другое);
- список сотрудников по отделам с подкатегориями:
Принятые на работу
* Руководители
* Специалисты
* Технические исполнители
Уволенные с работы
* Руководители
* Специалисты
* Технические исполнители

Задача, при решении которой возникла проблема:
Необходимо сформировать отчет, в котором будет подсчитано количество сотрудников по трем критериям:
1. Возраст - попадание возраста сотрудника в один из шести диапазонов (1) до 30 лет, 2) от 30 до 39 лет и т.д.)
2. Специальность - одна из четырех специальностей (Врач, ММП, СМП, Прочие)
3. Образование - одно из шести вариантов (среднее полное, среднее специальное, высшее, 2 и более высших, основное общее и неполное высшее). Два последних входят по отдельности в сумму к среднему полному и среднему специальному.

Данный отчет должен содержать в себе статистику из трех подразделов принятых сотрудников (Руководители, Специалисты и Технические исполнители)

Проблема заключается в том, что ячейки, в которых записан вызов макроса, реализующий выполнение поставленной задачи, не обновляют данные при открытии документа, выводят везде ноль вместо того, что должно быть.
Если в таких ячейках нажать F2, а потом Enter, то данные пересчитываются локально.
Комбинации F9 и Shift+F9 не помогают.
Параметры вычислений везде стоят в автоматическом режиме (На панели и во вкладке Параметры - Формулы).
Остальные мною написанные функции сбоя при работе не дают, но они не обрабатывают массив данных через циклы.

Макрос прописан в модуле под стандартным названием "Module1".
Текст макроса:
[vba]
Код
Public Function КоличествоТекущийГод(ДиапазонНачало, ДиапазонКонец As Integer, _
                    СпециальностьНазвание As String, _
                    СпециальностьСтолбец As Range, _
                    Высшее As String, _
                    ОбразованиеСтолбец, КНСтолбец, ДНСтолбец, ВозрастСтолбец As Range) As Integer
    'Application.Volatile
    Dim ОбщаяСумма As Integer
    ОбщаяСумма = 0
    Dim i As Integer
        For i = ДиапазонНачало To ДиапазонКонец Step 1
            If cells(i, ВозрастСтолбец.Column).Value <> "" And _
               cells(i, СпециальностьСтолбец.Column).Value = СпециальностьНазвание Then
               If cells(i, ОбразованиеСтолбец.Column).Value = "+" Or (Высшее <> "" And _
               (cells(i, КНСтолбец.Column).Value = "+" Or _
                cells(i, ДНСтолбец.Column).Value = "+")) Then
                   ОбщаяСумма = ОбщаяСумма + 1
               End If
           End If
       Next i
    КоличествоТекущийГод = ОбщаяСумма
End Function
[/vba]

Упрощенную выдержку из рабочей таблицы прилагаю в формате xls 2003. В основном документе много других расчетов и выделений ячеек по условиям.

Как сделать автоматическое обновление значений ячеек с использованием вышеуказанного макроса при изменении данных и перезапуске самого документа?

Автор - maonang
Дата добавления - 14.12.2017 в 18:55
sboy Дата: Пятница, 15.12.2017, 11:41 | Сообщение № 2
Группа: Друзья
Ранг: Участник клуба
Сообщений: 2566
Репутация: 724 ±
Замечаний: 0% ±

Excel 2010
Добрый день.
Вот эту строчку расскоментируйте(удалить апостроф в начале)
[vba]
Код
'Application.Volatile
[/vba]


Яндекс: 410016850021169
 
Ответить
СообщениеДобрый день.
Вот эту строчку расскоментируйте(удалить апостроф в начале)
[vba]
Код
'Application.Volatile
[/vba]

Автор - sboy
Дата добавления - 15.12.2017 в 11:41
maonang Дата: Пятница, 15.12.2017, 15:09 | Сообщение № 3
Группа: Пользователи
Ранг: Прохожий
Сообщений: 7
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
Это была одна из попыток решить проблему.
Цитата
Вот эту строчку расскоментируйте(удалить апостроф в начале)

Убрал комментирование - при открытии по прежнему нули (данные не обновляются)
 
Ответить
СообщениеЭто была одна из попыток решить проблему.
Цитата
Вот эту строчку расскоментируйте(удалить апостроф в начале)

Убрал комментирование - при открытии по прежнему нули (данные не обновляются)

Автор - maonang
Дата добавления - 15.12.2017 в 15:09
sboy Дата: Пятница, 15.12.2017, 15:46 | Сообщение № 4
Группа: Друзья
Ранг: Участник клуба
Сообщений: 2566
Репутация: 724 ±
Замечаний: 0% ±

Excel 2010
maonang, а по F9 пересчитывает? Проверьте тогда автопересчет формул (может вручную в книге стоит)
я на вашем примере удалял данные, функция пересчитывалась.


Яндекс: 410016850021169
 
Ответить
Сообщениеmaonang, а по F9 пересчитывает? Проверьте тогда автопересчет формул (может вручную в книге стоит)
я на вашем примере удалял данные, функция пересчитывалась.

Автор - sboy
Дата добавления - 15.12.2017 в 15:46
maonang Дата: Пятница, 15.12.2017, 18:05 | Сообщение № 5
Группа: Пользователи
Ранг: Прохожий
Сообщений: 7
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
Цитата
а по F9 пересчитывает? Проверьте тогда автопересчет формул (может вручную в книге стоит)
я на вашем примере удалял данные, функция пересчитывалась.


Проблема в том, что при открытии документа обновление данных с расчетом не происходит.
Автоматический режим расчетов установлен. Все остальные формулы же работают.

Только после "перерасчета" формул в проблемных ячейках через комбинацию клавиш F2 -> Enter, данные изменяются при корректировке значений в связных ячейках.
F9 до вышеописанного действия не дает результата.


Сообщение отредактировал maonang - Пятница, 15.12.2017, 18:10
 
Ответить
Сообщение
Цитата
а по F9 пересчитывает? Проверьте тогда автопересчет формул (может вручную в книге стоит)
я на вашем примере удалял данные, функция пересчитывалась.


Проблема в том, что при открытии документа обновление данных с расчетом не происходит.
Автоматический режим расчетов установлен. Все остальные формулы же работают.

Только после "перерасчета" формул в проблемных ячейках через комбинацию клавиш F2 -> Enter, данные изменяются при корректировке значений в связных ячейках.
F9 до вышеописанного действия не дает результата.

Автор - maonang
Дата добавления - 15.12.2017 в 18:05
InExSu Дата: Пятница, 15.12.2017, 23:20 | Сообщение № 6
Группа: Друзья
Ранг: Ветеран
Сообщений: 648
Репутация: 96 ±
Замечаний: 0% ±

Excel 2010, 365
Привет!
Вставил в код
[vba]
Код
Stop
[/vba]
Сохранил, закрыл, запустил.
При запуске видно, что код работает.
К сообщению приложен файл: 1651267.jpg (31.3 Kb)


Разработчик Битрикс24 php, Google Apps Script, VBA Excel Windows/Mac
 
Ответить
СообщениеПривет!
Вставил в код
[vba]
Код
Stop
[/vba]
Сохранил, закрыл, запустил.
При запуске видно, что код работает.

Автор - InExSu
Дата добавления - 15.12.2017 в 23:20
maonang Дата: Суббота, 16.12.2017, 03:39 | Сообщение № 7
Группа: Пользователи
Ранг: Прохожий
Сообщений: 7
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
Привет, InExSu.
Я попробовал добавить оператор Stop в макрос. При открытии документа на нем остановка не происходит, значит, макрос не выполняется.
Перерасчет происходит только тогда, когда идет изменение указанных в аргументе функции ячеек. Это логично. А так как в реализации задачи используются адреса на динамически изменяющийся диапазон, то значения в ячейках с данной функцией изменяться не будут при корректировке данных самих сотрудников..
Спасибо за предложение, InExSu.
Возник дополнительный вопрос: учитывая данное исполнение листа проще сделать перерасчет формул после нажатия дополнительной кнопки или как-то можно без вмешательства пользователя обойтись?


Сообщение отредактировал maonang - Суббота, 16.12.2017, 03:40
 
Ответить
СообщениеПривет, InExSu.
Я попробовал добавить оператор Stop в макрос. При открытии документа на нем остановка не происходит, значит, макрос не выполняется.
Перерасчет происходит только тогда, когда идет изменение указанных в аргументе функции ячеек. Это логично. А так как в реализации задачи используются адреса на динамически изменяющийся диапазон, то значения в ячейках с данной функцией изменяться не будут при корректировке данных самих сотрудников..
Спасибо за предложение, InExSu.
Возник дополнительный вопрос: учитывая данное исполнение листа проще сделать перерасчет формул после нажатия дополнительной кнопки или как-то можно без вмешательства пользователя обойтись?

Автор - maonang
Дата добавления - 16.12.2017 в 03:39
InExSu Дата: Суббота, 16.12.2017, 08:49 | Сообщение № 8
Группа: Друзья
Ранг: Ветеран
Сообщений: 648
Репутация: 96 ±
Замечаний: 0% ±

Excel 2010, 365
макрос не выполняется

Что у вас с "Центр управления безопасностью"? Там много опций ...


Разработчик Битрикс24 php, Google Apps Script, VBA Excel Windows/Mac
 
Ответить
Сообщение
макрос не выполняется

Что у вас с "Центр управления безопасностью"? Там много опций ...

Автор - InExSu
Дата добавления - 16.12.2017 в 08:49
maonang Дата: Суббота, 16.12.2017, 13:43 | Сообщение № 9
Группа: Пользователи
Ранг: Прохожий
Сообщений: 7
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
Цитата
Что у вас с "Центр управления безопасностью"? Там много опций ...


Параметры ActiveX:

  • Включить все элементы управления

Параметры макросов:

  • Включить все макросы
  • Доверять доступ к объектной модели проектов VBA

Защищенный просмотр - Все CheckBox сняты
Внешнее содержимое:

  • Включить все подключения к данным
  • Включить автоматическое обновление для всех связей в книге

Параметры блокировки файлов - Не менял

Остальные параметры, думаю, описывать не нужно, так как они не влияют на работу формул и макросов.
 
Ответить
Сообщение
Цитата
Что у вас с "Центр управления безопасностью"? Там много опций ...


Параметры ActiveX:

  • Включить все элементы управления

Параметры макросов:

  • Включить все макросы
  • Доверять доступ к объектной модели проектов VBA

Защищенный просмотр - Все CheckBox сняты
Внешнее содержимое:

  • Включить все подключения к данным
  • Включить автоматическое обновление для всех связей в книге

Параметры блокировки файлов - Не менял

Остальные параметры, думаю, описывать не нужно, так как они не влияют на работу формул и макросов.

Автор - maonang
Дата добавления - 16.12.2017 в 13:43
maonang Дата: Вторник, 19.12.2017, 15:46 | Сообщение № 10
Группа: Пользователи
Ранг: Прохожий
Сообщений: 7
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
Проблема решена. Нужно было в качестве аргумента добавить диапазон с данными сотрудников, чтобы при изменении или открытии документа пересчитываемые параметры влияли на ячейки с указанным выше макросом.
Измененный макрос (добавлен аргумент ДиапазонДляПерерасчета):
[vba]
Код
Public Function КоличествоТекущийГод(ДиапазонНачало, ДиапазонКонец As Integer, _
                    СпециальностьНазвание As String, _
                    СпециальностьСтолбец As Range, _
                    Высшее As String, _
                    ОбразованиеСтолбец, КНСтолбец, ДНСтолбец, ВозрастСтолбец, ДиапазонДляПерерасчетаТекущийЛист, ДиапазонДляПерерасчетаСведенияОСотрудниках As Range) As Integer
    'Привязка к листу, от которого происходит вызов функции
    Dim ws As Worksheet
        Set ws = Application.Caller.Worksheet
    Dim ОбщаяСумма As Integer
    ОбщаяСумма = 0
    Dim i As Integer
        For i = ДиапазонНачало To ДиапазонКонец Step 1
            If ws.cells(i, ВозрастСтолбец.Column).Value <> "" And _
               ws.cells(i, СпециальностьСтолбец.Column).Value = СпециальностьНазвание Then
               If ws.cells(i, ОбразованиеСтолбец.Column).Value = "+" Or (Высшее <> "" And _
               (ws.cells(i, КНСтолбец.Column).Value = "+" Or _
                ws.cells(i, ДНСтолбец.Column).Value = "+")) Then
                   ОбщаяСумма = ОбщаяСумма + 1
               End If
           End If
       Next i
    КоличествоТекущийГод = ОбщаяСумма
End Function
[/vba]

Формула в одной из ячейки (добавлен диапазон в конце A:AD):
[vba]
Код
=КоличествоТекущийГод($N104;$N105;"В";$P$1;"";$AB$2;$AD$2;$AE$2;$F$2;A:AD)+КоличествоТекущийГод($N104;$N105;"В";$P$1;"";$AC$2;$AD$2;$AE$2;$F$2;A:AD)
[/vba]

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


Сообщение отредактировал maonang - Среда, 20.12.2017, 15:40
 
Ответить
СообщениеПроблема решена. Нужно было в качестве аргумента добавить диапазон с данными сотрудников, чтобы при изменении или открытии документа пересчитываемые параметры влияли на ячейки с указанным выше макросом.
Измененный макрос (добавлен аргумент ДиапазонДляПерерасчета):
[vba]
Код
Public Function КоличествоТекущийГод(ДиапазонНачало, ДиапазонКонец As Integer, _
                    СпециальностьНазвание As String, _
                    СпециальностьСтолбец As Range, _
                    Высшее As String, _
                    ОбразованиеСтолбец, КНСтолбец, ДНСтолбец, ВозрастСтолбец, ДиапазонДляПерерасчетаТекущийЛист, ДиапазонДляПерерасчетаСведенияОСотрудниках As Range) As Integer
    'Привязка к листу, от которого происходит вызов функции
    Dim ws As Worksheet
        Set ws = Application.Caller.Worksheet
    Dim ОбщаяСумма As Integer
    ОбщаяСумма = 0
    Dim i As Integer
        For i = ДиапазонНачало To ДиапазонКонец Step 1
            If ws.cells(i, ВозрастСтолбец.Column).Value <> "" And _
               ws.cells(i, СпециальностьСтолбец.Column).Value = СпециальностьНазвание Then
               If ws.cells(i, ОбразованиеСтолбец.Column).Value = "+" Or (Высшее <> "" And _
               (ws.cells(i, КНСтолбец.Column).Value = "+" Or _
                ws.cells(i, ДНСтолбец.Column).Value = "+")) Then
                   ОбщаяСумма = ОбщаяСумма + 1
               End If
           End If
       Next i
    КоличествоТекущийГод = ОбщаяСумма
End Function
[/vba]

Формула в одной из ячейки (добавлен диапазон в конце A:AD):
[vba]
Код
=КоличествоТекущийГод($N104;$N105;"В";$P$1;"";$AB$2;$AD$2;$AE$2;$F$2;A:AD)+КоличествоТекущийГод($N104;$N105;"В";$P$1;"";$AC$2;$AD$2;$AE$2;$F$2;A:AD)
[/vba]

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

Автор - maonang
Дата добавления - 19.12.2017 в 15:46
  • Страница 1 из 1
  • 1
Поиск:

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