|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
28.09.2011, 16:47 | #1 |
Форумчанин
Регистрация: 01.05.2009
Сообщений: 200
|
Worksheet_Change для диапазона в диапазоне)
Доброго времени суток.
Пытаюсь реализовать следуюший механизм: Если в диапазоне ячеек (E27;F128) меняется хотя бы одно значение (как правило будут меняться все значения сразу), должен сработать макрос, который в ячейку G27 вставит слово "Необходимость" при выполнении хотя бы одного условия: или E27>$E$17, или F27>$F$17 аналогично макрос должен сработать для G28 при условии E28>$E$17 или F28>$F$17 и т.д. до ячейки G128 Я постарался это реализовать следующим образом Код:
1. Когда выполняется одно из условий, макрос заносит в нужную ячейку слово "Необходимость", но после этого макрос начинает работать заново, так как на листе прозошли изменения-это приводит к зацикливанию. А необходимо, чтобы он допроверил весь дипазон до G128 до конца и везде внес изменения. 2. Как сделать так, чтобы макрос не реагировал, когда делаются первоначальные иземенения вне диапазона (E27;F128) Заранее большео спасибо. |
28.09.2011, 17:12 | #2 |
Новичок
СтарожилДжуниор
Регистрация: 05.02.2008
Сообщений: 9,487
|
1.
в начале процедуры application.eventsenabled false в конце application.eventsenabled true а в самом начале еще до application.eventsenabled false я бы проверил в каком диапозоне произошли изменения, если это не подконтрольный диапазон, то тут же - выход из процедуры. 2. если первоначальные данные вносите макрос - то рецепт тот же что и для 1. - application.eventsenabled false...
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
|
28.09.2011, 17:33 | #3 |
Форумчанин
Регистрация: 01.05.2009
Сообщений: 200
|
Если я правильно понял должно быть так
Код:
1. Можно пояснить, что делает Application.EnableEvents 2. По второй проблеме мне именно нужна проверка в каком диапазоне прозошли изменения. У меня сложность это написать на VBA. P.S. Первоначальные изменния в диапазоне (E27;F128) вносятся нажатием клавиши F9 (выгружаются из базы данных), на это изменение макрос должен среагировать и начать заполнять диапазон G27;G128. Но макрос не должен реагировать, когда он сам же вносит изменения в G27;G128, а должен продолжать заполнять этот диапазон. |
28.09.2011, 17:56 | #4 |
Форумчанин
Регистрация: 14.05.2009
Сообщений: 311
|
Код:
|
28.09.2011, 18:09 | #5 |
Старожил
Регистрация: 11.05.2010
Сообщений: 5,166
|
Если по F9 - то это Private Sub Worksheet_Calculate()
Изменений на листе не будет, т.к. формулы не изменятся. Но значения возможно будут другими. Можно сделать так - первоначально взять подконтрольный диапазон в Public массив, при пересчёте сравнивать текущий массив с запомненным. Если не совпадают - значит изменились, нужно действовать.
webmoney: E265281470651 Z422237915069 R418926282008
|
29.09.2011, 11:29 | #6 |
Форумчанин
Регистрация: 01.05.2009
Сообщений: 200
|
Оргоменное всем спасибо.
Благодаря IgorGo и аналитика получился полностью рабочий код: Код:
C Worksheet_Calculate я никогда не работал, попытался тупо заменить Worksheet_Change(ByVal Target As Range) на Worksheet_Calculate(ByVal Target As Range), но возникает ошибка компиляции. Подскажите, пожалуйста, как поправить код с Change на Calculate, чтобы сохранить все проверки и условия. P.S. С Pablic массивом я тоже не знаком, потому наверное с ним разбираться придется еще дольше. Последний раз редактировалось mephist; 29.09.2011 в 11:31. Причина: Опечатка |
29.09.2011, 11:44 | #7 |
Форумчанин
Регистрация: 14.05.2009
Сообщений: 311
|
в тот же модуль вставь:
Код:
Код:
Код:
|
29.09.2011, 15:19 | #8 |
Форумчанин
Регистрация: 01.05.2009
Сообщений: 200
|
Большое-большое спасибо!
Все работает просто отлично - как раз так, как хотел. С избыточностью кода я полностью согласен, правда, в процессе мне пришлось немного менять условия. Надеюсь, измененный код избыточностью не страдает. В результате получился макрос: Код:
Код:
Последний раз редактировалось mephist; 29.09.2011 в 15:25. |
29.09.2011, 15:31 | #9 |
Старожил
Регистрация: 11.05.2010
Сообщений: 5,166
|
Я понял, что в таком варианте код по обработке этих ячеек можно было писать просто в Sub macro(), а на пересчёт прописать
Private Sub Worksheet_Calculate() macro End Sub Т.к. обработка происходит при любом пересчёте, изменилось подконтрольное или нет. Так ведь, или ошибаюсь? Без примера не удостовериться... Думаю, что сперва определить, нужно ли обрабатывать, было бы не лишним, хоть там всего 100 ячеек анализируются...
webmoney: E265281470651 Z422237915069 R418926282008
|
29.09.2011, 15:33 | #10 |
Форумчанин
Регистрация: 14.05.2009
Сообщений: 311
|
Private Sub Worksheet_Change(ByVal Target As Range) - процедура обработки события изменения на листе, но тем не менее это процедура (с параметром) и получается, что при пересчете просто вызывается процедура изменения с заведомо "правильным" target'ом.
на самом деле более читабельно было бы след.: Код:
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Форма для выбора диапазона | ikomar | Microsoft Office Excel | 2 | 30.08.2010 16:04 |
Макрос для обработки диапазона значений в цикле | as-is | Microsoft Office Excel | 5 | 08.03.2010 12:39 |
Использование функции MID для диапазона данных | NikolayGVB | Microsoft Office Excel | 2 | 14.01.2009 13:01 |
Ввод диапазона для макроса мышкой | 4yDoBuWe | Microsoft Office Excel | 5 | 01.12.2008 00:46 |
Выбор диапазона для диаграммы по дате | alexbob | Microsoft Office Excel | 1 | 27.10.2008 07:35 |