Здравствуйте! Учусь. Никак не соображу что не так. Прошерстил массу примеров - свою тупость не пробил((( Подскажите, плз. В примере: при любом изменении на листе (в оригинале выбор из сводной, но не суть) текст из ячейки I6 (желтая) ищу на другом листе. Затем значения из найденного диапазона вставляем на "родной" лист в указанное поле (тоже желтое).
Здравствуйте! Учусь. Никак не соображу что не так. Прошерстил массу примеров - свою тупость не пробил((( Подскажите, плз. В примере: при любом изменении на листе (в оригинале выбор из сводной, но не суть) текст из ячейки I6 (желтая) ищу на другом листе. Затем значения из найденного диапазона вставляем на "родной" лист в указанное поле (тоже желтое).
у тебя зацикливание получается процедурой Sheets("Форма").Range("B16:O18") = Sheets("Сбор16").Range("A" & поз_16 & ":N" & поз_16 + 2) ты вносишь изм. в лист и заново инициируешь Worksheets_Change
Модератор: Нарушение п.3 Правил форума в части тегов. Замечание.
у тебя зацикливание получается процедурой Sheets("Форма").Range("B16:O18") = Sheets("Сбор16").Range("A" & поз_16 & ":N" & поз_16 + 2) ты вносишь изм. в лист и заново инициируешь Worksheets_Change [moder]Нарушение п.3 Правил форума в части тегов. Замечание.[/moder]K-SerJC
Еще, как вариант - можно использовать переменную как флаг: возводить и снимать. Иногда так лучше чем события включать-отключать .
Dim b AsBoolean PrivateSub Worksheet_Change(ByVal Target As Range) If b ThenExitSubElse b = True
Application.ScreenUpdating = 0 OnErrorResumeNext
кл_ = Sheets("Форма").Range("I6")
поз_16 = WorksheetFunction.Match(кл_, Sheets("Сбор16").Range("A:A"), 0)
Range("B16").Resize(3, 14) = Sheets("Сбор16").Range("A" & поз_16).Resize(3, 14).Value EndSub
Забыл поставить снятие флага - правильнее так:
Dim b AsBoolean PrivateSub Worksheet_Change(ByVal Target As Range) If b Then b = False: ExitSub
b = True
Application.ScreenUpdating = 0 OnErrorResumeNext
кл_ = Sheets("Форма").Range("I6")
поз_16 = WorksheetFunction.Match(кл_, Sheets("Сбор16").Range("A:A"), 0)
Range("B16").Resize(3, 14) = Sheets("Сбор16").Range("A" & поз_16).Resize(3, 14).Value EndSub
Еще, как вариант - можно использовать переменную как флаг: возводить и снимать. Иногда так лучше чем события включать-отключать .
Dim b AsBoolean PrivateSub Worksheet_Change(ByVal Target As Range) If b ThenExitSubElse b = True
Application.ScreenUpdating = 0 OnErrorResumeNext
кл_ = Sheets("Форма").Range("I6")
поз_16 = WorksheetFunction.Match(кл_, Sheets("Сбор16").Range("A:A"), 0)
Range("B16").Resize(3, 14) = Sheets("Сбор16").Range("A" & поз_16).Resize(3, 14).Value EndSub
Забыл поставить снятие флага - правильнее так:
Dim b AsBoolean PrivateSub Worksheet_Change(ByVal Target As Range) If b Then b = False: ExitSub
b = True
Application.ScreenUpdating = 0 OnErrorResumeNext
кл_ = Sheets("Форма").Range("I6")
поз_16 = WorksheetFunction.Match(кл_, Sheets("Сбор16").Range("A:A"), 0)
Range("B16").Resize(3, 14) = Sheets("Сбор16").Range("A" & поз_16).Resize(3, 14).Value EndSub
получается, что при последующих изменениях пользователем ячеек событие Change отбивает. Т.е. где-то надо дополнительно флаг переводить в True Я правильно понимаю?
SLAVICK, прошу прощения, но при данном флаге
If b ThenExitSubElse b = True
получается, что при последующих изменениях пользователем ячеек событие Change отбивает. Т.е. где-то надо дополнительно флаг переводить в True Я правильно понимаю?devilkurs
Добавлю к написанному выше Славиком - обращение к переменной происходит только один раз, а не 2. Если это один раз, то разница во времени ничтожна, а вот если в большом цикле ...
Добавлю к написанному выше Славиком - обращение к переменной происходит только один раз, а не 2. Если это один раз, то разница во времени ничтожна, а вот если в большом цикле ..._Boroda_
И, к слову сказать, если не использовать сводную, то работает и без
Это необходимо для ускорения работы макроса, т.к. при вставке на лист значений повторно инициируется выполнение события Change. Отключив реакцию событий Change выполняется один раз. А про сводную к сожалению не могу подсказать ничего.
И, к слову сказать, если не использовать сводную, то работает и без
Это необходимо для ускорения работы макроса, т.к. при вставке на лист значений повторно инициируется выполнение события Change. Отключив реакцию событий Change выполняется один раз. А про сводную к сожалению не могу подсказать ничего.devilkurs
Нет, видимо глюк такой. Сама засела за поиск информации, интересно же))
Экспериментирую с макросом без возврата обновления экрана: отфильтровала сводную - все зависло. Перехожу в редактор VBA, в immediate пишу ?Application.ScreenUpdating, нажимаю enter, выдает False, после чего, обновление само включается и при следующем запросе в immediate, оно уже True... Непонятненько
Нет, видимо глюк такой. Сама засела за поиск информации, интересно же))
Экспериментирую с макросом без возврата обновления экрана: отфильтровала сводную - все зависло. Перехожу в редактор VBA, в immediate пишу ?Application.ScreenUpdating, нажимаю enter, выдает False, после чего, обновление само включается и при следующем запросе в immediate, оно уже True... Непонятненько Manyasha
зы ну так макрос - то отрабатывает. Просто экран не включается обратно - у мну так часто бывает при отладке кода. Забыл включить экран обратно - получи такой эффект. Поэтому я сделал себе на панели закладок кнопку для включения всех опций обратно. и если такое случилось то делаю следующее: Win D (чтобы свернуть все окна и показать раб. стол) Потом кликаю мышем по экселю. Потом нажимаю кнопку запуска макроса . Ну или второй вариант - как Марина сделала написать в редакторе новый макрос(или найти уже готовый)
Application.ScreenUpdating = 1
и запустить его. Но 1-й способ быстрее и удобнее.
зы ну так макрос - то отрабатывает. Просто экран не включается обратно - у мну так часто бывает при отладке кода. Забыл включить экран обратно - получи такой эффект. Поэтому я сделал себе на панели закладок кнопку для включения всех опций обратно. и если такое случилось то делаю следующее: Win D (чтобы свернуть все окна и показать раб. стол) Потом кликаю мышем по экселю. Потом нажимаю кнопку запуска макроса . Ну или второй вариант - как Марина сделала написать в редакторе новый макрос(или найти уже готовый)
Application.ScreenUpdating = 1
и запустить его. Но 1-й способ быстрее и удобнее. SLAVICK