powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Как ADO recordset по-простому выгрузить на лист Эксель?
21 сообщений из 21, страница 1 из 1
Как ADO recordset по-простому выгрузить на лист Эксель?
    #36749399
кладовщик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В recordset засунул результат SELECTа, источником данных для которого является диапазон листа Excel 2003. Теперь нужно этот исходный диапазон листа очистить и ту выборку, которая в рекордсете сидит после SELECTа туда выгрузить. Как-то это поизящней можно сделать, без того, чтобы сначала в
Код: plaintext
промежуточный диапазон .CopyFromRecordset Recordset 
выполнить, а потом уже из него в нужный перенести? Есть какие уловки для этого?
-----
Smooth operator operating correctly.
...
Рейтинг: 0 / 0
Как ADO recordset по-простому выгрузить на лист Эксель?
    #36749451
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как ты думаешь, в какой момент делается практическое наполнение рекордсета данными?
...
Рейтинг: 0 / 0
Как ADO recordset по-простому выгрузить на лист Эксель?
    #36749929
кладовщик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlКак ты думаешь, в какой момент делается практическое наполнение рекордсета данными?
Думал, что после
Код: plaintext
1.
2.
3.
Set Recordset = New ADODB.Recordset
    With Recordset
        Src = SQLString
        .Open Source:=Src, ActiveConnection:=Connection   
Это не так? На самом деле при
Код: plaintext
Range("H6").CopyFromRecordset Recordset
?
Если в последнем случае, то есть какой-то ответ на мой вопрос в предыдущем посте? Хочется обойтись без того, чтобы лишние строки кода плодить.
...
Рейтинг: 0 / 0
Как ADO recordset по-простому выгрузить на лист Эксель?
    #36750843
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кладовщикНа самом деле при
Код: plaintext
Range("H6").CopyFromRecordset Recordset
?Правильно. Open запрашивает рекордсет с сервера и когда сервер готов отдавать строки open завершается, но по сети ничего еще не передается. А вот когда ты вызываешь RecordSet.MoveNext то тогда-то строчки и начинают попадать в память твоего клиента.

кладовщикЕсли в последнем случае, то есть какой-то ответ на мой вопрос в предыдущем посте? Хочется обойтись без того, чтобы лишние строки кода плодить.Никак. Если у тебя источником данных является лист Экселя, то этот же самый лист не может быть приемником данных. Можешь попытаться сделать клиентский тип курсора, но я сомневаюсь что это поможет.
А проще, не париться и сделать по старинке, через промежуточный лист.
...
Рейтинг: 0 / 0
Как ADO recordset по-простому выгрузить на лист Эксель?
    #36751493
KL (XL)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что мешает загнать рекордсет в переменную при помощи:

Код: plaintext
arrData = Recordset.GetRows

стереть данные с листа, а затем скопировать из переменной:

Код: plaintext
1.
2.
    With Activesheet
        .Range("H6").Resize(UBound(arrData,  2 ) +  1 , UBound(arrData,  1 ) +  1 )) = Application.Transpose(arrData)
    End With

?

Код не тестировал.
...
Рейтинг: 0 / 0
Как ADO recordset по-простому выгрузить на лист Эксель?
    #36751576
Фотография HandKot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl Open запрашивает рекордсет с сервера и когда сервер готов отдавать строки open завершается, но по сети ничего еще не передается. А вот когда ты вызываешь RecordSet.MoveNext то тогда-то строчки и начинают попадать в память твоего клиента.

а разве установка параметра CursorLocation в adUseClient не работает по другому и не все сроки сразу попадают на клиент?
...
Рейтинг: 0 / 0
Как ADO recordset по-простому выгрузить на лист Эксель?
    #36753140
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KL (XL)
Код: plaintext
arrData = Recordset.GetRows
Да, этот вариант должен сработать. Я про него забыл, прошу прощения.

