powered by simpleCommunicator - 2.0.58     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Не могу выбрать данные с файла *.xlsm ч-з ADO.
6 сообщений из 6, страница 1 из 1
Не могу выбрать данные с файла *.xlsm ч-з ADO.
    #37912295
кладовщик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нужно с листа Экселя выбрать все строки, кроме пустых (ну или пустые удалить). Решил использовать коннект к этому листу в этой же книге. Для Экселя 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
Не могу выбрать данные с файла *.xlsm ч-з ADO.
    #37912729
ElenHim
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кладовщикну или пустые удалить

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

Range.SpecialCells(xlCellTypeBlanks).EntireRow.Delete
Попробую, но ведь время выполнения сумасшедшее будет на сотне тысяч строк?
ЗЫ Мне бы концептуально с АДО к Эксель-2007 и старше разобраться, что за безобразие с доступом к Эксельным файлам. Не 1-й раз такая трабла вылезает. А СКЛ-запросы по-хорошему очень быстрый и эффективный вар-т. Циклы VBA гонять на десятках тысячах строк реально затратно.
-----
Noway OpenEdge
...
Рейтинг: 0 / 0
Не могу выбрать данные с файла *.xlsm ч-з ADO.
    #37913417
R Dmitry_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
комплектовщик,
Попробуйте, указать вместо именованного диапазона название листа на котором находятся данные
sSql="select * from [Sheet1$]"
...
Рейтинг: 0 / 0
Не могу выбрать данные с файла *.xlsm ч-з ADO.
    #37913464
ElenHim
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
комплектовщикА СКЛ-запросы по-хорошему очень быстрый и эффективный вар-т
Едва ли, по крайней мере по 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
Не могу выбрать данные с файла *.xlsm ч-з ADO.
    #37915426
кладовщик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
R Dmitry_комплектовщик,
Попробуйте, указать вместо именованного диапазона название листа на котором находятся данные
sSql="select * from [Sheet1$]"
Да, после указания листа в запросе 140 тыс строк вернулись где-то за секунду.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Не могу выбрать данные с файла *.xlsm ч-з ADO.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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