Выгрузка данных по одному обращению к базе данных

NovPal
Дата: 29.02.2016 17:58:21
Добрый вечер,

Есть база данных, из которой нужно по определенным условиям выгрузить данные в excel в определенные ячейки. Пример во вложении. Подскажите, пожалуйста, можно ли решить эту задачу обратившись к базе данных всего один раз? Например, загрузив данные в recordset, и уже из recordset эти данные выгружать в ячейки. Запрос из которого выгружаются данные большой и если всегда к нему обращаться, то процедура будет выполняться долго. Спасибо.
NovPal
Дата: 29.02.2016 17:59:54
Predeclared
Дата: 29.02.2016 18:54:04
Конечно можно.

Проблема то в чем?
MrShin
Дата: 29.02.2016 19:05:04
Как-то так можно, например:

Set xlApp = CreateObject("Excel.Application")
xlApp.Visible = True
Set xlWork = xlApp.Workbooks.Open(strFileName)
Set xlSheet = xlWork.Sheets("Sheet1")

Set rst = CurrentDb.OpenRecordset("select * from MyTable")

xlSheet.Range("A1").CopyFromRecordset rst
NovPal
Дата: 29.02.2016 19:41:27
Predeclared
Конечно можно.

Проблема то в чем?


А подскажите, пожалуйста, как это можно сделать. Никак не могу сообразить как решить эту задачу
NovPal
Дата: 29.02.2016 19:44:10
MrShin,

В вашем примере, как я понимаю он будет копировать всю таблицу и выгружать ее в ексель. Но задача состоит в том, чтобы выгрузить не всю таблицу а из таблицы взять только определенные значения и их выгрузить в определенные ячейки в ексель. Т.е. нужно вместо "xlSheet.Range("A1").CopyFromRecordset rst" написать какой то алгоритм, который будет из рекордсета брать данные и разносить их по ячейкам. Спасибо.
Predeclared
Дата: 29.02.2016 19:51:03
NovPal
... написать какой то алгоритм, который будет из рекордсета брать данные и разносить их по ячейкам. ...

Ну так напиши.

Проблема в чем?

Получить данные в рекордсет?
Получить данные из рекордсета?
Присвоить значение ячейке?
NovPal
Дата: 29.02.2016 20:08:03
Я могу данные записать в рекордсет, но как из рекордсета их потом выгружать, не обращаясь к базе данных у меня не получается. Либо их выгружать таблицей, как предложил MrShin, либо макрос будет обращаться еще раз к базе данных.
mds_world
Дата: 29.02.2016 21:21:30
NovPal, если Вам привычнее в екселе с массивом, то Вы можете записать рекордсет в массив и далее обращаться к нему совершенно произвольно. Пример записи рекордсета в массив с помощью GetRows в предположении, что рекордсет уже создан
Dim massv, int1, int2
rst.MoveLast: rst.MoveFirst
'Записываем рекордсет в массив massv
massv=rst.GetRows(rst.RecordCount)
'Определяем размерности массива
int1=UBound(massv, 1)
int2=UBound(massv, 2)
Debug.Print int1, int2
MrShin
Дата: 01.03.2016 07:49:32
Можно выгрузить таблицу на скрытый лист, а нужные данные растащить по основному листу формулами.

Можно составить такой запрпрос к рекордсету, чтобы там появлялись в том числе и статические данные, необходимые для оформления, форматирование и валидацию можно скопировать позднее.

Можно дергать один рекордсет с с разными фильтрами

Можно наоткрывать кучу рекордсетов и использовать их на разных частях листа - правильно написанный рекордсет открывается мгновенно, результаты сложных медленных запросов можно записывать во временные таблицы для ускорения

Вариантов масса, в приведенном примере показана, пожалуй, самая быстрая технология записи в шаблон Экселя