Страница 1 из 1

про Excel

Добавлено: 04 сен 2009, 18:00
vg
На спредшите есть одна единственная формула (от Bloomberg Add-in)
=BDP("MSFXCAD Index", "PX_LAST"). Если запустить Excel, то это хозяйство соединяется с Bloomber терминалом и по инет получает одно число. Может занять 10-20 секунд, пока значение формулы будет получено. Надо сделать следующее:

1) запустить Excel из командного файла (например, start excel myfile.xls /e)
2) Excel должен получить данные (обновить значение формулы), записать это значение в текстовый файл (типа, "2009-09-04", "1.1094").
3) автоматически закрыться.

Сделал так:

WorkBook_On_Open :
1) Проверяем пока значение в ячейке с формулой <> "#N/A ...."
2) Пишем в файл значение ячейки с формулой
3) Application.Quit

Результат - не работает. В файле постоянно "#N/A ...." вместо данных.
Такое ощущение, что пока исполняется код WorkBook_On_Open, обновление формул блокировано. Значение (вместо "#N/A ...." ) получается только по выходу из WorkBook_On_Open. Если же прямо из WorkBook_On_Open вызвать Application.Quit, то в файле оказывается "#N/A ...." .

Как быть?

Re: про Excel

Добавлено: 04 сен 2009, 18:33
ura
Скорее всего все события и формулы еще не активизированы в этот момент.
Есть также Activate event для worksheet, но поскольку Excel работает как STA (single thread) я думаю тоже ничего не получится. Но, можно попытаться активизировать таймер средствами VBA, и на нем уже проверять значение.

Re: про Excel

Добавлено: 04 сен 2009, 19:18
vg
ura писал(а):Скорее всего все события и формулы еще не активизированы в этот момент.
Есть также Activate event для worksheet, ... я думаю тоже ничего не получится.
Пробовал. Тоже самое. Т.е. надо сделать как-то так, чтобы Excel открылся, повисел, пока не получит данные, затем хорошо было бы какой-то On_... зацепить (типа эвента на завершение обновления флрмул), чтобы оттуда написать в файл и позвать Quit.
ura писал(а): Но, можно попытаться активизировать таймер средствами VBA, и на нем уже проверять значение.
Может быть хорошей идеей. Будет прикольно если получится.

Re: про Excel

Добавлено: 04 сен 2009, 20:41
AlexANB
vg писал(а):Результат - не работает. В файле постоянно "#N/A ...." вместо данных.
Такое ощущение, что пока исполняется код WorkBook_On_Open, обновление формул блокировано.
Совершенно верно. Пока исполняется VBA код, пересчет самой таблицы и формул в ней даже не начинается. Или то, или другое, одновременно они не работают.

Можно в код VBA этой страницы включить пустую функцию:

Public Sub Worksheet_Calculate()
On Error Resume Next
End Sub

В этом случае при любом изменении состояния любой клетки с формулой пересчет таблицы состоится. Но думаю, все равно потребуется крутиться в цикле с проверками, пока результат не будет получен.

Re: про Excel

Добавлено: 05 сен 2009, 07:05
vg
AlexANB писал(а):
vg писал(а):Результат - не работает. В файле постоянно "#N/A ...." вместо данных.
Такое ощущение, что пока исполняется код WorkBook_On_Open, обновление формул блокировано.
Совершенно верно. Пока исполняется VBA код, пересчет самой таблицы и формул в ней даже не начинается. Или то, или другое, одновременно они не работают.

Можно в код VBA этой страницы включить пустую функцию:

Public Sub Worksheet_Calculate()
On Error Resume Next
End Sub

В этом случае при любом изменении состояния любой клетки с формулой пересчет таблицы состоится. Но думаю, все равно потребуется крутиться в цикле с проверками, пока результат не будет получен.
Клёво. Надо попробовать во вторник. Если этот "колбяк" срабатывает на каждое обновление ячейки, то можно проверять один раз, и если результат число - записывать в файл и звать Quit. Спасибо.

Re: про Excel

Добавлено: 05 сен 2009, 11:04
vg
Вот ещё вроде есть такое Application OnTime (http://msdn.microsoft.com/en-us/library/bb223501.aspx) & event AfterCalculate.

Прошу прощения за бывший глупый вопрос. Попробую это + то, что ты написал (не знаю, что будет проще. Может и твоё.)

Public Sub Worksheet_Calculate()
On Error Resume Next
End Sub

Re: про Excel

Добавлено: 05 сен 2009, 17:21
ura
Там кстати кажется есть event на простое изменение содержимого любой ячейки.
Т.е. по идее он должен сработать, если это не та ячейка которая мониторится, то жди себе дальше...

Re: про Excel

Добавлено: 08 сен 2009, 16:04
vg
Сделал с использованием event AfterCalculate.
Спасибо всем!