powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Передача данных на лист Excel из recordset
11 сообщений из 11, страница 1 из 1
Передача данных на лист Excel из recordset
    #37466299
Sergey11222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Уважаемые форумчане.
Прошу Вас помочь разобраться со следующей ситуацией.
1 Передаем на лист из recordset данные.
Получаем таблицу

Исполнитель
Иванов
Петров
Сидоров
Иванов
Петров

2. Ставим в Excel фильтр по фамилии Сидоров, получаем видимую строку
Исполнитель
Сидоров

обновляем recordset, фамилия Сидоров заменяется на фамилию Иванов
Исполнитель
Иванов

Т.е. данные из recordset вставляются в первую отфильтрованную строку, а надо во вторую строку листа (ячейку “J2”). Так чтобы при включенном фильтре построчно обновились данные Иванов на Иванов, Петров на Петров, Сидоров на Сидоров. Чтобы строка с фамилией Сидоров осталась без изменений. Как это сделать?

авторSub pr()

Dim cn As New ADODB.Connection
Dim cm As New ADODB.Command
Dim rs As New ADODB.Recordset
Dim fldLoop As Field
Dim i As Integer
Dim ws As Worksheet
Set ws = Sheets(1)
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual

cn.Provider = "Microsoft.Jet.OLEDB.4.0"
cn.ConnectionString = "Data Source = D:\Книга3; Extended Properties=Excel 8.0;"""
cn.Open
cm.ActiveConnection = cn
cm.CommandText = "SELECT Исполнитель FROM [Лист1$]"
rs.Open cm
Do While Not rs.EOF
rs.MoveNext
ws.Range("J" & 2).CopyFromRecordset rs

Loop

rs.Close
cn.Close
Application.Calculation = xlAutomatic
Application.ScreenUpdating = True
End Sub
...
Рейтинг: 0 / 0
Передача данных на лист Excel из recordset
    #37466384
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не понял юмора...
Разъясните нам смысл вашего запроса с отбором только фамилий? Вернее, разъясните задачу полностью - для чего вы потом фильтруете этот список повторяющихся фамилий.

И еще - а примерах на ADO надо хоть немного разбираться, а не тупо копировать все подряд. Особенно мне нравится использование цикла и .MoveNext совместно с .CopyFromRecordset
...
Рейтинг: 0 / 0
Передача данных на лист Excel из recordset
    #37466390
скукотища
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Sergey11222,
Чтобы строка с фамилией Сидоров осталась без изменений. Как это сделать?-сохранить автофильтр;
-отменить автофильтр;
-загрузить данные из набора записей;
-восстановить автофильтр.
Код: 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 pr()

Dim cn As New ADODB.Connection
Dim cm As New ADODB.Command
Dim rs As New ADODB.Recordset
Dim fldLoop As Field
Dim i As Integer
Dim ws As Worksheet

' переменные для сохранения фильтров и флажок "отфильтровано" 
Dim arrFilters
Dim sFilterRange$
Dim boolFilter As Boolean

Set ws = Sheets( 1 )
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual

cn.Provider = "Microsoft.Jet.OLEDB.4.0"
cn.ConnectionString = "Data Source = D:\Книга3; Extended Properties=Excel 8.0;"
cn.Open
cm.ActiveConnection = cn
cm.CommandText = "SELECT Исполнитель FROM [Лист1$]"
rs.Open cm
' цикл тут явно не к месту
' Do While Not rs.EOF
' rs.MoveNext

Call SaveFilters(ws, sFilterRange, boolFilter, arrFilters)
ws.Range("J" &  2 ).CopyFromRecordset rs
Call RestoreFilters(ws, sFilterRange, boolFilter, arrFilters)
If IsArray(arrFilters) Then Erase arrFilters

' Loop

rs.Close
cn.Close
Application.Calculation = xlAutomatic
Application.ScreenUpdating = True
End Sub
Код: 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.
' **** сохраниение фильтров ****
Sub SaveFilters(w As Worksheet, currentFiltRange$, boolFiltered As Boolean, filterArray)
Dim f%
If Not w.AutoFilterMode Then Exit Sub

With w.AutoFilter
    currentFiltRange = .Range.Address
    With .filters
        ReDim filterArray( 1  To .Count,  1  To  3 )
        For f =  1  To .Count
            With .Item(f)
                If .On Then
                    boolFiltered = True
                    filterArray(f,  1 ) = .Criteria1
                    If .Operator Then
                        filterArray(f,  2 ) = .Operator
                        filterArray(f,  3 ) = .Criteria2
                    End If
                End If
            End With
        Next
    End With
End With
If boolFiltered Then w.AutoFilterMode = False
End Sub

' **** восстановление фильтров ****
Sub RestoreFilters(w As Worksheet, currentFiltRange$, boolFiltered As Boolean, filterArray)
Dim col%
If Not boolFiltered Then Exit Sub

w.AutoFilterMode = False
For col =  1  To UBound(filterArray,  1 )
    If Not IsEmpty(filterArray(col,  1 )) Then
        If filterArray(col,  2 ) Then
            w.Range(currentFiltRange).AutoFilter field:=col, _
                Criteria1:=filterArray(col,  1 ), _
                    Operator:=filterArray(col,  2 ), _
                Criteria2:=filterArray(col,  3 )
        Else
            w.Range(currentFiltRange).AutoFilter field:=col, _
                Criteria1:=filterArray(col,  1 )
        End If
    End If
Next
End Sub
ЗЫ:
Перед выгрузкой даных из набора записей на лист, неплохо было бы очищать диапазон, в который выгружаются данные.
Иначе рискуете получить "фантомные" записи.
...
Рейтинг: 0 / 0
Передача данных на лист Excel из recordset
    #37468122
Sergey11222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем ответившим спасибо.
AndreTM ,
Список фамилий получаем из источника, затем обрабатываем его (записи) с помощью стандартных инструментов Excel.

Guest, зря Вы про скукотищу.
1.Схема обновления и включения/выключения фильтров осталась старой, но с "изюминкой". Для меня Ваше решение очень интересно. Была у меня еще ошибка: при обновлении не все записи копировались. В Вашем варианте этой ошибки нет.
2. От очистки диапазона пришлось отказаться, т.к. нужно оставить форматирование. При Clear очищается форматирование , а при Delete удаляются ячейки. С "фантомами" что делать, пока не знаю.

Позволю себе еще раз вернуться к вопросу ТС. При включенном фильтре и отфильтрованных записях есть ли вариант применения "чисто" rs, т.е. загрузить данные без использования сохранить/отменить/восстановить автофильтр?
...
Рейтинг: 0 / 0
Передача данных на лист Excel из recordset
    #37468220
скукотища
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Sergey11222,
2. От очистки диапазона пришлось отказаться, т.к. нужно оставить форматирование. При Clear ... .ClearContents сохраняет форматирование
Была у меня еще ошибка: при обновлении не все записи копировалисьПравильнее было бы сказать "не копировалась первая запись". Виной тому .MoveNext .
Простой наглядный пример
Исходные данные (должны жить на листе 'Лист1' в книге D:\Книга3.xls)
Исполнитель1.Иванов2.Петров3.Сидоров4.Иванов5.Петров

немного измененный Ваш код
Код: 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.
Sub pr_bugcatcher()

Dim cn As New ADODB.Connection
'Dim cm As New ADODB.Command
Dim rs As New ADODB.Recordset
'Dim fldLoop As Field
Dim i As Integer
Dim ws As Worksheet
'Set ws = Sheets(1)
Set ws = ThisWorkbook.Worksheets( 1 )
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual

cn.Provider = "Microsoft.Jet.OLEDB.4.0"
cn.ConnectionString = "Data Source = D:\Книга3; Extended Properties=Excel 8.0;"""
cn.Open
'cm.ActiveConnection = cn
'cm.CommandText = "SELECT Исполнитель FROM [Лист1$]"
'rs.Open cm
rs.Open "SELECT Исполнитель FROM [Лист1$]", cn
i =  1 
Do While Not rs.EOF
rs.MoveNext
'ws.Range("J" & 2).CopyFromRecordset rs
ws.cells( 1 , i).Value2="шаг " &  1 
ws.Cells( 2 , i).CopyFromRecordset rs
Loop

rs.Close: Set rs = Nothing
cn.Close: Set cn = Nothing
Set ws = Nothing
Application.Calculation = xlAutomatic
Application.ScreenUpdating = True
End Sub
Меняя количество записей в исходной таблице, видим, что цикл While отрабатывает только один раз (за исключением случая, когда в исходной таблице записи отсутствуют), "теряется" каждый раз первая запись.

При включенном фильтре и отфильтрованных записях есть ли вариант применения "чисто" rs, ...По всей видимости, нет. Но ещё остается вариант .Copy .PasteSpecial
ОФФ"скукотища" - это не отношение к Вашему вопросу, а состояние души.
...
Рейтинг: 0 / 0
Передача данных на лист Excel из recordset
    #37470016
Sergey11222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Guest,
за .ClearContents - большое спасибо.
А мне интересно было бы сделать такой вариант: хранение данных в .mdb, а вызов, изменение данных и передача их обратно в БД - средствами Excel. Было бы здорово. Но не все операции пока понятны.
Получение данных из Access в Excel, - пример нашел, их изменение, добавление представляю пока в общих чертах, сохранение обратно в БД - литературы пока не нашел. А rs - рассматриваю как средство.
Еще раз спасибо за то, что "объяснили на пальцах", что к чему.
...
Рейтинг: 0 / 0
Передача данных на лист Excel из recordset
    #37470059
Sergey11222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ЗЫ, точнее PS: вот так копируются все записи из rs, до тех пор, пока значение позиции rs не равно True

Код: plaintext
1.
2.
3.
4.
5.
Do While Not rs.EOF
'rs.MoveNext
'ws.Range("J" & 2).CopyFromRecordset rs
ws.Cells( 1 , i).Value2 = "шаг " &  1 
ws.Cells( 2 , i).CopyFromRecordset rs
Loop

Или так
Код: plaintext
1.
2.
3.
4.
5.
Do While Not rs.EOF
'rs.MoveNext
ws.Range("J" &  2 ).CopyFromRecordset rs
'ws.Cells(1, i).Value2 = "шаг " & 1
'ws.Cells(2, i).CopyFromRecordset rs
Loop
Дает полный список при выключенном автофильтре.


вариант .Copy .PasteSpecial
Это объектная модель или из средств доступа к данным ADO/DAO?
Поправьте меня, если высказался не правильно.
...
Рейтинг: 0 / 0
Передача данных на лист Excel из recordset
    #37470081
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey11222А мне интересно было бы сделать такой вариант: хранение данных в .mdb, а вызов, изменение данных и передача их обратно в БД - средствами Excel. Было бы здорово. Но не все операции пока понятныДелается-то легко. Но непонятен сам смысл.
С одной стороны, зачем вам Excel для управления данными, если Access и так содержит всё необходимое? Или, исходя из того, что вы "типа знаете Зкэель и его макросы?"
С другой стороны, если построить модель данных изначально "типа правильно", то можно сразу подходить с точки зрения построения клиент-серверной системы, на РДБ. Не в плане того, что Access будет изображать из себя полнофункционального "старшего брата", а в том плане, что и Excel может быть "клиентом", но надо сразу чётко разделить - "вот это - данные, вот это - то, что работает с данными", и не сваливать всё в кучу.
Еще проще - вы бы поподробнее рассказали о предметной области... возможно, есть решение проще (например, вместо Access в качестве хранилища сразу можно использовать MS SQL Express..., вместо Офиса в качестве клиента - сразу приложение на VB/VB.NET).
...
Рейтинг: 0 / 0
Передача данных на лист Excel из recordset
    #37470111
скукотища
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Sergey11222,вариант .Copy .PasteSpecial
Это объектная модель или из средств доступа к данным ADO/DAO?Объектная модель. В текущем контексте - методы объекта Range.
...
Рейтинг: 0 / 0
Передача данных на лист Excel из recordset
    #37473204
Sergey11222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
скукотищаSergey11222,вариант .Copy .PasteSpecial
Это объектная модель или из средств доступа к данным ADO/DAO?Объектная модель. В текущем контексте - методы объекта Range.

Спасибо
...
Рейтинг: 0 / 0
Передача данных на лист Excel из recordset
    #37473217
Sergey11222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AndreTM,
...Excel может быть "клиентом", но надо сразу чётко разделить - "вот это - данные, вот это - то, что работает с данными
Именно так, как Вы сказали. Очень интересная модель.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Передача данных на лист Excel из recordset
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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