Гость
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Выборка данных из диапазона или листа в Excel (VBA) с помощью ADODB.RecordSet / 7 сообщений из 7, страница 1 из 1
07.06.2013, 10:27
    #38289611
Katsy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка данных из диапазона или листа в Excel (VBA) с помощью ADODB.RecordSet
Доброго времени суток!

Вопрос в следующем:
Как выбрать данные из того диапазона, который получили из Excel? Или просто с листа...
Вариант первый - из диапазона:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
 'Создание подключения к таблице Excel

    Dim cnnExcel As New ADODB.Connection

    cnnExcel.ConnectionString = "Provider=MSDASQL.1; Data Source=ExcelESK"

    cnnExcel.Open

    

    'Открываем набор данных (где ESK это диапазон ячеек)

    Dim rstESK As New ADODB.Recordset

    rstESK.Open "ESK", cnnExcel

 

    'Находим число записей в наборе

    rstESK.MoveFirst

    introwsESK = 0

    Do While Not rstESK.EOF

        introwsESK = introwsESK + 1

        rstESK.MoveNext

    Loop

    rstESK.MoveFirst

    'Получаем массив записей
    arrayRowsESK = rstESK.GetRows(introwsESK)

    rstESK.Close
    cnnExcel.Close



Отрабатывает и содержит набор данных! НО как теперь к нему применить SELECT?

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
        'Запрашиваем данные из базы
        rstOrgProduct.Open "SELECT [field1], [field2], [field3], [field4]  " _

        & "FROM " + rstESK + "" _

        & "where field1 = '" + CStr(arrayRows(3, intLoopRow)) + "' " _

        & "and field2 = '" + CStr(arrayRows(1, intLoopRow)) + "' " _

        & "and field3 = '" + CStr(arrayRows(12, intLoopRow)) + "' " _

        & "ORDER BY field4", cnnExcel



Получаю TypeMismatch.

Второй вариант - с листа:

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
   strSQL = "SELECT [field1], [field2], [field3], [field4] FROM [1207_old$] " _

    & "GROUP BY [field1], [field2], [field3] " _

    & "ORDER BY [field1], [field2]"

    rstMain.Open strSQL, cnnExcel




Тогда ошибка:

автор---------------------------

Microsoft Visual Basic

---------------------------

Run-time error '-2147217904 (80040e10)':



[Microsoft][Драйвер ODBC Excel] Слишком мало параметров. Требуется 1.

---------------------------

ОК Справка

---------------------------


Или еще такой вариант:



Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
    Dim Conn As ADODB.Connection, rs As ADODB.Recordset

    Dim ConnectionString As String

    Set Conn = CreateObject("ADODB.Connection")

    ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\1207_old.xls;Mode=Share Deny None;Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"";Persist Security Info=False;"

    Conn.CursorLocation = adUseClient

    Conn.Open ConnectionString

    

    Set rs = Conn.Execute("SELECT [field1], [field2], [field3], [field4] FROM [1207_old$] " _

    & "GROUP BY [field1], [field2], [field3] " _

    & "ORDER BY [field1], [field2]")

 




Тогда ошибка:

автор---------------------------

Microsoft Visual Basic

---------------------------

Run-time error '-2147217904 (80040e10)':



Отсутствует значение для одного или нескольких требуемых параметров.

---------------------------

ОК Справка

---------------------------

Может хоть какой-то из вариантов добить? Мучаю полдня уже, прошу помощи.
...
Рейтинг: 0 / 0
07.06.2013, 11:20
    #38289760
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка данных из диапазона или листа в Excel (VBA) с помощью ADODB.RecordSet
второй вариант можно добить, скорее всего поля не так называются, не field1, field2...
Надо сделать SELECT * и посмотреть, как они на самом деле называются, если есть сомнения.

Если хотите помощи, выложите файл с тестовыми данными и минимумом кода, я поправлю
...
Рейтинг: 0 / 0
07.06.2013, 16:24
    #38290624
AndreTM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка данных из диапазона или листа в Excel (VBA) с помощью ADODB.RecordSet
1) К именованному диапазону можно обратиться прямо в селекте (SELECT * FROM [Esk]), так что не надо его предварительно открывать рекордсетом.

2) Если вы используете для подключения OLE DB и параметр HDR=Yes, то обращаться к полям нужно по именам, оказавшимся в первой строке диапазона-источника. Можете выставить HDR=No, тогда имена полей будут F1, F2, F3 и т.д.
Не забывайте, что при использовании параметра IMEX=1 все данные преобразуются в текст!
...
Рейтинг: 0 / 0
07.06.2013, 17:46
    #38290845
