Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Не могу выбрать данные с файла *.xlsm ч-з ADO. / 6 сообщений из 6, страница 1 из 1
10.08.2012, 14:37
    #37912295
кладовщик
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не могу выбрать данные с файла *.xlsm ч-з ADO.
Нужно с листа Экселя выбрать все строки, кроме пустых (ну или пустые удалить). Решил использовать коннект к этому листу в этой же книге. Для Экселя 2003 нет проблем: СКЛ-запрос к именованному диапазону и метод CopyFromRecordset решает задачу.
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
sWBFullName$ = ThisWorkbook.FullName
Const s0$ = "Provider=Microsoft.Jet.OLEDB.4.0;Mode=Read;Data Source="
Const s2$ = ";Extended Properties='Excel 8.0;HDR=NO;IMEX=2'"

cs = s0 & sWBFullName & s2
    Set cn = CreateObject("ADODB.Connection")
    Set rs = CreateObject("ADODB.Recordset")
    cn.Open cs
    rs.ActiveConnection = cn
    rs.CursorType = 3 'adOpenStatic
squery = "select * from (select * from Data0) where not (F2 is null) "


Для большего кол-ва строк данные выбираю с файла Экселя 2007, строку подключения изменил
Код: vbnet
1.
2.
Const s0$ = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source="
Const s2$ = ";Extended Properties='Excel 12.0 Macro;HDR=NO';"


Однако при выполнении кода получаю ошибку Объект "Data0" не найден ядром базы данных Microsoft Office Access. Проверьте существование объекта и ...
Data0 - имя именованного диапазона, он есть.
Ч-з MS Query нужные данные получил, но хочется разобраться с ADO.
-----
Не люблю Progress OpenEdge.
...
Рейтинг: 0 / 0
10.08.2012, 19:10
    #37912729
ElenHim
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не могу выбрать данные с файла *.xlsm ч-з ADO.
кладовщикну или пустые удалить

Range.SpecialCells(xlCellTypeBlanks).EntireRow.Delete
...
Рейтинг: 0 / 0
11.08.2012, 18:49
    #37913145
Не могу выбрать данные с файла *.xlsm ч-з ADO.
ElenHimкладовщикну или пустые удалить

Range.SpecialCells(xlCellTypeBlanks).EntireRow.Delete
Попробую, но ведь время выполнения сумасшедшее будет на сотне тысяч строк?
ЗЫ Мне бы концептуально с АДО к Эксель-2007 и старше разобраться, что за безобразие с доступом к Эксельным файлам. Не 1-й раз такая трабла вылезает. А СКЛ-запросы по-хорошему очень быстрый и эффективный вар-т. Циклы VBA гонять на десятках тысячах строк реально затратно.
-----
Noway OpenEdge
...
Рейтинг: 0 / 0
12.08.2012, 12:03
    #37913417
R Dmitry_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не могу выбрать данные с файла *.xlsm ч-з ADO.
комплектовщик,
Попробуйте, указать вместо именованного диапазона название листа на котором находятся данные
sSql="select * from [Sheet1$]"
...
Рейтинг: 0 / 0
12.08.2012, 13:28
    #37913464
ElenHim
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не могу выбрать данные с файла *.xlsm ч-з ADO.
комплектовщикА СКЛ-запросы по-хорошему очень быстрый и эффективный вар-т
Едва ли, по крайней мере по 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.
"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & book_path & ";Extended Properties=" & Chr(34) & "Excel 12.0 Macro;HDR=NO;ACCDB=YES;IMEX=1;TypeGuessRows=0;ImportMixedTypes=Text" & Chr(34) & ";"


book_path - путь к книге

и запрос:
Код: vbnet
1.
"SELECT F1, F2, F3, F4, F5, F7, F8, F9, F10, F11, F12, F13, F15, F16, F17, F18, F20, F21, F22, F23, F24, F25, F26, F27, F28, F29, F30, F31 FROM [" & Current_Data & "] WHERE F1 <> 'ID'"


Current_Data - адрес диапазона в требуемом формате.
Опять же, колонки лучше перечислять явно, условие можно применять сразу, т.е.

Код: vbnet
1.
"select F1,F2,F3, ... from Address where F2 <> ''"


К данным строке подключения и виду запроса я пришёл в результате несколько продолжительных исследований(в нете, на примерах и т.д.) и использую строго их(другие могут вести себя непредсказуемо). Главным образом всё возращается к тому, что Excel не БД: типы данных столбцов - могут доставить много головной боли, поэтому данные брать как строки, отсюда и параметры в строке подключения, и условие
Код: vbnet
1.
" where F2 <> '' "

. Опять же, в терминах 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, в конце есть ссылки на остальное
...
Рейтинг: 0 / 0
14.08.2012, 09:01
    #37915426
кладовщик
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не могу выбрать данные с файла *.xlsm ч-з ADO.
R Dmitry_комплектовщик,
Попробуйте, указать вместо именованного диапазона название листа на котором находятся данные
sSql="select * from [Sheet1$]"
Да, после указания листа в запросе 140 тыс строк вернулись где-то за секунду.
...
Рейтинг: 0 / 0
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Не могу выбрать данные с файла *.xlsm ч-з ADO. / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]