|
Не могу выбрать данные с файла *.xlsm ч-з ADO.
|
|||
---|---|---|---|
#18+
Нужно с листа Экселя выбрать все строки, кроме пустых (ну или пустые удалить). Решил использовать коннект к этому листу в этой же книге. Для Экселя 2003 нет проблем: СКЛ-запрос к именованному диапазону и метод CopyFromRecordset решает задачу. Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
Для большего кол-ва строк данные выбираю с файла Экселя 2007, строку подключения изменил Код: vbnet 1. 2.
Однако при выполнении кода получаю ошибку Объект "Data0" не найден ядром базы данных Microsoft Office Access. Проверьте существование объекта и ... Data0 - имя именованного диапазона, он есть. Ч-з MS Query нужные данные получил, но хочется разобраться с ADO. ----- Не люблю Progress OpenEdge. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.08.2012, 14:37 |
|
Не могу выбрать данные с файла *.xlsm ч-з ADO.
|
|||
---|---|---|---|
#18+
кладовщикну или пустые удалить Range.SpecialCells(xlCellTypeBlanks).EntireRow.Delete ... |
|||
:
Нравится:
Не нравится:
|
|||
10.08.2012, 19:10 |
|
Не могу выбрать данные с файла *.xlsm ч-з ADO.
|
|||
---|---|---|---|
#18+
ElenHimкладовщикну или пустые удалить Range.SpecialCells(xlCellTypeBlanks).EntireRow.Delete Попробую, но ведь время выполнения сумасшедшее будет на сотне тысяч строк? ЗЫ Мне бы концептуально с АДО к Эксель-2007 и старше разобраться, что за безобразие с доступом к Эксельным файлам. Не 1-й раз такая трабла вылезает. А СКЛ-запросы по-хорошему очень быстрый и эффективный вар-т. Циклы VBA гонять на десятках тысячах строк реально затратно. ----- Noway OpenEdge ... |
|||
:
Нравится:
Не нравится:
|
|||
11.08.2012, 18:49 |
|
Не могу выбрать данные с файла *.xlsm ч-з ADO.
|
|||
---|---|---|---|
#18+
комплектовщик, Попробуйте, указать вместо именованного диапазона название листа на котором находятся данные sSql="select * from [Sheet1$]" ... |
|||
:
Нравится:
Не нравится:
|
|||
12.08.2012, 12:03 |
|
Не могу выбрать данные с файла *.xlsm ч-з ADO.
|
|||
---|---|---|---|
#18+
комплектовщикА СКЛ-запросы по-хорошему очень быстрый и эффективный вар-т Едва ли, по крайней мере по 2 причинам. - SQL - это приблуда именно реляционных БД, к коим Excel никогда не относился, и родной поддержки - не имеет, а только через ODBC/ADO и прочая. - SQL запросы быстры и эффективны когда выполняются на сервере.По опыту, клиентские машины (где и выполняется Excel в 99 % случаях) вычислительной мощью не обезображены, и, в общем случае, обрабатывать данные листов Exel с помощью SQL накладнее, чем "родными" средствами. Другое дело, что на "приемлимых" объёмах данных разница не столь заметна (впрочем, можете провести простой эксперимент - копировать диапазон данных, скажем 100х500000, с одного листа на другой, разными способами - массивом, copy/paste, копировать лист, ADO, другими - сами увидите). Эффективность же SQL в данном случае - субъективна и определяется спецификой языка: - вы говорите "что" надо сделать с данными, а не "как". Возвращаясь к вашему примеру. В случае, если в вашем наборе получается так много пустых строк (более 30-40%), то да, .EntireRow.Delete - окажется неэффективным. Но это говорит о том, что вы изначально плохо готовите свои наборы данных. В идеале - у вас набор сразу должен получаться без пустых строк, откуда бы вы его не брали. В конечном счёте, искомый результат в данном случае можно получить и не удаляя пустые строки: например отсортировать(Worksheets(SheetName).Sort) результат по убыванию - всё пустое окажется в самом низу диапазона. Касательно ADO для работы с данными Excel. Я к нему прибегаю только в специальных случаях (например при передаче табличных параметров в БД через .NET, это действительно "дешевле", ну и работа с собственно БД). Поначалу развлекался, как и вы, с именованными диапазонами, но оказалось, что для моих целей гораздо эффективнее передавать адрес диапазона , вычисляемый непосредственно перед передачей в запрос. Важный нюанс: если действо производится с открытой книгой, то после вычисления диапазона, книгу нужно сохранить. Строка подключения получалась следующая: Код: vbnet 1.
book_path - путь к книге и запрос: Код: vbnet 1.
Current_Data - адрес диапазона в требуемом формате. Опять же, колонки лучше перечислять явно, условие можно применять сразу, т.е. Код: vbnet 1.
К данным строке подключения и виду запроса я пришёл в результате несколько продолжительных исследований(в нете, на примерах и т.д.) и использую строго их(другие могут вести себя непредсказуемо). Главным образом всё возращается к тому, что Excel не БД: типы данных столбцов - могут доставить много головной боли, поэтому данные брать как строки, отсюда и параметры в строке подключения, и условие Код: vbnet 1.
. Опять же, в терминах Excel, Null не тоже самое что в SQL: Excel Developer ReferenceThe Null keyword is used as a Variant subtype. It indicates that a variable contains no valid data BOLA value of NULL indicates the value is unknown И другие заморочки - много их Рекомендую к ознакомлению: Всё про строки подключения ЛикБез от MS.В статье используется JET, в конце есть ссылки на остальное ... |
|||
:
Нравится:
Не нравится:
|
|||
12.08.2012, 13:28 |
|
Не могу выбрать данные с файла *.xlsm ч-з ADO.
|
|||
---|---|---|---|
#18+
R Dmitry_комплектовщик, Попробуйте, указать вместо именованного диапазона название листа на котором находятся данные sSql="select * from [Sheet1$]" Да, после указания листа в запросе 140 тыс строк вернулись где-то за секунду. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.08.2012, 09:01 |
|
|
start [/forum/topic.php?fid=61&msg=37913464&tid=2175474]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
50ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
47ms |
get tp. blocked users: |
1ms |
others: | 311ms |
total: | 450ms |
0 / 0 |