Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Страницы: 1
RSS
Программное прерывание вывода данных по DDE в Excel
 
Добрый день,

У меня в Excel ( на лист рабочей книги) выводятся данные по DDE из таблицы биржевого терминала QUIK...Далее я это все обрабатываю с помощью кода написанного на VBA. Программный код инициализируется с помощью стандартной процедуры - Worksheet_Calculate().
На время обработки кода есть необходимость программным образом приостановить на короткое время вывод данных по DDE а потом опять запустить т.е. чтобы данные на какое время не выводились на лист. Т.е. какое время DDE сервер будет накапливать эти данные в буфере ( не теряя) до тех пор пока вывод не будет разрешен опять.Не подскажете каким образом это можно сделать включив определенную команду или метод в программный код VBA?

Поясню - похожий процесс можно наблюдать когда пытаешься редактировать данный лист ( куда выводятся данные по DDE) - тогда вывод данных по DDE приостанавливается до тех пор пока будет закончено редактирование листа. Или еще - нажимаешь правой клавишей мыши на любую ячейку данного листа - вывод приостанавливается тоже, отпускаешь - вывод данных продолжен...Конечно можно, наверно, сделать эмуляцию этих действий в программном коде но это на мой взгляд достаточно неэффективно и опять таки не очень быстро.
Хотелось бы узнать более краткий и эффективный метод такого прерывания..
 
Может так?
Код
Application.Wait Time:=Now + TimeSerial(0, 0, 10)
 
Тогда будет приостанавливаться работа всего приложения в т.ч. самого макроса. Мне же необходимо чтобы код выполнялся а вывод DDE приостанавливался на время..
 
Такой вариант не пойдет? (Выключает пересчет и через 30 сек включает)

Код
Aapplication.Calculation=xlCalculationManual
myTime = Now + TimeValue("00:00:30")
Application.OnTime myTime, "myTimerCount"
 
Sub myTimerCount()
     Application.Calculation=xlCalculationAutomatic
End Sub
Изменено: Watcher_1 - 8 Окт 2015 13:26:09
 
Watcher_1, 30 секунд много,квик может  отключит выдачу по dde,если только в настройках увеличить время на выдачу одной строки
aligerno,какую таблицу вы экспортируете?  Можно и данные потерять.
 
Да спасибо за идею - выключать пересчет....Единственно мне надо выключать пересчет перед работой макроса а потом в конце работы его включать...Задержка на определенное время здесь мне не нужна.  
 
Макрос работает миллисекунды...В буфере DDE должны сохранится данные...Экспортируется таблица сделок в онлайне.
 
Значит вначале макроса поставите
Aapplication.Calculation=xlCalculationManual
а в конце макроса это
Application.Calculation=xlCalculationAutomatic
 
Спасибо Watcher_1 - наверно вы правы. А как вы думаете стоит ли выключать и включать еще - Application.ScreenUpdating = False ( в начале) и Application.ScreenUpdating = True ( в конце) . Или это необязательно?
 
Если макрос изменяет ячейки, то для убыстрения работы нужно!
Изменено: Watcher_1 - 8 Окт 2015 17:11:47
 
Увы, к сожалению, метод Aapplication.Calculation=xlCalculationManual  и Application.Calculation=xlCalculationAutomatic  не дает возможность приостанавливать экспорт данных по DDE - проверил. Приостанавливается только пересчет внутри ячеек с ф-лами...
 
Интересный факт - диалоговая форма Msgbox блокирует вывод DDE данных на лист пока ее не закроешь вручную....Когда же я использую собственную USERFORM то такого не происходит, хотя по умолчанию она работает в модальном режиме.
Для проверки этого я использовал такой вариант:

Основной код:

Sub Макрос1()

UserForm1.Show

End Sub

Внутри самой пустой формы код такой:


Private Sub UserForm_Activate()

Application.OnTime Now + TimeValue("00:00:10"), "myTimerCount"

End Sub


В которой вызывается процедура закрытия самой формы через 10 секунд:


Sub myTimerCount()

Unload UserForm1

End Sub



Т.е. я вызываю USERFORM на 10 секунд а потом ее закрываю. Все работает но поток DDE данных не блокируется в отличии от диалоговой формы Msgbox, которая действительно это делает НО ее необходимо закрывать вручную ( по крайней мере программного способа я не знаю).
Как наделить собственную USERFORM необходимой модальностью на уровне приложения чтобы она блокировала поток данных DDE подобно MsgBox?
Изменено: aligerno - 13 Окт 2015 22:55:33
 
Может у кого-то есть необходимые знания на этот счет?
Страницы: 1
Читают тему (гостей: 1)
Наверх