HandKotа разве установка параметра CursorLocation в adUseClient не работает по другому и не все сроки сразу попадают на клиент?Я же сказал что попробовать это можно, но положительный результат не гарантирован. adUseClient всего-лишь обязан хранить в памяти клиента те строки что уже скачаны с сервера. Но он не обязан делать предварительное скачивание. Поэтому что произойдет в действительности если цель и источник для CopyFromRecordset заданы одни и те же предсказать нельзя и более того, поведение может меняться от одной версии Экселя к другой.
...
Рейтинг: 0 / 0
Как ADO recordset по-простому выгрузить на лист Эксель?
    #36753429
кладовщик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KL (XL)А что мешает загнать рекордсет в переменную при помощи:

Код: plaintext
1.
2.
    With Activesheet
        .Range("H6").Resize(UBound(arrData,  2 ) +  1 , UBound(arrData,  1 ) +  1 )) = Application.Transpose(arrData)
    End With

?

Код не тестировал.
У меня при выполнении кода ошибку Type Mysmatch выдает. Где эта ошибка?
...
Рейтинг: 0 / 0
Как ADO recordset по-простому выгрузить на лист Эксель?
    #36753450
KL (XL)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Без полного кода трудно сказать, но первое, что приходит в голову, это проверить как заявлена переменная arrData. Должна быть типа Variant, т.е.:

Код: plaintext
Dim arrData As Variant
...
Рейтинг: 0 / 0
Как ADO recordset по-простому выгрузить на лист Эксель?
    #36753471
KL (XL)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще неплохо бы проверить, что возвращает сам запрос :)

Код: plaintext
IsArray(arrData)
...
Рейтинг: 0 / 0
Как ADO recordset по-простому выгрузить на лист Эксель?
    #36753474
кладовщик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KL (XL)Без полного кода трудно сказать, но первое, что приходит в голову, это проверить как заявлена переменная arrData. Должна быть типа Variant, т.е.:

Код: plaintext
Dim arrData As Variant

Так точно она и заявлена. И рекордсет (я проверил), корректно в нее выгрузился.
В выражении
Код: plaintext
.Range("H6").Resize(UBound(arrData,  2 ) +  1 , UBound(arrData,  1 ) +  1 )) = Application.Transpose(arrData)
с левой стороны все в порядке, в правой части что-то не то.
Где про этот адский Transpose можно прочитать, желательно на русском?
...
Рейтинг: 0 / 0
Как ADO recordset по-простому выгрузить на лист Эксель?
    #36753495
KL (XL)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня вложенный файл работает без проблем.

Application.Transpose - это вызов функции рабочего листа ТРАНСП() (транспонирование)
...
Рейтинг: 0 / 0
Как ADO recordset по-простому выгрузить на лист Эксель?
    #36753547
кладовщик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KL (XL)У меня вложенный файл работает без проблем.

