Макрос на рекалькуляцию

Весь MS Office, программирование на Visual Basic for Applications и MS VB

Модератор: Naeel Maqsudov

Ответить
kuznetsovSergey
Сообщения: 163
Зарегистрирован: 05 мар 2009, 11:27

Доброе утро,

Подскажите пожалуйста, каким образом можно завязать макрос на пересчёт, что то такого типа.

Private Sub Workbook_SheetCalculate
...
End Sub

Но который был бы завязан на CheckBox. Расположенный на листе. Тоесть при установки галочки, макрос отслеживал бы изменения на листе, и запускался при каждом обновлении. Если же CheckBox = false, то он не запускал бы макрос при каждом обновлении листа.

Заранее благодарю за помощь !!
nilem
Сообщения: 112
Зарегистрирован: 14 ноя 2008, 01:59
Откуда: Уфа

Наверное, так: если False, то выходим из процедуры

Код: Выделить всё

Private Sub Workbook_SheetCalculate
If Sheets("Лист1").CheckBox1.Value = False Then Exit Sub
...
End Sub
kuznetsovSergey
Сообщения: 163
Зарегистрирован: 05 мар 2009, 11:27

nilem писал(а):Наверное, так: если False, то выходим из процедуры

Код: Выделить всё

Private Sub Workbook_SheetCalculate
If Sheets("Лист1").CheckBox1.Value = False Then Exit Sub
...
End Sub

Дело в том, в одной книге у меня 2 макроса, один на расчёт, другой на коррекцию.

1-ый макрос запускается с кнопки, и проводит расчёт, и как бы предлагает оптимальное решение.
2-ой макрос, для корректировки, при внесении изменений на листе, выдаёт результаты по внесенным изменениям.

Если оставить как Вы порекомендовали. То - при запуске первого макроса, который проихводит расчёт, второй будет запускаться, при вводе каждого значения первым макросом. Это убьют систему наглухо.

Поэтому для создания "френдли-интерфейса", хотелось бы с листа, включать и выключать автозапуск макроса. Причём не с кнопки, а на изменение листа.
С кнопки - это скучно, каждый раз при корректировки, нажимать кнопку - так никаких нервов не хватит ) Поэтому и было придумано, что бы после расчёта, активировать возможность коррекции с авторасчётом.
kuznetsovSergey
Сообщения: 163
Зарегистрирован: 05 мар 2009, 11:27

Может есть способ checkbox - ом включать макрос, который работает на принципе SheetCalculate ?
kuznetsovSergey
Сообщения: 163
Зарегистрирован: 05 мар 2009, 11:27

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

написан макрос, который производит расчёт, с кнопки. Второй макрос, отслеживает изменения листа на пересчёт, и как только происходит пересчёт листа, макрос запускается, и производит собственные расчёты. НО ! первый макрос ломает второй, потому что когда , первый макрос начинает считать, на каждое изменение первым макросом, второй макрос запускается. Можно ли завязать работу второго макроса на checkbox ? что бы когда галка стояла, то макрос включался бы на обновление листа, если же галки нет, то код на изменение листа не запускался бы.

Очень нужно решение этой задачки.
kuznetsovSergey
Сообщения: 163
Зарегистрирован: 05 мар 2009, 11:27

Up!

Не уэе ли никто н езнает способ реалзиации подобной задачи?
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

Действительно странно что еще никто не ответил

1) если надо именно по чекбоксу, то в начале макроса (точнее обработчика события) пишем
if ЧекбоксТакойТо.value then
а потом в конце
end if

2) но есть более изящный способ
создаём глобальную переменную, скажем
dim Mutex as boolean
Точно также как в решении выше проблемный обработчик события заключаем в операторные скобки

if not Mutex then
.....
end if

Т.е. он будет запускать только если Mutex=false

Другой же обработчик события, работа которого приводит к нежелательному срабатыванию первого события должен в нужное время делать
Mutex=true (это вначале своей работы)
и
Mutex=false (когда нужно снять запрет на срабатывание события)
kuznetsovSergey
Сообщения: 163
Зарегистрирован: 05 мар 2009, 11:27

Naeel Maqsudov писал(а):Действительно странно что еще никто не ответил

1) если надо именно по чекбоксу, то в начале макроса (точнее обработчика события) пишем
if ЧекбоксТакойТо.value then
а потом в конце
end if

2) но есть более изящный способ
создаём глобальную переменную, скажем
dim Mutex as boolean
Точно также как в решении выше проблемный обработчик события заключаем в операторные скобки

if not Mutex then
.....
end if

Т.е. он будет запускать только если Mutex=false

Другой же обработчик события, работа которого приводит к нежелательному срабатыванию первого события должен в нужное время делать
Mutex=true (это вначале своей работы)
и
Mutex=false (когда нужно снять запрет на срабатывание события)

Спасибо ! Вот только если честно не знаю ... а Можно в условие размещать всю процедуру?
Ответить