|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
31.03.2012, 14:01 | #1 |
Форумчанин
Регистрация: 21.10.2011
Сообщений: 433
|
Два листа - два события, одновременность срабатывания двух макросов
Добрый день, уважаемые форумчане!
Тут вот с чем столкнулся. Есть два разных листа. В модуле первого листа код отслеживает изменения по диапазону N3:N500 Private Sub Worksheet_Change(ByVal Target As Range) Application.ScreenUpdating = False If Not Intersect(Target, Range("N3:N500")) Is Nothing Then If Target > 0 Then Sheets("PostBest").Range("B4") = Cells(Target.Row, 3) Sheets("PostBest").Range("B12") = Cells(Target.Row, 2) Sheets("PostBest").Select Call SendmailTheBatBest End If End If Application.ScreenUpdating = True End Sub В модуле другого листа код отслеживает события по диапазону K2:K500 Private Sub Worksheet_Change(ByVal Target As Range) Application.ScreenUpdating = False If Not Intersect(Target, Range("K2:K500")) Is Nothing Then If Target = "close" Then Sheets("PostGrup").Range("A1") = Cells(Target.Row, 2) Sheets("PostGrup").Select Columns("B:B").Select Selection.Copy Columns("C:C").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Application.CutCopyMode = False ActiveSheet.Range("$C$1:$C$34").Rem oveDuplicates Columns:=1, Header:=xlNo Call SendmailTheBatGrup End If End If Application.ScreenUpdating = True End Sub Второй код не совсем доработан, но дело не в этом. По отдельности все срабатывает. Но когда на первом листе в отслеживаемый диапазон вводится значение, приводящее к событию на втором листе, то с первого листа все срабатывает (письмо уходит), а со второго никакой реакции вообще. Дело в одновременности? Заранее спасибо. |
31.03.2012, 14:43 | #2 |
Старожил
Регистрация: 02.05.2009
Сообщений: 3,907
|
Толком ничего не понял,вы листы на круг запустили?
Как вариант создавайте временную задержку ,ставте регулировщика. пару лет назад было нечто подобное. Решение-задержка между этапами порядка 100 милисекунд,тогда помогло.
Анализ,обработка данных Недорого
|
31.03.2012, 15:03 | #3 |
Старожил
Регистрация: 11.05.2010
Сообщений: 5,166
|
Не понимаю - на второй лист(если это "PostBest") данные пишутся в Range("B4") и Range("B12"), а проверяете Range("K2:K500"). Вроде всё правильно - зачем срабатывать?
webmoney: E265281470651 Z422237915069 R418926282008
|
31.03.2012, 16:20 | #4 |
Форумчанин
Регистрация: 21.10.2011
Сообщений: 433
|
Понял, что без примера не понятно. Не по кругу. Просто одновременно получается два события на двух разных листах, которые запускают два разных макроса. Пример приложил, на первом листе написал примечание. Первое событие по первому листу - макрос срабатывает. А по третьему листу на "close" - макрос не срабатывает. Даже не переносит значение в ячейку А1.
|
31.03.2012, 17:48 | #5 |
Старожил
Регистрация: 02.05.2009
Сообщений: 3,907
|
Все верно работает,согласно коду в процедурах.
С какого будет срабатывать событие на листе Basisauftrage(в нем находится по вашим словам не срабатывающий макрос),если вы данные меняете на листе PostBest Вы где то ошиблись в листах.или не там событие ловите
Анализ,обработка данных Недорого
|
31.03.2012, 18:43 | #6 | |
Форумчанин
Регистрация: 21.10.2011
Сообщений: 433
|
Цитата:
Private Sub Worksheet_Change(ByVal Target As Range) Application.ScreenUpdating = False If Not Intersect(Target, Range("N3:N500")) Is Nothing Then If Target > 0 Then Sheets("PostBest").Range("B4") = Cells(Target.Row, 3) Sheets("PostBest").Range("B12") = Cells(Target.Row, 2) Sheets("PostBest").Select Call SendmailTheBatBest End If End If Application.ScreenUpdating = True End Sub Тут все в порядке. Но когда в этот диапазон вводится такое значение, которое на листе Basisauftrage в диапазоне К2:К500 меняет значение с "open" на "close", должен также сработать макрос по отсылке письма с листа PostGrup. Код в модуле листа Basisauftrage: Private Sub Worksheet_Change(ByVal Target As Range) Application.ScreenUpdating = False If Not Intersect(Target, Range("K2:K500")) Is Nothing Then If Target = "close" Then Sheets("PostGrup").Range("A1") = Cells(Target.Row, 2) Sheets("PostGrup").Select Columns("B:B").Select Selection.Copy Columns("C:C").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Application.CutCopyMode = False ActiveSheet.Range("$C$1:$C$34").Rem oveDuplicates Columns:=1, Header:=xlNo Call SendmailTheBatGrup End If End If Application.ScreenUpdating = True End Sub Сам код просто еще не доработан, но даже не срабатывает строка Sheets("PostGrup").Range("A1") = Cells(Target.Row, 2) Если взять и вручную поменять на листе Basisauftrage с "open" на "close", то срабатывает. А если меняется по формуле - то не срабатывает. Я вот на этом остановился. Получается, два события происходят одновременно при внесении значения вручную в диапазон N3:N500 на первом листе и изменение по формуле значения ячеек диапазона К2:К500 на листе Basisauftrage. Первое - нормально, второе - ноль реакции, как будто изменений не произошло. Может я чего-то перемудрил? |
|
31.03.2012, 22:40 | #7 |
Старожил
Регистрация: 31.12.2010
Сообщений: 2,133
|
Событие Worksheet_Change возникает только при изменении ячеек вручную (или макросом), при пересчете формул оно не возникает.
При пересчете формул возникает событие Worksheet_Calculate.
exceleved@yandex.ru Яндекс.Деньги: 410011500007619
|
01.04.2012, 14:44 | #8 |
Форумчанин
Регистрация: 21.10.2011
Сообщений: 433
|
|
02.04.2012, 17:51 | #9 |
Форумчанин
Регистрация: 21.10.2011
Сообщений: 433
|
Чего-то я не то ваяю. Честно говоря, думал по аналогии с Worksheet_Change:
Private Sub Worksheet_Calculate() 'Application.ScreenUpdating = False If Not Intersect(Target, Range("K2:K500")) Is Nothing Then If Target = "open" Is Nothing Then If Target = "close" Then Sheets("PostGrup").Range("A1") = Cells(Target.Row, 2) Call SendmailTheBatGrup End If End If 'Application.ScreenUpdating = True End Sub Я чего-то не дообъявил? Или наоборот? |
02.04.2012, 18:11 | #10 |
Старожил
Регистрация: 11.05.2010
Сообщений: 5,166
|
У Worksheet_Calculate нет Target!
Анализируйте значения конкретно нужных ячеек.
webmoney: E265281470651 Z422237915069 R418926282008
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Два одномерных массива A и B. Сформировать два новых массива. Паскаль. Где ошибка в коде? | Tomny | Помощь студентам | 1 | 27.03.2011 16:47 |
как запустить два события по onLoad? | kirosin | JavaScript, Ajax | 3 | 28.10.2010 05:32 |
в одной ячейке написать два значения с другого листа | Наркыз | Microsoft Office Excel | 6 | 11.10.2010 14:01 |
сортировать по фамилии два листа | Kotik123 | Microsoft Office Excel | 2 | 23.04.2009 18:52 |
два TMediaPlayer и два AVI-файла | zeleniy | Компоненты Delphi | 0 | 01.06.2007 14:14 |