powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Вставка Recordset
25 сообщений из 49, страница 1 из 2
Вставка Recordset
    #39069756
Чип&Дейл
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день, уважаемые форумчане)
Подскажите как вставить все содержимое record в документ excel

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
Dim dbs As DAO.Database
Dim rs As DAO.Recordset
Set dbs = DAO.OpenDatabase ("C:\test.mdb")
Set rs=dbs.OpenRecordset("Select t1.p1, t1.p2, t1.p4, t1.p6, t1.p7, t1.p10 from t1")
Set ea=CreateObject("Excel.Application")
ea.Visible=true
Set ed=ea.Workbooks.Open("C:\test1.xls")



А вот дальше проблема возникает, как вставить записи из рекорда по порядку как они в нем записаны? и как вставить записи из рекорда в нужном мне порядке?
Например, в первом случае нужно вставить поля p1,p2,p4,p6,p7,p10 в A1,B1,C1,D1,E1 соответственно, а во втором случае эти же поля нужно вставить в A1,С1,D1,F1,G1
...
Рейтинг: 0 / 0
Вставка Recordset
    #39069789
Фотография The_Prist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чип&Дейл,

Есть у объекта Range метод CopyFromRecordset. Им можно вставить данные в том порядке, в котором они получены.
А для вставки в несмежные диапазоны остается только перебор записей и вставка в ячейки последовательно.
...
Рейтинг: 0 / 0
Вставка Recordset
    #39069799
Чип&Дейл
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Перебор я так понимаю делать через do while? а как указывать нужные мне ячейки в данном случае?
...
Рейтинг: 0 / 0
Вставка Recordset
    #39069828
Фотография The_Prist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чип&Дейл,

Тут я не очень знаю какие у Вас данные. В общем случае делаете цикл по строкам Recordset. Что-то типа:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
For lr = 1 To lRecCnt
     For lc = 1 To objRecSet.Fields.Count
     select case lc
     case 1:lcol = 1
     case 2:lcol = 3
     case 3:lcol = 4
     case 4:lcol = 6
     case 5:lcol = 7
     end select
         Cells(lr, lcol).Value = objRecSet.Fields(objRecSet.Fields(lc - 1).Name)
     Next lc
     objRecSet.MoveNext
Next lr


где lRecCnt - количество строк в Recordset.
lc - это как раз Ваши поля.
lcol - используется для назначения соответствия номера поля столбцу ячейки. Я привел топорно с Select Case, но если полей много - лучше запихать соответствия в массивы или словари.
...
Рейтинг: 0 / 0
Вставка Recordset
    #39070047
Чип&Дейл
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сделал как сказали, выдает ошибку "Sub or Function not defined" и выделяет слово "Cells"
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
For lr = 1 To rs.RecordCount
    For lc = 1 To rs.Fields.Count
    Select Case lc
    Case 1: lcol = 1
     Case 2: lcol = 3
     Case 3: lcol = 4
     Case 4: lcol = 6
     Case 5: lcol = 7
     End Select
         Cells(lr, lcol).Value = rs.Fields(rs.Fields(lc - 1).Name)
     Next lc
     rs.MoveNext
Next lr



Когда делаю вот так, выходит ошибка "object required" и выделяет всю строку начиная с ActiveSheets
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
For lr = 1 To rs.RecordCount
    For lc = 1 To rs.Fields.Count
    Select Case lc
    Case 1: lcol = 1
     Case 2: lcol = 3
     Case 3: lcol = 4
     Case 4: lcol = 6
     Case 5: lcol = 7
     End Select
         ActiveSheet.Cells(lr, lcol).Value = rs.Fields(rs.Fields(lc - 1).Name)
     Next lc
     rs.MoveNext
Next lr
...
Рейтинг: 0 / 0
Вставка Recordset
    #39070054
Чип&Дейл
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подключил библиотеку в tools заработало, правда только одну строчку вставляет, а в рекорде их 8
...
Рейтинг: 0 / 0
Вставка Recordset
    #39070064
Фотография HandKot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чип&ДейлПодключил библиотеку в tools заработало, правда только одну строчку вставляет, а в рекорде их 8
замените
Код: vbnet
1.
For lr = 1 To rs.RecordCount


на
Код: vbnet
1.
While Not rs.EOF


или же, если оставите первый вариант, сделайте перед циклом
Код: vbnet
1.
2.
rs.MoveLast
rs.MoveFirst
...
Рейтинг: 0 / 0
Вставка Recordset
    #39070073
Чип&Дейл
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
c While а после Loop что писать в конце цикла или while без него может работать?

c rs все работает, спасибо
...
Рейтинг: 0 / 0
Вставка Recordset
    #39070077
Фотография HandKot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чип&Дейл, я имел ввиду
Код: vbnet
1.
2.
3.
    Do While ...
         ...
    Wend
...
Рейтинг: 0 / 0
Вставка Recordset
    #39070307
Фотография The_Prist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чип&Дейлвыдает ошибку "Sub or Function not defined" и выделяет слово "Cells"Библиотеку можно было не подключать, а делать так:
Код: vbnet
1.
ea.Sheets(1).Cells(lr, lcol)


Чип&Дейлправда только одну строчку вставляет
lRecCnt - я обычно получал количество записей отдельной функцией, что-то вроде:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
On Error Resume Next
    objRecSet.CursorType = adOpenKeyset
    objRecSet.Open "Select t1.p1, t1.p2, t1.p4, t1.p6, t1.p7, t1.p10 from t1", dbs
    objRecSet.Filter = sWhere

    If Err = 0 Then
        lRecCnt = objRecSet.RecordCount
    End If


objRecSet - это должен быть новый экземпляр Recordset, а не тот, что уже используется.
Правда я использовал ADODB.Recordset, который несколько отличается от DAO. Но все равно вроде как уже сами разобрались.
...
Рейтинг: 0 / 0
Вставка Recordset
    #39070352
Чип&Дейл
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
НУ еще не совсем раозобрался, остался вопрос как начать вставку с именнованной ячейки?
...
Рейтинг: 0 / 0
Вставка Recordset
    #39070404
Фотография The_Prist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чип&Дейл,
Код: vbnet
1.
ea.Sheets(1).Range("имя")


подробнее: Как обратиться к диапазону из VBA
...
Рейтинг: 0 / 0
Вставка Recordset
    #39070423
Чип&Дейл
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
это я уже понял, проблема в том что вставку из рекорд надо начать с ячейки с именем "start" а она может быть как на 1 строке так и на 25.
Если ручками написать например Range("start")=5 он вставит "5" где бы не была ячейка
...
Рейтинг: 0 / 0
Вставка Recordset
    #39070425
Фотография The_Prist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чип&Дейл,

значит плохо поняли :)
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
For lr = 1 To rs.RecordCount
    For lc = 1 To rs.Fields.Count
    Select Case lc
    Case 1: lcol = 1
     Case 2: lcol = 3
     Case 3: lcol = 4
     Case 4: lcol = 6
     Case 5: lcol = 7
     End Select
         ea.Sheets(1).Range("имя").Cells(lr, lcol).Value = rs.Fields(rs.Fields(lc - 1).Name)
     Next lc
     rs.MoveNext
Next lr
...
Рейтинг: 0 / 0
Вставка Recordset
    #39070438
Чип&Дейл
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сделал немного по другому, работает
Код: vbnet
1.
   Cells(5 + lr, Range("start") + lcol).Value = rs.Fields(rs.Fields(lc - 1).Name)
...
Рейтинг: 0 / 0
Вставка Recordset
    #39070489
Фотография The_Prist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чип&Дейл,

Это называется не совсем вставкой, начиная с именованной ячейки. Это вставка, начиная со значения, записанного в именованной ячейке :-)
...
Рейтинг: 0 / 0
Вставка Recordset
    #39070732
Чип&Дейл
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Буду знать, еще такая проблемка вышла
Код: vbnet
1.
2.
3.
  ea.Sheets(1).Range("start").Cells(lr, lcol).Value = rs.Fields(rs.Fields(lc - 1).Name)
              Selection.EntireRow.Insert
               Next lc


Добавил строчку чтобы после заполнения добавилась новая строчка, но почему то первые 3 записи вставляются как надо а остальные лесенкой) С чем это может быть связано и как исправить?
...
Рейтинг: 0 / 0
Вставка Recordset
    #39070949
Фотография The_Prist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чип&Дейл,

видимо где-то не там меняете значение lcol. Приведите весь код по заполнению. По этому куску не понять где ошибка.
...
Рейтинг: 0 / 0
Вставка Recordset
    #39070950
Фотография The_Prist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
The_Prist,

плюс Вы вставляете строку после каждой итерации цикла по столбцам. Видимо, правильнее вынести за цикл по столбцам и сделать её в цикле по строкам.
...
Рейтинг: 0 / 0
Вставка Recordset
    #39071413
Чип&Дейл
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: 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.
rs.MoveLast
rs.MoveFirst
 For lr = 1 To rs.RecordCount
         For lc = 1 To rs.Fields.Count
 Select Case lc
     Case 1: lcol = 1
     Case 2: lcol = 2
     Case 3: lcol = 3
     Case 4: lcol = 4
     Case 5: lcol = 5
     Case 6: lcol = 6
     Case 7: lcol = 7
     Case 8: lcol = 8
     Case 9: lcol = 9
     Case 10: lcol = 11
     
     End Select
                     ea.Sheets(1).Range("start").Cells(lr, lcol).Value = rs.Fields(rs.Fields(lc - 1).Name)
                    Next lc
  rs.MoveNext
    Next lr
     Selection.EntireRow.Insert
  
End Sub


Вот последняя версия кода вставки.8878
...
Рейтинг: 0 / 0
Вставка Recordset
    #39071419
Чип&Дейл
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Проблема немного изменилась) первые 3 записи из рекорда переносятся нормально, потом просто пустые строки и потом последняя снова нормально вставляется
...
Рейтинг: 0 / 0
Вставка Recordset
    #39071475
Чип&Дейл
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Может ли быть проблема из за документа?
...
Рейтинг: 0 / 0
Вставка Recordset
    #39071684
Фотография i45
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чип&ДейлДобрый день, уважаемые форумчане)
Подскажите как вставить все содержимое record в документ excel

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
Dim dbs As DAO.Database
Dim rs As DAO.Recordset
Set dbs = DAO.OpenDatabase ("C:\test.mdb")
Set rs=dbs.OpenRecordset("Select t1.p1, t1.p2, t1.p4, t1.p6, t1.p7, t1.p10 from t1")
Set ea=CreateObject("Excel.Application")
ea.Visible=true
Set ed=ea.Workbooks.Open("C:\test1.xls")



А вот дальше проблема возникает, как вставить записи из рекорда по порядку как они в нем записаны? и как вставить записи из рекорда в нужном мне порядке?
Например, в первом случае нужно вставить поля p1,p2,p4,p6,p7,p10 в A1,B1,C1,D1,E1 соответственно, а во втором случае эти же поля нужно вставить в A1,С1,D1,F1,G1


Возвратите два рекордсета и, как Вам посоветовал The_Prist, примените CopyFromRecordset к ним обоим. Цикл не нужен.
...
Рейтинг: 0 / 0
Вставка Recordset
    #39071686
Фотография i45
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чип&Дейл,

В запросе используйте ORDER BY
...
Рейтинг: 0 / 0
Вставка Recordset
    #39071707
Чип&Дейл
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не совсем понятно, зачем 2 рекордсета? Второму присвоить значение первого или просто в оба рекорда записать одинаковые запросы?
...
Рейтинг: 0 / 0
25 сообщений из 49, страница 1 из 2
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Вставка Recordset
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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