Считывание данных из закрытой книги Excel

Программирование на Visual Basic for Applications
Shpux
Начинающий
Начинающий
 
Сообщения: 9
Зарегистрирован: 16.08.2007 (Чт) 5:43

Считывание данных из закрытой книги Excel

Сообщение Shpux » 16.08.2007 (Чт) 6:52

Этот вопрос уже всяко обсасывался но я так и не понял (ламер наверно) почему

Sub Пример1()
MsgBox ExecuteExcel4Macro("'D:\[Книга1.xls]" & "Лист2'!R1C1")
End Sub

работает, а

Function Пример2() As Variant
Пример2= ExecuteExcel4Macro("'D:\[Книга1.xls]Лист1'!R1C1")
End Function

не работает.

Очень надо однако.
Мне необходимо считывать данные из однотипных файлов и одинаковых ячеек, пересчитывать данные и вносить их в результирующий файл. Причем файлы-источники и их количество должны быть произвольными.

bi-lya
Обычный пользователь
Обычный пользователь
 
Сообщения: 87
Зарегистрирован: 07.08.2006 (Пн) 15:36

Сообщение bi-lya » 16.08.2007 (Чт) 8:46

Да все работает :wink:
Может быть проблема в том, что в книге нет листа с именем "Лист1"? Или что вы имеете ввиду "Не работает"?

Shpux
Начинающий
Начинающий
 
Сообщения: 9
Зарегистрирован: 16.08.2007 (Чт) 5:43

Сообщение Shpux » 16.08.2007 (Чт) 8:55

Обращаю внимание с процедурой (Sub) - РАБОТАЕТ, а с функцией (public function) - не работает

При попытке использовать эту функцию (Пример2) в ячейке рабочего листа, т.е. "=Пример2()" - выдает ЗНАЧ#

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 16.08.2007 (Чт) 10:13

Shpux

Вниматльно посмотри. В функции, у тебя другой код.
I don't understand. Sorry.

Shpux
Начинающий
Начинающий
 
Сообщения: 9
Зарегистрирован: 16.08.2007 (Чт) 5:43

Сообщение Shpux » 16.08.2007 (Чт) 10:48

RayShade
В данном случае код внутри ExecuteExcel4Macro непринципиален: это ведь просто строка, а в Книге1 существуют и Лист1 и Лист2.

Проблема в том, что некоторые (я, ессно не все проверял) команды работают только в процедурах (SUB), а из public-функций просто не запускаются.
Например:

sub Open1()
Workbooks.Open("Адрес", 0 ,true).activate
end sub

открывает файл без проблем.

function Open1() as integer
Workbooks.Open("Адрес", 0 ,true).activate
Open1 = 0
end function

даже не завершится, выводится "ЗНАЧ#"

Вот такая вот ботва, а мне надо позарез.

P.S. Проблема ессно при вызове функций с рабочего листа

Genyaa
Обычный пользователь
Обычный пользователь
 
Сообщения: 59
Зарегистрирован: 17.10.2006 (Вт) 13:46

Сообщение Genyaa » 16.08.2007 (Чт) 11:35

Shpux писал(а):RayShade
даже не завершится, выводится "ЗНАЧ#"
P.S. Проблема ессно при вызове функций с рабочего листа

Так и должно быть...

К сожалению уже давно не помню где я прочел это... какая-то очень неплохая была книжка по Excel... там было сказано, что одним из ограничений пользовательских функций, используемых в ячейках листа, есть суть - недопустимость изменения рабочей среды приложения... т.е., в том числе, нельзя открывать, закрывать, менять другие файлы. В Sub - пожалуйста. В Function, используемой на листе - нет. Попробуйте Вашу функцию вызвать в другой Sub - должна отработать. А на листе не будет.
Всякое решение плодит новые проблемы.

KL
Microsoft MVP
 
Сообщения: 483
Зарегистрирован: 30.10.2005 (Вс) 0:31
Откуда: Madrid

Сообщение KL » 16.08.2007 (Чт) 13:51

где-то я уже это видел :-)
http://tinyurl.com/2sqnrc

А что мешает использовать Sub связав его с одним из событий листа? Тут даже лучше будет вводить кодом нормальную формулу в ячейку.
Привет,
KL

Shpux
Начинающий
Начинающий
 
Сообщения: 9
Зарегистрирован: 16.08.2007 (Чт) 5:43

Сообщение Shpux » 17.08.2007 (Пт) 3:03

Genyaa
Ей богу не понимаю смысла подобных ограничений, ну да ладно.
Я пошел чудовищным путем но все же как вариант может кому пригодится: я эту функцию (ExecuteExcel4Macro) запихал во внешнюю dll-библиотеку (с помощью Delphi), потом подключил ее к Ехелю и все заработало. Правда пришлось помучаться с типами переменных, я сам не ахти какой программист но такое ощущение что у Delphi и Excel(VBA) совпадают только Integer и Double. Например при попытке вернуть из библиотеки (созданной в Delphi) значение типа String, Excel без объяснения причин вырубается.

