про Excel

Все, что вы хотели знать о программизме, но боялись спросить.
Ответить
vg
Маньяк
Сообщения: 2803
Зарегистрирован: 29 май 2003, 22:29
Откуда: Магадан - Миссиссага

про Excel

Сообщение 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 ...." .

Как быть?
ura
Житель
Сообщения: 915
Зарегистрирован: 09 мар 2003, 22:46

Re: про Excel

Сообщение ura »

Скорее всего все события и формулы еще не активизированы в этот момент.
Есть также Activate event для worksheet, но поскольку Excel работает как STA (single thread) я думаю тоже ничего не получится. Но, можно попытаться активизировать таймер средствами VBA, и на нем уже проверять значение.
vg
Маньяк
Сообщения: 2803
Зарегистрирован: 29 май 2003, 22:29
Откуда: Магадан - Миссиссага

Re: про Excel

Сообщение vg »

ura писал(а):Скорее всего все события и формулы еще не активизированы в этот момент.
Есть также Activate event для worksheet, ... я думаю тоже ничего не получится.
Пробовал. Тоже самое. Т.е. надо сделать как-то так, чтобы Excel открылся, повисел, пока не получит данные, затем хорошо было бы какой-то On_... зацепить (типа эвента на завершение обновления флрмул), чтобы оттуда написать в файл и позвать Quit.
ura писал(а): Но, можно попытаться активизировать таймер средствами VBA, и на нем уже проверять значение.
Может быть хорошей идеей. Будет прикольно если получится.
Аватара пользователя
AlexANB
Маньяк
Сообщения: 2904
Зарегистрирован: 17 фев 2003, 18:47
Откуда: Ontario

Re: про Excel

Сообщение AlexANB »

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

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

Public Sub Worksheet_Calculate()
On Error Resume Next
End Sub

В этом случае при любом изменении состояния любой клетки с формулой пересчет таблицы состоится. Но думаю, все равно потребуется крутиться в цикле с проверками, пока результат не будет получен.
vg
Маньяк
Сообщения: 2803
Зарегистрирован: 29 май 2003, 22:29
Откуда: Магадан - Миссиссага

Re: про Excel

Сообщение vg »

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

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

Public Sub Worksheet_Calculate()
On Error Resume Next
End Sub

В этом случае при любом изменении состояния любой клетки с формулой пересчет таблицы состоится. Но думаю, все равно потребуется крутиться в цикле с проверками, пока результат не будет получен.
Клёво. Надо попробовать во вторник. Если этот "колбяк" срабатывает на каждое обновление ячейки, то можно проверять один раз, и если результат число - записывать в файл и звать Quit. Спасибо.
vg
Маньяк
Сообщения: 2803
Зарегистрирован: 29 май 2003, 22:29
Откуда: Магадан - Миссиссага

Re: про Excel

Сообщение vg »

Вот ещё вроде есть такое Application OnTime (http://msdn.microsoft.com/en-us/library/bb223501.aspx) & event AfterCalculate.

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

Public Sub Worksheet_Calculate()
On Error Resume Next
End Sub
ura
Житель
Сообщения: 915
Зарегистрирован: 09 мар 2003, 22:46

Re: про Excel

Сообщение ura »

Там кстати кажется есть event на простое изменение содержимого любой ячейки.
Т.е. по идее он должен сработать, если это не та ячейка которая мониторится, то жди себе дальше...
vg
Маньяк
Сообщения: 2803
Зарегистрирован: 29 май 2003, 22:29
Откуда: Магадан - Миссиссага

Re: про Excel

Сообщение vg »

Сделал с использованием event AfterCalculate.
Спасибо всем!
Ответить