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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.06.2011, 16:05   #1
gramp
Пользователь
 
Регистрация: 26.12.2010
Сообщений: 85
По умолчанию Как обрабатывать события с задержкой?

Прошу помочь советом, в скрипте по таймеру работает процедура и также приходят события из внешнего источника.

Вопрос 1 - если событий много, то любые манипуляции с листом приводят к прекращению работы скрипта с ошибкой. Попытка поставить DoEvents первой строкой в обработке событий ничего не меняет. Можно ли каким то образом производить манипуляции с листом, если идет обработка событий?

Вопрос 2 - если событий мало. Иногда возникает ситуация, когда по времени совпадает обработка переменной в событии и в процедуре, в результате чего переменная получает неправильное значение. Есть ли возможность в VBA Excel заставить событие обрабатываться с задержкой - только по окончанию выполнения процедуры? Этот вопрос более важен, поэтому в названии темы.

Заранее спасибо за советы.
gramp вне форума Ответить с цитированием
Старый 12.06.2011, 16:38   #2
doober
Старожил
 
Аватар для doober
 
Регистрация: 02.05.2009
Сообщений: 3,907
По умолчанию

А случайно данные не по DDE получаете?
Анализ,обработка данных Недорого
doober вне форума Ответить с цитированием
Старый 12.06.2011, 16:59   #3
gramp
Пользователь
 
Регистрация: 26.12.2010
Сообщений: 85
По умолчанию

) я не знаю, что такое dde.
Есть сторонняя библиотека, которая подключена в ексел и по ней приходит событие.
В более продвинутых языках есть понятие коллекция, которое вроде может помочь в этом вопросе, но хотелось бы на VBA притормаживать события.
gramp вне форума Ответить с цитированием
Старый 12.06.2011, 17:01   #4
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Запускайте процедуру не с задержкой, а после поступления данных.

Определить момент поступления данных на лист вам поможет событие пересчёта формулы:
http://www.programmersforum.ru/showp...86&postcount=4
EducatedFool вне форума Ответить с цитированием
Старый 12.06.2011, 17:16   #5
doober
Старожил
 
Аватар для doober
 
Регистрация: 02.05.2009
Сообщений: 3,907
По умолчанию

Я сталкивался с такой ситуацией.когда данные идут по DDE непрерывно,хотя указан интервал 1 минута.А обновляются как хотят.
Ни как не мог нормально обработать.Пришлось получать данные по DDE в программу,обрабатывать.потом на лист. Алгоритм обработки очень сложный был,сбои мешали
Пример платформа МТ5.
Анализ,обработка данных Недорого
doober вне форума Ответить с цитированием
Старый 12.06.2011, 18:34   #6
gramp
Пользователь
 
Регистрация: 26.12.2010
Сообщений: 85
По умолчанию

Вариант запускать процедуру после обработки события не подходит, ибо событие может случиться в любой момент, поэтому и возникла мысль упорядочить обработку событий через притормаживание поступившего события до момента окончания выполнения процедуры.
gramp вне форума Ответить с цитированием
Старый 12.06.2011, 18:43   #7
doober
Старожил
 
Аватар для doober
 
Регистрация: 02.05.2009
Сообщений: 3,907
По умолчанию

если разговаривать общими словами,без конкретики,то ответа скорее всего не получите
На конкретную ситуацию-свое решение
Анализ,обработка данных Недорого
doober вне форума Ответить с цитированием
Старый 12.06.2011, 20:06   #8
gramp
Пользователь
 
Регистрация: 26.12.2010
Сообщений: 85
По умолчанию

Меня бы вполне устроил общий ответ, возможно ли это сделать просто, введением какого-либо оператора, который бы притормозил событие до завершения процедуры без дополнительного сложного кода )
gramp вне форума Ответить с цитированием
Старый 12.06.2011, 20:34   #9
doober
Старожил
 
Аватар для doober
 
Регистрация: 02.05.2009
Сообщений: 3,907
По умолчанию

Вот так я ожидаю завершения работы архиватора,
но такой вариант вам может и не подойти.
Надо конкретно знать.какое событие вы ожидаете.
В VBa многопоточности нет.Пока не отработает одна процедура вторая не начнет работать.
Код:
Public Function Cont_Proc() As Boolean
Dim Process As Object
Dim Flag As Boolean
 Do
Flag = False
For Each Process In GetObject("winmgmts:").ExecQuery("Select * from Win32_Process")
  
If Process.Caption Like "7z*" Then Flag = True: Exit For
 Next
  Loop Until Flag = False
Cont_Proc = True
End Function
Анализ,обработка данных Недорого
doober вне форума Ответить с цитированием
Старый 12.06.2011, 21:36   #10
gramp
Пользователь
 
Регистрация: 26.12.2010
Сообщений: 85
По умолчанию

Спасибо за пример, но, похоже, пока писал, придумал как сделать - в событии присваивать значение не основной переменной, а промежуточной, а в начале процедуры основной переменной присваивать значение промежуточной переменной.
gramp вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как сделать временной цикл с задержкой 0,1 сек? clever77 Microsoft Office Excel 15 16.03.2016 11:36
Как обрабатывать данную ситуацию? Arkuz БД в Delphi 2 08.12.2008 02:51
Как заставить компонент TTrackBar обрабатывать события мыши? Никки Общие вопросы Delphi 5 29.08.2008 14:17
Как обрабатывать нажатие на кнопке? AidarBik Win Api 13 05.02.2008 19:58
как обрабатывать события с клавы? proglamer Паскаль, Turbo Pascal, PascalABC.NET 13 25.10.2007 11:41