Application.Transpose - это вызов функции рабочего листа ТРАНСП() (транспонирование)
У меня Ваш файл тоже работает, а вот мой - нет ((
Я и корректность рекордсета проверил - циклом вывел все члены массива на лист, и размер диапазона, куда массив выгружается
Код: plaintext
Worksheets("Models").Range("H6").Resize(UBound(arrData,  2 ) +  1 , UBound(arrData,  1 ) +  1 ).Select
именно такой, какой и должен быть.
А при
Код: plaintext
Worksheets("Models").Range("H6").Resize(UBound(arrData,  2 ) +  1 , UBound(arrData,  1 ) +  1 ) = Application.Transpose(arrData)
выдает ошибку.
Буду искать.
...
Рейтинг: 0 / 0
Как ADO recordset по-простому выгрузить на лист Эксель?
    #36753556
KL (XL)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Без полного кода (и возможно данных) помочь не смогу :-(

А может код запускается не из Excel, а лишь извлекает и пишет данные в оный? Тогда конечно Application.Transpose должна давать сбой, правда ошибка "Type Mysmatch" как-то с этим не вяжется.
...
Рейтинг: 0 / 0
Как ADO recordset по-простому выгрузить на лист Эксель?
    #36753563
кладовщик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KL (XL)Без полного кода (и возможно данных) помочь не смогу :-(


Вот файл с данными и кодом, может Вы незамыленным взглядом сразу же найдете ошибку.
...
Рейтинг: 0 / 0
Как ADO recordset по-простому выгрузить на лист Эксель?
    #36753571
KL (XL)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну вот сразу все прояснилось: у вас есть данные типа Null, а с ними функция Transpose не работает. В таком случае, думаю, придется транспонировать через цикл.
...
Рейтинг: 0 / 0
Как ADO recordset по-простому выгрузить на лист Эксель?
    #36753580
KL (XL)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как-то так:

Код: plaintext
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.
40.
41.
42.
43.
44.
45.
46.
47.
48.
Sub SelectDates()
'Здесь из уже выгруженных данных на лист Models выбираются только те данные, где даты повторяются
    Dim DBFullName As String
    Dim Cnct As String, Src As String
    Dim Connection As ADODB.Connection
    Dim Recordset As ADODB.Recordset
    Dim arrData
    Dim i As Long, j As Long, x As Long, y As Long
    Dim temp As Variant
           
'   Информация о базе данных
    DBFullName = ThisWorkbook.FullName
'   Открытие соединения
    Set Connection = New ADODB.Connection
    Cnct = "Provider=Microsoft.Jet.OLEDB.4.0; "
    Cnct = Cnct & "Data Source=" & DBFullName & ";"
    Cnct = Cnct & "Extended Properties= Excel 8.0;"
    Connection.Open ConnectionString:=Cnct

    Dim SQLString As String
    SQLString = "SELECT * FROM [Models$H5:P1000] WHERE Date In "
    SQLString = SQLString & "(SELECT Date FROM [Models$H5:P1000] GROUP BY Date HAVING Count(Date)>1)"


    Set Recordset = New ADODB.Recordset
    With Recordset
        Src = SQLString
        .Open Source:=Src, ActiveConnection:=Connection
        arrData = .GetRows
    End With
    
    Worksheets("Models").Range("H5").CurrentRegion.Offset( 1 ).ClearContents
    
    x = UBound(arrData,  2 )
    y = UBound(arrData,  1 )
    ReDim temp(x, y)
    For i =  0  To x
        For j =  0  To y
            temp(i, j) = arrData(j, i)
        Next j
    Next i
    
    Worksheets("Models").Range("H6").Resize(x +  1 , y +  1 ) = temp
                                                                    
    Recordset.Close
    Set Recordset = Nothing
    Connection.Close
    Set Connection = Nothing
End Sub
...
Рейтинг: 0 / 0
Как ADO recordset по-простому выгрузить на лист Эксель?
    #36753587
кладовщик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ясно, в пару строк уложиться не получилось. Значит сначала
Код: plaintext
Range("H6").CopyFromRecordset Recordset
а потом уже очистить все ненужное, что ниже располагается.
ЗЫ Я сто лет с массивами ничего не делал и не понял, к чему сущности плодить типа
Код: plaintext
Dim temp As Variant
и зачем нужен
Код: plaintext
ReDim temp(x, y)
.
При проверке данных рекордсета я тупо циклом элементы массива arrData на лист выводил:
Код: plaintext
1.
2.
3.
4.
For i =  0  To UBound(arrData,  1 )
  For j =  0  To UBound(arrData,  2 )
Cells( 6  + j,  8  + i) = arrData(i, j)
 Next j
Next i
ЗЗЫ А вообще прием выгрузки массива на лист клевый, рад, что узнал о нем.
...
Рейтинг: 0 / 0
Как ADO recordset по-простому выгрузить на лист Эксель?
    #36753727
KL (XL)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1) Вот так три строки, но можно и меньше ;-)
Код: plaintext
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.
40.
Sub SelectDates()
'Здесь из уже выгруженных данных на лист Models выбираются только те данные, где даты повторяются
    Dim DBFullName As String
    Dim Cnct As String, Src As String
    Dim Connection As ADODB.Connection
    Dim Recordset As ADODB.Recordset
    Dim arrData, i As Long, j As Long, x As Long, y As Long, temp
           
'   Информация о базе данных
    DBFullName = ThisWorkbook.FullName
'   Открытие соединения
    Set Connection = New ADODB.Connection
    Cnct = "Provider=Microsoft.Jet.OLEDB.4.0; "
    Cnct = Cnct & "Data Source=" & DBFullName & ";"
    Cnct = Cnct & "Extended Properties= Excel 8.0;"
    Connection.Open ConnectionString:=Cnct

    Dim SQLString As String
    SQLString = "SELECT * FROM [Models$H5:P1000] WHERE Date In "
    SQLString = SQLString & "(SELECT Date FROM [Models$H5:P1000] GROUP BY Date HAVING Count(Date)>1)"


    Set Recordset = New ADODB.Recordset
    With Recordset
        Src = SQLString
        .Open Source:=Src, ActiveConnection:=Connection
        arrData = .GetRows
    End With
    
    Worksheets("Models").Range("H5").CurrentRegion.Offset( 1 ).ClearContents
    
    x = UBound(arrData,  2 ): y = UBound(arrData,  1 ): ReDim temp(x, y)
    For i =  0  To x: For j =  0  To y: temp(i, j) = arrData(j, i): Next j: Next i
    
    Worksheets("Models").Range("H6").Resize(x +  1 , y +  1 ) = temp
                                                                    
    Recordset.Close
    Set Recordset = Nothing
    Connection.Close
    Set Connection = Nothing
End Sub
2) Это вариант
3) Плодить это - необязательно, но когда много переменных, легко ошибиться с их декларирование, т.ч. рекоммендуется это делать явно
4) ReDim нужен для динамического изменения размеров массива
5) При большом количестве данных, перебор массива в памяти и копирование в диапазон целиком - значительно быстрее, чем копирование в процессе цикла
...
Рейтинг: 0 / 0
Как ADO recordset по-простому выгрузить на лист Эксель?
    #36753825
