Estilla писал(а):Да если бы было так
Мне отсюда трудно судить так или не так, тем более не видя файла. Т.ч. ничего другого не остается как верить тебе на слово
Estilla писал(а):А в примере на который указал Pavel55 вообще не используется остановка OnTime посредством Schedule:=False, однако пашет.
Так там и не нужно, там механизм другой.
Ты пойми следуещее:
1.) метод OnTime сам по себе никогда не повторяется, а всегда запускает разовый процесс, который, выстрелив один раз умирает навеки.
2.) параметр Schedule:=False убивает только уже запущенный, но еще не выстреливший процесс. Выстрелившему уже ничего не надо
3.) эффект повторяемости достигается не через OnTime как таковой, а через конструкцию макроса, который через опр. промежуток времени (устанавленный последним OnTime)
вызовет сам себя и OnTime запустится опять - т.е. цепная реакция, переходящая в бесконеечный цикл (infinite loop).
4.) при каждом запуске процедур
pStartCheckPrice и
ready текущее значение переменной
dTime стирается и присваивается новое
5.) процедуры
pStartCheckPrice и
ready запускаются не только видимо (т.е. нажатием твоей кнопки или событием Workbook_Open), но и невидимо - самим OnTime
6.) и так будет продолжаться пока не произойдет одно из трех:
- последний запущенный, но не выстреливший OnTime отменится с пом. Schedule:=False (принцип кода, который, в сильно измененном виде, пытаешься использовать ты)
- выстреливаемый самим OnTime макрос по какой-то причине возмет да и не запустит OnTime снова (см. условие
If gate Then... в коде указанном Pavel55)
- Excel будет форсированно (через ошибку) закрыт
7.) теперь сам представь: что если ты, сам того не ведая, каждый раз запускаешь новый... нет не OnTime, а хуже - замкнутый цикл процедуры
pStartCheckPrice, которая уже не требует твоей помощи, но и не подчиняется тебе, так как ты потерял от нее ключи, не имея возможности знать с каким значением переменной
dTime был запущен текущий OnTime. И каждый раз, упустив этот, ты будешь запускать новый бесконечный цикл, а твоя процедура
pStopCheckPrice будет стрелять по воробьям.
8.) но это еще не все. А что если и с процедурой
ready происходит тоже самое?
Исходя из вышесказанного, ищи решение не в OnTime или DDE, а в организации процесса работы твоей программы. Я на 99.99% уверен в том, что, как я указывал в моем первом сообщении, две разные процедуры, использующие OnTime, обслуживаются одной и той же глобальной переменной, которую они вместе и поврозь модифицируют. Ищи утечку в процессе - твоя задача своевременно перекрыть кислород еще не выстрелившему OnTime пока переменная dTime не была изменена другим процессом. Или используй метод указанный Pavel55.