KL
Использовать SUB конечно можно, но:
Попытаюсь вкратце обрисовать суть задачи:
Есть некоторое (неопределенное) количество файлов-источников Excel с абсолютно одинаковой структурой, есть один результирующий файл-приемник с такой-же структурой, но файлы источники содержат в себе сложные теплотехнические расчеты (например за разные периоды), а значения результирующего файла должны собираться (суммированием, среднеарифметическим, средневзвешенным, и т.п.).
Причем подразумевается постояное развитие и видоизменение расчетов.
Какова была моя мысль:
Исходные данные для расчета значения конкретной ячейки - массив адресов исходных файлов, принцип накопления (суммированием, среднеарифметическим, средневзвешенным, и т.п.), ссылка на параметр взвешивания.
Макрос - ФУНКЦИЯ вычисляет собственное местоположение (адрес ячейки) опрашивает ячейки файлов-источников с таким же адресом, рассчитывает их и возвращает нужное значение в ячейку результирующего файла.
Таким образом я могу быстро сформировать сам результирующий файл (банальным протягиванием), легко менять файлы-источники (и их количество), и главное - это может сделать любой пользователь независимо от знаний VBA.

Примечание: Сводные таблицы не подходят в принципе из-за неопределенности источников и относительно сложных алгоритмов определения результирующего значения.

Если существует какое-либо другое направление при решении этой задачи - буду очень признателен.

P.S. Прошу прошения если не смог доступно объяснить.

Shpux
Начинающий
Начинающий
 
Сообщения: 9
Зарегистрирован: 16.08.2007 (Чт) 5:43

Сообщение Shpux » 17.08.2007 (Пт) 6:20

Прошу прощения за ложную информацию :roll: :

"функцию (ExecuteExcel4Macro) запихал во внешнюю dll-библиотеку (с помощью Delphi), потом подключил ее к Ехелю и все заработало"

фокус срабатывает только один раз, а при попытке повторно использовать функцию - Excel захлапывается - бред какой-то, я верно даун :( .

Есть у кого-нибудь русская книжка по VBA для Excel?
Наверно пора учиться.

KL
Microsoft MVP
 
Сообщения: 483
Зарегистрирован: 30.10.2005 (Вс) 0:31
Откуда: Madrid

Сообщение KL » 17.08.2007 (Пт) 6:38

Shpux писал(а):Прошу прощения за ложную информацию :roll: :

"функцию (ExecuteExcel4Macro) запихал во внешнюю dll-библиотеку (с помощью Delphi), потом подключил ее к Ехелю и все заработало"

фокус срабатывает только один раз, а при попытке повторно использовать функцию - Excel захлапывается - бред какой-то, я верно даун :( .

Есть у кого-нибудь русская книжка по VBA для Excel?
Наверно пора учиться.

Ты я вижу не читаешь, то что я тебе пишу, а также ссылки, которые я тебе даю ;-) Зачем велосипед изобретать.
Если у тебя Excel от 97 до 2003, то можешь попробовать надстройку Laurent Longre MoreFunc.XLL ( http://xcell05.free.fr/english/index.html ) и конкретно функцию INDIRECT.EXT()
Привет,
KL

Shpux
Начинающий
Начинающий
 
Сообщения: 9
Зарегистрирован: 16.08.2007 (Чт) 5:43

Сообщение Shpux » 17.08.2007 (Пт) 8:59

KL
Спасибо огромное :D - функция INDIRECT.EXT() - как раз то, что нужно.
Остальное - дело техники.

Genyaa
Обычный пользователь
Обычный пользователь
 
Сообщения: 59
Зарегистрирован: 17.10.2006 (Вт) 13:46

Сообщение Genyaa » 17.08.2007 (Пт) 12:26

Shpux писал(а):Genyaa
Ей богу не понимаю смысла подобных ограничений, ну да ладно.

Думаю это ограничение пошло еще с древних времен ... Ибо трудно представить, что случилось бы, если бы функцию содержащую например Open, Output, Close размножить на листе в столбц в несколько тысяч строк... который пересчитывается при каждом вносимом изменении в лист...
Всякое решение плодит новые проблемы.

KL
Microsoft MVP
 
Сообщения: 483
Зарегистрирован: 30.10.2005 (Вс) 0:31
Откуда: Madrid

Сообщение KL » 17.08.2007 (Пт) 14:34

Genyaa писал(а):
Shpux писал(а):Genyaa
Ей богу не понимаю смысла подобных ограничений, ну да ладно.

Думаю это ограничение пошло еще с древних времен ... Ибо трудно представить, что случилось бы, если бы функцию содержащую например Open, Output, Close размножить на листе в столбц в несколько тысяч строк... который пересчитывается при каждом вносимом изменении в лист...


Ограничение на самомом деле пошло с одного из обновлений для Office97. Excel97 позволял вызывать макросы прямо из формулы с пом. функции (не помню имени), которую по соображениям безопасности впоследствии "обезточили"

KL
[MVP - Microsoft Excel]
Привет,
KL

@Nik
Обычный пользователь
Обычный пользователь
 
Сообщения: 80
Зарегистрирован: 14.05.2007 (Пн) 12:11

Сообщение @Nik » 20.08.2007 (Пн) 12:19

Я когда-то подобную задачу решал так:
Вложения
1.ZIP
(13.07 Кб) Скачиваний: 361


Вернуться в VBA

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3

    TopList