AndreTM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка данных из диапазона или листа в Excel (VBA) с помощью ADODB.RecordSet
AndreTMпри использовании параметра IMEX=1 все данные преобразуются в текст!Если быть точным, то это относится к так называемым "смешанным" данным. Когда в одном столбце присутствуют записи с разными типами (текст, числа, даты) - то при считывании данных весь столбец преобразуется в текст. Если же данные однотипны - то они остаются так, как были.
...
Рейтинг: 0 / 0
10.06.2013, 06:38
    #38292012
Katsy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка данных из диапазона или листа в Excel (VBA) с помощью ADODB.RecordSet
Shocker.Pro, у меня в документе поля как в таблице, это для форума ерунду написала, ошибка та же... Может вся проблема в том, что я код в Wordе пишу?

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
'Создание подключения к таблице Excel
    Dim cnnExcel As New ADODB.Connection
    cnnExcel.ConnectionString = "Provider=MSDASQL.1; Data Source=ExcelESK"
    cnnExcel.Open
    
    'Открываем набор данных
    Dim rstESK As New ADODB.Recordset
    'rstESK.Open "ESK", cnnExcel
    rstESK.Open "SELECT [ad_of_name], [orgname], [bank_acc], [fee_year], [note_doc], [finame], [productorgname], [code], [orgcode], [amnd_date], [amnd_state], [productstate], [productname], [filter2], [dop_office] FROM
[ESK] " _
    & "GROUP BY [ad_of_name], [orgname], [bank_acc], [fee_year], [note_doc], [finame], [productorgname], [code], [orgcode], [amnd_date], [amnd_state], [productstate], [productname], [filter2], [dop_office] " _
    & "ORDER BY [finame], [ad_of_name], [orgname]", cnnExcel

    'Находим число записей в наборе
    rstESK.MoveFirst
    introwsESK = 0
    Do While Not rstESK.EOF
        introwsESK = introwsESK + 1
        rstESK.MoveNext
    Loop
    rstESK.MoveFirst
    'Получаем массив записей
    arrayRowsESK = rstESK.GetRows(introwsESK)
    rstESK.Close



автор---------------------------
Microsoft Visual Basic
---------------------------
Run-time error '-2147217904 (80040e10)':

[Microsoft][Драйвер ODBC Excel] Слишком мало параметров. Требуется 1.
---------------------------
ОК Справка
---------------------------
...
Рейтинг: 0 / 0
10.06.2013, 07:54
    #38292024
AndreTM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка данных из диапазона или листа в Excel (VBA) с помощью ADODB.RecordSet
Katsy,

Ошибка "Слишком мало параметров" - это обычно неправильное именование полей. Вот скажите мне, есть у вас поле [dop_office]?

Число записей не обязательно искать циклом, достаточно
Код: vbnet
1.
introwsESK = rstESK.RecordCount


Не могли бы вы пояснить, зачем вам "GROUP BY", если в списке отбираемых полей нет групповых операций?

Кроме того, если вы на листе-источнике удаляете данные, то не просто стирайте содержимое ячеек, а именно удаляйте строки. В вашем примере - рекордсет содержит 971 запись, видимо, где-то на листе есть непустая ячейка. Другой способ избежать такого - использовать фразу WHERE в запросе, где указать условие "непустоты" записи.
...
Рейтинг: 0 / 0
11.06.2013, 07:12
    #38293435
Katsy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка данных из диапазона или листа в Excel (VBA) с помощью ADODB.RecordSet
AndreTM,

Спасибо! Поле действительно не так называлось...
У меня по разным организациям различные данные, мне необходимо сначала из этих 971 записи отобрать список организаций, потом уже выбирать конкретные ФИО и т.п. списком для каждой организации. Вообще, это всё делалось иначе, данные считывались из базы, но там выборка бралась за сутки-трое, максимум пять. Тут необходимо за месяц, поэтому запрос выполняется по часу, приходится складывать в Excel как в буфер, потом из него читать.
В принципе, по моей выборке, не может возникнуть пустая запись, но спасибо за совет! Сейчас буду пробовать отбирать.
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Выборка данных из диапазона или листа в Excel (VBA) с помощью ADODB.RecordSet / 7 сообщений из 7, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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