Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 31.03.2012, 14:01   #1
strannick
Форумчанин
 
Регистрация: 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

Второй код не совсем доработан, но дело не в этом. По отдельности все срабатывает. Но когда на первом листе в отслеживаемый диапазон вводится значение, приводящее к событию на втором листе, то с первого листа все срабатывает (письмо уходит), а со второго никакой реакции вообще. Дело в одновременности?
Заранее спасибо.
strannick вне форума Ответить с цитированием
Старый 31.03.2012, 14:43   #2
doober
Старожил
 
Аватар для doober
 
Регистрация: 02.05.2009
Сообщений: 3,907
По умолчанию

Толком ничего не понял,вы листы на круг запустили?
Как вариант создавайте временную задержку ,ставте регулировщика.
пару лет назад было нечто подобное.
Решение-задержка между этапами порядка 100 милисекунд,тогда помогло.
Анализ,обработка данных Недорого
doober вне форума Ответить с цитированием
Старый 31.03.2012, 15:03   #3
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Не понимаю - на второй лист(если это "PostBest") данные пишутся в Range("B4") и Range("B12"), а проверяете Range("K2:K500"). Вроде всё правильно - зачем срабатывать?
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 31.03.2012, 16:20   #4
strannick
Форумчанин
 
Регистрация: 21.10.2011
Сообщений: 433
По умолчанию

Цитата:
Сообщение от doober Посмотреть сообщение
Толком ничего не понял,вы листы на круг запустили?
Как вариант создавайте временную задержку ,ставте регулировщика.
пару лет назад было нечто подобное.
Решение-задержка между этапами порядка 100 милисекунд,тогда помогло.
Понял, что без примера не понятно. Не по кругу. Просто одновременно получается два события на двух разных листах, которые запускают два разных макроса. Пример приложил, на первом листе написал примечание. Первое событие по первому листу - макрос срабатывает. А по третьему листу на "close" - макрос не срабатывает. Даже не переносит значение в ячейку А1.
Вложения
Тип файла: rar zakaz.rar (104.7 Кб, 20 просмотров)
strannick вне форума Ответить с цитированием
Старый 31.03.2012, 17:48   #5
doober
Старожил
 
Аватар для doober
 
Регистрация: 02.05.2009
Сообщений: 3,907
По умолчанию

Все верно работает,согласно коду в процедурах.
С какого будет срабатывать событие на листе Basisauftrage(в нем находится по вашим словам не срабатывающий макрос),если вы данные меняете на листе PostBest
Вы где то ошиблись в листах.или не там событие ловите
Анализ,обработка данных Недорого
doober вне форума Ответить с цитированием
Старый 31.03.2012, 18:43   #6
strannick
Форумчанин
 
Регистрация: 21.10.2011
Сообщений: 433
По умолчанию

Цитата:
Сообщение от doober Посмотреть сообщение
Все верно работает,согласно коду в процедурах.
С какого будет срабатывать событие на листе Basisauftrage(в нем находится по вашим словам не срабатывающий макрос),если вы данные меняете на листе PostBest
Вы где то ошиблись в листах.или не там событие ловите
На Листе Basisauftrage в диапазоне К2:K500 формулой меняется значение с "open" на "close" если на первом листе в диапазон ввести N3:N500 ввести значение, позволяющее этой формуле сработать. Но получается, что при изменении диапазона N3:N500 на первом листе срабатывает макрос по отсылке письма с листа PostBest (он срабатывает нормально). Код модуле первого листа:

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. Первое - нормально, второе - ноль реакции, как будто изменений не произошло.
Может я чего-то перемудрил?
strannick вне форума Ответить с цитированием
Старый 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
strannick
Форумчанин
 
Регистрация: 21.10.2011
Сообщений: 433
По умолчанию

Цитата:
Сообщение от Казанский Посмотреть сообщение
Событие Worksheet_Change возникает только при изменении ячеек вручную (или макросом), при пересчете формул оно не возникает.
При пересчете формул возникает событие Worksheet_Calculate.
Точно, блин. Это я мазанул. Щас буду ваять.
strannick вне форума Ответить с цитированием
Старый 02.04.2012, 17:51   #9
strannick
Форумчанин
 
Регистрация: 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

Я чего-то не дообъявил? Или наоборот?
strannick вне форума Ответить с цитированием
Старый 02.04.2012, 18:11   #10
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

У Worksheet_Calculate нет Target!
Анализируйте значения конкретно нужных ячеек.
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Два одномерных массива 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