MyTetra Share
Делитесь знаниями!
Выгрузка данных из Access в шаблон Excel
Время создания: 16.03.2019 23:43
Текстовые метки: Импорт из текста, access, Excel-Access
Раздел: !Закладки - VBA - Access - Импорт из текста
Запись: xintrea/mytetra_db_adgaver_new/master/base/1484021403fld7xej1xa/text.html на raw.githubusercontent.com

В шаблоне Excel уже ненужно создавать поля как в Word, так как здесь мы уже будем ориентироваться по адресам ячеек.

Существует несколько способов, как заполнять Excel шаблон, я опишу два, первый это тогда когда Вам просто необходимо проставить несколько полей, т.е. в источнике данных будет всего одна строка с несколькими полями и второй это когда строк будет уже несколько, причем Вы не знаете, сколько именно (в зависимости от каких то условий), но в шаблоне по умолчанию отведено для этого все пару строк, поэтому мы будем нужные нам строки добавлять, для того чтобы наши данные не накладывалась на строки ниже (допустим там примечание, подпись руководителя и т.д.). И совет, я здесь для примера использую всего один источник данных, а вы, если Вам необходимо заполнить шапку,  примечание и некое количество строк (т.е. область данных) то для этих задач используйте несколько источников (Recordset).


Также добавьте кнопку на форму (я ее назвал testexcel) и вставляем следующий код в событие «нажатие кнопки»

Private Sub testexcel_Click()

'Объявляем переменные

Dim XL As Object

Dim XLT As Object

Dim newrow As Object

Dim rsd As ADODB.Recordset

Dim strSQL As String

Set rsd = New ADODB.Recordset

'Запрос к базе данных

strSQL = "select * from dbo.table where kod = " & Me.kod & ""

rsd.open strSQL, CurrentProject.Connection

'Создаем необходимые объекты

Set XL = CreateObject("Excel.Application")

'для примера показываю, как можно сразу загружать шаблон без выбора

Set XLT = XL.Workbooks.open("C:\testfile.xls")

'1 способ если источнике данных всего одна строка

With XLT.Worksheets("Лист1")

.[a1] = rsd.Fields("field1")

.[b1] = rsd.Fields("field2")

.[c1] = rsd.Fields("field3")

.[d1] = rsd.Fields("field4")

End With

'2 способ если строк в источнике несколько

'причем мы учтем то, что у нас есть шапка и примечание в Excel

'и мы не знаем, сколько строк у нас вставится

'и поэтому строки будем добавлять в случае необходимости

'зададим, с какой строки будем начинать вставлять данные

Rowss = 10

'для нумерации

numrow = 1

'запускаем цикл до тех пор, пока не закончатся строки в нашем источнике

While Not (rsd.EOF)

'смотрим, если строк больше чем мы задали в шаблоне

If Rowss >= 12 Then

'то добавляем строку

XLT.Worksheets("Лист1").Rows(Rowss).Insert

'Запомним нашу строку

Set newrow = XLT.Worksheets("Лист1").Rows(Rowss)

'и вставим туда копию предыдущей строки

'для того если вдруг у вас там есть объединенные ячейки или какие-то нужные данные

'так как новая строка создастся без всяких объединений и значений

XLT.Worksheets("Лист1").Rows(Rowss - 1).Copy newrow

'это просто для примера как можно очистить некий диапазон внутри документа

'XLT.Worksheets("Лист1").Range("A10:F10").ClearContents

'динамически формируем адрес нужной ячейки

cell = "a" & Rowss

'и задаем ей значение

XLT.Worksheets("Лист1").Range(cell) = numrow

cell = "b" & Rowss

XLT.Worksheets("Лист1").Range(cell) = rsd.Fields("field5").Value

'переходим на следующую строку

Rowss = Rowss + 1

'переходим на следующую строку в источнике данных

rsd.MoveNext

Else

'а это выполняется до тех пор, пока не закончатся заданные строки в шаблоне

'т.е. если строк в источнике всего 1 то в код, который выше мы даже не попадем

cell = "a" & Rowss

XLT.Worksheets("Лист1").Range(cell) = numrow

cell = "b" & Rowss

XLT.Worksheets("Лист1").Range(cell) = rsd.Fields("field5").Value

Rowss = Rowss + 1

rsd.MoveNext

End If

'для нумерации

numrow = numrow + 1

'конец цикла

Wend

'это просто пример как можно удалить строку целиком

'XLT.Worksheets("Лист1").Rows(20).Delete

'делаем Excel видимым

XL.Visible = True

'Очищаем переменные

Set XL = Nothing

Set XLT = Nothing

Set newrow = Nothing

End Sub

Здесь я также все подробно прокомментировал, но если есть вопросы, то задавайте их в комментариях к данной статье.

Для сведения я здесь при создании объекта и Word.Application и Excel.Application использовал позднее связывание, для того чтобы не добавлять необходимые библиотеки и обеспечить совместимость. Надеюсь, мои примеры Вам помогут!

 
MyTetra Share v.0.59
Яндекс индекс цитирования