Здравствуйте уважаемые ГУРУ! Экселем владею на пользовательском уровне, но для работы нужны скоростные фишки, т.к. информации приходится обрабатывать очень много. Есть файл из 5-ти связанных формулами листов. При введении новых данных программа очень долго пересчитывает каждое нововведение. Вводит данные сотрудница лет 55 и ей нужно, чтобы все было просто и понятно. Поэтому прошу Вас помочь мне с написанием макроса и привязке его к кнопке «ПЕРЕСЧИТАТЬ». Я отключу автоматический пересчет и сделаю ей кнопку, по окончании ввода данных она нажмет КНОПКУ (F9 — она не запомнит)и проверит результат. Только как все это сделать? Очень жду Вашего совета. |
|
Юрий М Модератор Сообщений: 60586 Контакты см. в профиле |
Дим, кнопка будет в 1/4 листа |
слэн Пользователь Сообщений: 5192 |
|
Да, кнопка будет не маленькая. Как привязать макрос к кнопке? Что создать сначала? |
|
{quote}{login=слэн}{date=09.09.2010 02:27}{thema=}{post}вот файл{/post}{/quote} Как здорова работает! Спасибо огромное! А если листов несколько — будет работать? |
|
Юрий М Модератор Сообщений: 60586 Контакты см. в профиле |
А самому проверить не судьба? |
{quote}{login=Юрий М}{date=09.09.2010 02:40}{thema=}{post}А самому проверить не судьба?{/post}{/quote} Прошу прощение за тугоумие, я впервые столкнулась с макросами. Подскажите последовательность действий. Я создала кнопку, а как привязаться к макросу? |
|
Юрий М Модератор Сообщений: 60586 Контакты см. в профиле |
Правый клик — Назначить макрос |
Кликаю правой кнопкой — в списке нет такой записи «Назначить макрос». Есть: вырезать, копировать, вставить, свойства, исходный текст, объект …, группировка, порядок, формат и ВСЁ. Может у меня уровень безопасности не тот? |
|
Юрий М Модератор Сообщений: 60586 Контакты см. в профиле |
{quote}{login=Хома}{date=09.09.2010 02:56}{thema=}{post}Кликаю правой кнопкой — в списке нет такой записи «Назначить макрос». {/post}{/quote} |
Сомневаюсь. Его нет — нажимаю на ПИ Сервис-Макрос — кнопка «создать» неактивна. Как тогда создать? |
|
Юрий М Модератор Сообщений: 60586 Контакты см. в профиле |
В файле Слэна попробуйте правый клик на «кнопке». |
Получается вот так: |
|
Юрий М Модератор Сообщений: 60586 Контакты см. в профиле |
Отключите режим конструктора. |
{quote}{login=Юрий М}{date=09.09.2010 03:08}{thema=}{post}В файле Слэна попробуйте правый клик на «кнопке».{/post}{/quote} такая же история — нет надписи «назначить макрос». |
|
{quote}{login=Юрий М}{date=09.09.2010 03:16}{thema=}{post}Отключите режим конструктора.{/post}{/quote} Вышла из режима, и все заработало!!! Пересчитывает! |
|
Дурацкий вопрос — как переименовать кнопку? |
|
Юрий М Модератор Сообщений: 60586 Контакты см. в профиле |
В свойствах кнопки — Caption. |
И еще один вопросик — можно ли, чтобы эта кнопка перемещалась вместе с последней строкой данных и всегда была на виду? |
|
Юрий М Модератор Сообщений: 60586 Контакты см. в профиле |
Первую, или несколько первых строк закрепляем и в эту область помещаем кнопку. Кнопка всегда будет на виду. Вам бы литературу почитать… |
{quote}{login=Юрий М}{date=09.09.2010 03:40}{thema=}{post}Первую, или несколько первых строк закрепляем и в эту область помещаем кнопку. Кнопка всегда будет на виду. Вам бы литературу почитать…{/post}{/quote} Простите! Делаю надпись, а спрашиваю о кнопке: если кнопка является объектом WordArt (просто надписью), как прикрепить этот объект к последней строке и сделать всегда в поле зрения? |
|
Юрий М Модератор Сообщений: 60586 Контакты см. в профиле |
Хома, в закреплённую область. |
Хома Гость |
#23 09.09.2010 16:33:41 Спасибо Вам за советы и рекомендации! Буду осваивать неосвоенное. |
Пересчет отдельных формул в рабочей книге
- Подробности
- Создано 04 Февраль 2018
Содержание |
---|
Решение задачи |
Константы: |
Процедура пересчета диапазонов: |
Типичная проблема при работе с большими или очень большими файлами Excel — это слишком сильное замедление при выполнении любых расчетов. Стандартной рекомендацией при этом является переключение Excel на ручной режим пересчета (ленат Формулы Параметры вычислений). Но зачастую рабочая книга построена таким образом, что хотелось бы видеть автоматическое обновление каких-то оперативных данных и сумм непосредственно при вводе. Нажимать все время F9, во-первых, неудобно, во-вторых, расчет каких-то итоговых таблиц вообще можно отложить на неопределенный срок — занимать время на их пересчет совсем не требуется. Иногда помогает пересчет не всей рабочей книги, а только активного листа — Shift+F9. Но и это не всегда удобно, и зависит от степени сложности связей между листами.
Кардинальным способом решения проблемы является пересчет итоговых таблиц по определенному событию, все остальное время там будут храниться только значения. Шаблон расчетных формул можно хранить в скрытом диапазоне. Т.е. рабочий файл можно оставить в автоматическом режиме расчетов для ввода каких-то данных. А для расчета итоговых таблиц необходимо будет вызывать макрос VBA. Очевидно, что для эффективности данного пересчитываемые таблицы должны иметь большое количество однотипных формул.
Решение задачи
Макрос делает следуеющее:
- Проходит по всем ячейкам столбца «Признак»
- Если «Признак»=1, то во все «Столбцы» таблицы вставлются формулы из строки «Формула»
- После заполнения всех формул пересчитывается рабочий лист
- После завершения расчета все вставленные формулы заменяются на значения
- Во вложении пример решения подобной задачи.
Пример реализации макроса на VBA во вложении к статье.
Константы:
Для простоты в примере все ссылки на столбцы и строки заданы через константы — см.проект VBA. В реальном проекте лучше заменить константы на переменные, ссылающиеся на именованные диапазоны рабочей книги.
Const colBegFormula As Long = 2 Const colEndFormula As Long = 9 Const colFlag As Long = 11 Const rowBegData As Long = 5 Const rowEndData As Long = 18 Const rowFormulas As Long = 19
Процедура пересчета диапазонов:
Private Sub RecalcFormulas(rngData As Excel.Range, rngFlags As Excel.Range, rngFormulas As Excel.Range) Dim calcMode As Excel.XlCalculation Dim wsh As Excel.Worksheet Dim rngRowData As Excel.Range Dim idx As Long, curRow As Long On Error GoTo Err_ calcMode = SaveCalcMode() Set wsh = rngData.Worksheet ' fill formulas For idx = 1 To rngData.Rows.Count curRow = rngData.Rows(idx).Row If (rngFlags.Cells(idx) = 1) Then Set rngRowData = wsh.Range(wsh.Cells(curRow, rngFormulas.Columns(1).Column), _ wsh.Cells(curRow, rngFormulas.Columns(rngFormulas.Columns.Count).Column)) rngFormulas.Copy rngRowData.PasteSpecial xlPasteFormulas End If Next wsh.Calculate 'Application.Calculate ' fill values For idx = 1 To rngData.Rows.Count curRow = rngData.Rows(idx).Row If (rngFlags.Cells(idx) = 1) Then Set rngRowData = wsh.Range(wsh.Cells(curRow, rngFormulas.Columns(1).Column), _ wsh.Cells(curRow, rngFormulas.Columns(rngFormulas.Columns.Count).Column)) rngRowData.Copy rngRowData.PasteSpecial xlPasteValues End If Next RestoreCalcMode calcMode Exit Sub Err_: MsgBox Err.Description RestoreCalcMode calcMode End Sub
Для сложных файлов лучше пересчитывать не только активный лист (см.строку wsh.Calculate), а все открытые рабочие книги — замените строку на Application.Calculate
Процедуры SaveCalcMode и RestoreCalcMode необходимы для корректного возврата текущего режима расчета Excel (автоматический или ручной). Туда же можно добавить скрытие визуализации выполнения макроса через задание параметра Application.ScreenUpdating = False (скрывает обновление экрана) и Application.ScreenUpdating = True (восстанавливает обновление экрана).
Смотри также
» Класс сохранения настроек Excel
В данной статье описывается небольшой, но очень удобный класс для сохранения и автоматического восстановления таких параметров…
» Основные принципы оптимизации работы в электронных таблицах
Знание специальных приемов работы в электронных таблицах Excel позволяет в разы сократить время разработки моделей, повысить…
» Надстройки Excel
Те, кто программирует на VBA для Excel, в определенный момент задумываются над распространением своих приложений в качестве независимых…
» Автоматизация в Excel
Создание программного кода для автоматизации определенных процедур открывает практически безграничные возможности по развитию и…
» Доступ к данным Excel через ADO
Данный пример демонстрирует работу с файлами Excel через интерфейс доступа к данным ADO (ActiveX Data Objects). Объекты ADO входят в состав Windows,…
Содержание
- Отключить автоматические вычисления
- Снова включите автоматические вычисления
- Пример макроса «Отключить автоматические вычисления»
- Расчет вручную
Каждый раз, когда вы обновляете значение ячейки, Excel выполняет процесс пересчета книги. При работе непосредственно в Excel вы хотите, чтобы это происходило в 99,9% случаев (за исключением случаев, когда вы работаете с очень большой книгой). Однако это может действительно замедлить ваш код VBA. Рекомендуется устанавливать вычисления вручную в начале макроса и восстанавливать вычисления в конце макроса. Если вам нужно пересчитать книгу, вы можете вручную указать Excel для расчета.
Отключить автоматические вычисления
Вы можете отключить автоматический расчет с помощью макроса, установив для него значение xlmanual. Используйте следующий фрагмент кода VBA:
1 | Application.Calculation = xlManual |
Снова включите автоматические вычисления
Чтобы снова включить автоматический расчет с настройкой xlAutomatic:
1 | Application.Calculation = xlAutomatic |
Я рекомендую отключить автоматические вычисления в самом начале процедуры и снова включить автоматические вычисления в конце. Это будет выглядеть так:
Пример макроса «Отключить автоматические вычисления»
12345678 | Sub Auto_Calcs_Example ()Application.Calculation = xlManual’Сделай что-нибудьApplication.Calculation = xlAutomaticКонец подписки |
Расчет вручную
Когда автоматические вычисления отключены, вы можете использовать Рассчитать команда для принудительного пересчета Excel:
Вы также можете указать Excel, чтобы он пересчитывал только отдельный рабочий лист:
1 | Рабочие листы («лист1»). Рассчитать |
Вы также можете указать VBA пересчитать только диапазон (щелкните, чтобы прочитать нашу статью о методах вычисления VBA)
Вот как это может выглядеть внутри макроса:
12345678910111213 | Sub Auto_Calcs_Example_Manual_Calc ()Application.Calculation = xlManual’Сделай что-нибудь’RecalcРассчитать’Делай больше вещейApplication.Calculation = xlAutomaticКонец подписки |
Настройки VBA — код ускорения
Если ваша цель — ускорить код, вам также следует подумать о настройке следующих параметров:
Отключение обновления экрана может существенно повлиять на скорость:
1 | Application.ScreenUpdating = False |
Отключение строки состояния также имеет небольшое значение:
1 | Application.DisplayStatusBar = False |
Если ваша книга содержит события, вам также следует отключить события в начале ваших процедур (чтобы ускорить код и предотвратить бесконечные циклы!):
1 | Application.EnableEvents = False |
Наконец, ваш код VBA может замедлиться, когда Excel пытается повторно вычислить разрывы страниц (Примечание: не все процедуры будут затронуты). Чтобы отключить DisplayPageBreaks, используйте эту строку кода:
1 | ActiveSheet.DisplayPageBreaks = False |
Вы поможете развитию сайта, поделившись страницей с друзьями
5 / 5 / 0 Регистрация: 25.02.2010 Сообщений: 34 |
|
1 |
|
11.08.2011, 11:32. Показов 31787. Ответов 9
Подскажите, пож. Ситуация: на листе 2 суммируются результаты листа 1 (помесячные значения) в квартальные, формулами вида =СУММЕСЛИ(No_квартала;Строка_номеров_кварталов_лис та1;Таблица_помесячных_значений_листа1) Вопрос: Есть ли способ сохранить пересчет формул для листа_1 и выключить для листа_2 ?
0 |
4 / 4 / 0 Регистрация: 11.08.2011 Сообщений: 62 |
|
11.08.2011, 12:00 |
2 |
там, где генерируешь пересчет надо изменить на
0 |
5 / 5 / 0 Регистрация: 25.02.2010 Сообщений: 34 |
|
11.08.2011, 12:44 [ТС] |
3 |
Правильно ли Вас понял: Вначале запрещаем пересчет Затем разрешаем для конкретного листа (~ .Calculate — больше похоже на разовый принудительный пересчет) ==> СЧИТАЕМ Возвращаем автопересчет = ? = — если уверены — ответьте (простите, проверять конкретно сегодня нет времени)
0 |
4 / 4 / 0 Регистрация: 11.08.2011 Сообщений: 62 |
|
11.08.2011, 13:34 |
4 |
в зависимости от того, как часто тебе надо проводить пересчет. Если постоянно при вводе, то так, как ты написал, а если ты что-то вносишь, а потом разом произвести пересчет, то можно средствами экселя — пересчет листа, я бы вывалил на лист кнопку и в обработке клика прописал пересчет листа, как писал раньше.
0 |
5 / 5 / 0 Регистрация: 25.02.2010 Сообщений: 34 |
|
11.08.2011, 13:47 [ТС] |
5 |
По частоте я обращал внимание: после изменения данных каждой ячейки листа1, поскольку после подстановки данных шага i формулами генерятся данные для шага i+1, т.е. по сути листу 1 нужен автопересчет; а пересчет листа 2 нужен после отработки на листе 1 получается, Ваш пересчет для какой-то точки программы, что некузяво, т.к. wsh.Count придется вызывать после каждого заполнения j,i-й ячейки, ну или типа того. Изначально вопрос стоял иначе: автопересчет на листе 1 и его отсутствие на листе 2. Есть у кого идеи?
0 |
Заблокирован |
|
11.08.2011, 13:57 |
6 |
Iasmer,
0 |
4 / 4 / 0 Регистрация: 11.08.2011 Сообщений: 62 |
|
11.08.2011, 21:46 |
7 |
If Worksheets(2).EnableCalculation = False Then Worksheets(2).EnableCalculation = True: Worksheets(2).CommandButton1.Caption = «Включено» у листа, если зайдете в исходный текст есть свойство: EnableCalculation
1 |
Iasmer 5 / 5 / 0 Регистрация: 25.02.2010 Сообщений: 34 |
||||
12.08.2011, 11:17 [ТС] |
8 |
|||
primuspd — респект! Добавлено через 28 минут Private Sub CommandButton1_Click() пишет, падла на Worksheets(2).CommandButton1.Caption = «ххх» к чему бы это? Добавлено через 46 минут наше ИТОГО выглядит следующим образом:
0 |
4 / 4 / 0 Регистрация: 11.08.2011 Сообщений: 62 |
|
12.08.2011, 15:54 |
9 |
я понимаю, что тема закрыта, но я вчера потестил внимательно этот код и заметил такую бяку: выставляешь по дефолту руками для листа это EnableCalculation в ложь и потом по нажатию кнопки оно включается и сразу после расчета встает снова в ложь.
0 |
5 / 5 / 0 Регистрация: 25.02.2010 Сообщений: 34 |
|
12.08.2011, 17:04 [ТС] |
10 |
Состояние EnableCalculation листа 2 в процессе работы программы не проверял, но время расчета вернулось к «нормальному», т.е. до вставки самого листа 2 со сложным и нудным суммированием.
0 |
Циклический пересчет формул после добавления макроса |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |