Здравствуйте! Учусь. Никак не соображу что не так. Прошерстил массу примеров - свою тупость не пробил((( Подскажите, плз. В примере: при любом изменении на листе (в оригинале выбор из сводной, но не суть) текст из ячейки I6 (желтая) ищу на другом листе. Затем значения из найденного диапазона вставляем на "родной" лист в указанное поле (тоже желтое). [vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) Application.ScreenUpdating = 0 On Error Resume Next кл_ = Sheets("Форма").Range("I6") поз_16 = WorksheetFunction.Match(кл_, Sheets("Сбор16").Range("A:A"), 0) Sheets("Форма").Range("B16:O18") = Sheets("Сбор16").Range("A" & поз_16 & ":N" & поз_16 + 2) End Sub
[/vba]
Здравствуйте! Учусь. Никак не соображу что не так. Прошерстил массу примеров - свою тупость не пробил((( Подскажите, плз. В примере: при любом изменении на листе (в оригинале выбор из сводной, но не суть) текст из ячейки I6 (желтая) ищу на другом листе. Затем значения из найденного диапазона вставляем на "родной" лист в указанное поле (тоже желтое). [vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) Application.ScreenUpdating = 0 On Error Resume Next кл_ = Sheets("Форма").Range("I6") поз_16 = WorksheetFunction.Match(кл_, Sheets("Сбор16").Range("A:A"), 0) Sheets("Форма").Range("B16:O18") = Sheets("Сбор16").Range("A" & поз_16 & ":N" & поз_16 + 2) End Sub
у тебя зацикливание получается процедурой Sheets("Форма").Range("B16:O18") = Sheets("Сбор16").Range("A" & поз_16 & ":N" & поз_16 + 2) ты вносишь изм. в лист и заново инициируешь Worksheets_Change [moder]Нарушение п.3 Правил форума в части тегов. Замечание.[/moder]
у тебя зацикливание получается процедурой Sheets("Форма").Range("B16:O18") = Sheets("Сбор16").Range("A" & поз_16 & ":N" & поз_16 + 2) ты вносишь изм. в лист и заново инициируешь Worksheets_Change [moder]Нарушение п.3 Правил форума в части тегов. Замечание.[/moder]K-SerJC
Private Sub Worksheet_Change(ByVal Target As Range) Application.ScreenUpdating = False On Error Resume Next кл_ = Sheets("Форма").Range("I6").Value поз_16 = WorksheetFunction.Match(кл_, Sheets("Сбор16").Range("A:A"), 0) Application.EnableEvents = False'отключить реакцию на Change на момент вставки значений на лист самим же Change Sheets("Форма").Range("B16:O18").Value = Sheets("Сбор16").Range("A" & поз_16 & ":N" & поз_16 + 2).Value Application.EnableEvents = True Application.ScreenUpdating = True End Sub
[/vba]
[p.s.] пока отвечал уже дали ответы ))))
pabchek, добрый день
[vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) Application.ScreenUpdating = False On Error Resume Next кл_ = Sheets("Форма").Range("I6").Value поз_16 = WorksheetFunction.Match(кл_, Sheets("Сбор16").Range("A:A"), 0) Application.EnableEvents = False'отключить реакцию на Change на момент вставки значений на лист самим же Change Sheets("Форма").Range("B16:O18").Value = Sheets("Сбор16").Range("A" & поз_16 & ":N" & поз_16 + 2).Value Application.EnableEvents = True Application.ScreenUpdating = True End Sub
Еще, как вариант - можно использовать переменную как флаг: возводить и снимать. Иногда так лучше чем события включать-отключать . [vba]
Код
Dim b As Boolean Private Sub Worksheet_Change(ByVal Target As Range) If b Then Exit Sub Else b = True Application.ScreenUpdating = 0 On Error Resume Next кл_ = 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 End Sub
[/vba] Забыл поставить снятие флага - правильнее так: [vba]
Код
Dim b As Boolean Private Sub Worksheet_Change(ByVal Target As Range) If b Then b = False: Exit Sub b = True Application.ScreenUpdating = 0 On Error Resume Next кл_ = 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 End Sub
[/vba]
Еще, как вариант - можно использовать переменную как флаг: возводить и снимать. Иногда так лучше чем события включать-отключать . [vba]
Код
Dim b As Boolean Private Sub Worksheet_Change(ByVal Target As Range) If b Then Exit Sub Else b = True Application.ScreenUpdating = 0 On Error Resume Next кл_ = 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 End Sub
[/vba] Забыл поставить снятие флага - правильнее так: [vba]
Код
Dim b As Boolean Private Sub Worksheet_Change(ByVal Target As Range) If b Then b = False: Exit Sub b = True Application.ScreenUpdating = 0 On Error Resume Next кл_ = 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 End Sub
SLAVICK, прошу прощения, но при данном флаге [vba]
Код
If b Then Exit Sub Else b = True
[/vba] получается, что при последующих изменениях пользователем ячеек событие Change отбивает. Т.е. где-то надо дополнительно флаг переводить в True Я правильно понимаю?
SLAVICK, прошу прощения, но при данном флаге [vba]
Код
If b Then Exit Sub Else b = True
[/vba] получается, что при последующих изменениях пользователем ячеек событие 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 (чтобы свернуть все окна и показать раб. стол) Потом кликаю мышем по экселю. Потом нажимаю кнопку запуска макроса . Ну или второй вариант - как Марина сделала написать в редакторе новый макрос(или найти уже готовый) [vba]
Код
Application.ScreenUpdating = 1
[/vba] и запустить его. Но 1-й способ быстрее и удобнее.
зы ну так макрос - то отрабатывает. Просто экран не включается обратно - у мну так часто бывает при отладке кода. Забыл включить экран обратно - получи такой эффект. Поэтому я сделал себе на панели закладок кнопку для включения всех опций обратно. и если такое случилось то делаю следующее: Win D (чтобы свернуть все окна и показать раб. стол) Потом кликаю мышем по экселю. Потом нажимаю кнопку запуска макроса . Ну или второй вариант - как Марина сделала написать в редакторе новый макрос(или найти уже готовый) [vba]
Код
Application.ScreenUpdating = 1
[/vba] и запустить его. Но 1-й способ быстрее и удобнее. SLAVICK