KL (XL)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, как насчет этого если речь о смысле:

Код: plaintext
1.
2.
3.
4.
    Dim SQLString As String
    SQLString = "SELECT * FROM [Models$H5:P1000] WHERE Date In "
    SQLString = SQLString & "(SELECT Date FROM [Models$H5:P1000] GROUP BY Date HAVING Count(Date)>1)"
...
    Src = SQLString

И если памяти не жалко, то так еще короче, хоть это и не предел:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
Sub SelectDates()
    d = ThisWorkbook.FullName
    Set c = New ADODB.Connection
    cn = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & d & ";Extended Properties= Excel 8.0;"
    c.Open cn
    Sql = "SELECT * FROM [Models$H5:P1000] WHERE Date In(SELECT Date FROM [Models$H5:P1000] GROUP BY Date HAVING Count(Date)>1)"
    Set r = New ADODB.Recordset
    With r
        .Open Source:=Sql, ActiveConnection:=c
        arrData = .GetRows
    End With
    With Worksheets("Models")
        .Range("H5").CurrentRegion.Offset( 1 ).ClearContents
        x = UBound(arrData,  2 ): y = UBound(arrData,  1 ): ReDim temp(x, y)
        For i =  0  To x: For j =  0  To y: temp(i, j) = arrData(j, i): Next j: Next i
        .Range("H6").Resize(x +  1 , y +  1 ) = temp
    End With
    r.Close: Set r = Nothing: c.Close: Set c = Nothing
End Sub
...
Рейтинг: 0 / 0
Как ADO recordset по-простому выгрузить на лист Эксель?
    #36753845
KL (XL)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пардон, отменил случайно несколько изменений:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Sub SelectDates()
    Set c = New ADODB.Connection
    c.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & ThisWorkbook.FullName & ";Extended Properties= Excel 8.0;"
    Set r = New ADODB.Recordset
    With r
        .Open "SELECT * FROM [Models$H5:P1000] WHERE Date In(SELECT Date FROM [Models$H5:P1000] GROUP BY Date HAVING Count(Date)>1)", c
        a = .GetRows
    End With
    With Sheets("Models")
        .Range("H5").CurrentRegion.Offset( 1 ).ClearContents
        x = UBound(a,  2 ): y = UBound(a,  1 ): ReDim t(x, y)
        For i =  0  To x: For j =  0  To y: t(i, j) = a(j, i): Next j: Next i
        .Range("H6").Resize(x +  1 , y +  1 ) = t
    End With
    r.Close: Set r = Nothing: c.Close: Set c = Nothing
End Sub
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Как ADO recordset по-простому выгрузить на лист Эксель?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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