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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.10.2015, 13:24   #1
aligerno
 
Регистрация: 08.10.2015
Сообщений: 5
По умолчанию Программное прерывание вывода данных по DDE в Excel

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

Поясню - похожий процесс можно наблюдать когда пытаешься редактировать данный лист ( куда выводятся данные по DDE) - тогда вывод данных по DDE приостанавливается до тех пор пока будет закончено редактирование листа. Или еще - нажимаешь правой клавишей мыши на любую ячейку данного листа - вывод приостанавливается тоже, отпускаешь - вывод данных продолжен...Конечно можно, наверно, сделать эмуляцию этих действий в программном коде но это на мой взгляд достаточно неэффективно и опять таки не очень быстро.
Хотелось бы узнать более краткий и эффективный метод такого прерывания..
aligerno вне форума Ответить с цитированием
Старый 08.10.2015, 16:16   #2
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,858
По умолчанию

самый простой способ - отобразить userform (в модальном режиме),
при запуске которой в коде формы запустится таймер,
который подождет несколько секунд, и закроет форму.

эта форма должна блокировать Excel также, как и редактирование ячейки

или еще проще:
Код:
msgbox "Нажмите OK для продолжения"
EducatedFool вне форума Ответить с цитированием
Старый 08.10.2015, 16:56   #3
aligerno
 
Регистрация: 08.10.2015
Сообщений: 5
По умолчанию

Мне нужно прерывание ровно на время работы кода. Т.е. в начале работы кода нужно прервать вывод DDE данных а в конце - возобновить...Код работает миллисекунды. Поэтому увы - это не подойдет...
aligerno вне форума Ответить с цитированием
Старый 09.10.2015, 15:04   #4
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,858
По умолчанию

свой код переносите в модальную форму
вместо запуска кода выполняете запуск формы
форма при запуске запустит код
код, когда отработает, закроет форму - данные снова начнут поступать

буквально 4-5 строк кода надо дополнительно + пустая форма
EducatedFool вне форума Ответить с цитированием
Старый 10.10.2015, 22:39   #5
aligerno
 
Регистрация: 08.10.2015
Сообщений: 5
По умолчанию

EducatedFool я понял смысл этой конструкции - спасибо за идею. Но столкнулся с такой проблемой: когда я использую готовую форму msgbox - Например:
msgbox "Нажмите OK для продолжения"
то она действительно блокирует вывод 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?
На всякий случай - у меня MS Office 2007...

Последний раз редактировалось aligerno; 10.10.2015 в 23:45.
aligerno вне форума Ответить с цитированием
Старый 12.10.2015, 23:12   #6
aligerno
 
Регистрация: 08.10.2015
Сообщений: 5
По умолчанию

EducatedFool, можете подсказать с учетом того что я сказал выше?
aligerno вне форума Ответить с цитированием
Старый 13.10.2015, 07:16   #7
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,858
По умолчанию

Я не смогу подсказать, - идей больше нет (как нет и опыта работы с DDE)
Может, кто из форумчан еще чего посоветует
EducatedFool вне форума Ответить с цитированием
Старый 13.10.2015, 23:00   #8
aligerno
 
Регистрация: 08.10.2015
Сообщений: 5
По умолчанию

В любом случае - Спасибо за идею! Будем искать дальше...
aligerno вне форума Ответить с цитированием
Старый 14.10.2015, 06:07   #9
Virtuallab
Пользователь
 
Регистрация: 03.08.2012
Сообщений: 38
По умолчанию

Посмотри http://www.cyberforum.ru/vba/thread1111656.html
и ещё у Казанского (с) был свой Msgboxex
Virtuallab вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
В ответ на DDE запрос приходит идентификатор данных Sauber Общие вопросы Delphi 1 13.11.2013 12:12
DDE клиент, нет соединения с DDE сервером на XE2XE2 nfo52 Общие вопросы Delphi 0 19.08.2012 09:17
Передача по DDE данных AlexZZZ2010 Общие вопросы .NET 0 20.12.2010 13:00
VBA,Excel,DDE Евгений_12 Microsoft Office Excel 0 24.05.2010 15:22
Прием данных по DDE chigik Microsoft Office Excel 3 13.05.2009 10:47