Access заполнение шаблона word

3 / 3 / 0

Регистрация: 08.02.2011

Сообщений: 49

1

11.03.2011, 12:13. Показов 19128. Ответов 17


Студворк — интернет-сервис помощи студентам

Доброго времени суток.
Есть такая проблема:
Имеется таблица в Access, сформированная с помошью запросов и файл в Word со стандартной шапкой, типа «Начальнику от подчиненного» ну и т.д.
Нужно данные из таблицы поместить в этот файл с «шапкой» и закрыть оба приложения.



0



139 / 135 / 3

Регистрация: 27.07.2010

Сообщений: 342

11.03.2011, 12:27

2

Делаешь отчет с уже готовой шапкой и данными, На кнопку вешаешь макрос, где экспортируешь отчет в word (ЭкспортСФорматированием) и ВыходИзAccess или Закрыть форму.



0



3 / 3 / 0

Регистрация: 08.02.2011

Сообщений: 49

11.03.2011, 12:32

 [ТС]

3

Цитата
Сообщение от ashagin
Посмотреть сообщение

Делаешь отчет с уже готовой шапкой и данными, На кнопку вешаешь макрос, где экспортируешь отчет в word (ЭкспортСФорматированием) и ВыходИзAccess или Закрыть форму.

Спасибо. Как вариант попробую. Но хотелось бы узнать, есть возможность сделать так, как я описал задачу.



0



Модератор

Эксперт MS Access

11336 / 4655 / 748

Регистрация: 07.08.2010

Сообщений: 13,484

Записей в блоге: 4

11.03.2011, 14:01

4

иначе говоря

Код

--------------------------------------начальнику
--------------------------------------от

----------------------------------------------------------
шапка таблицы
---------------------------------------------------------
поле1:поле2:
----------------------------------------------------------
строка1
........................
строка №


-------------------------------подписи

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



0



3 / 3 / 0

Регистрация: 08.02.2011

Сообщений: 49

11.03.2011, 14:39

 [ТС]

5

Цитата
Сообщение от shanemac51
Посмотреть сообщение

иначе говоря

Код

--------------------------------------начальнику
--------------------------------------от

----------------------------------------------------------
шапка таблицы
---------------------------------------------------------
поле1:поле2:
----------------------------------------------------------
строка1
........................
строка №


-------------------------------подписи

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

Таблица простая как автомат Калашникова.
ФИО
Дата
Название
Ну может быть еще пару текстовых полей.
А вставлять данные в Word, необходимо по одной простой причине.
Фамилии начальников и подчиненных могут менятся.
Пользователю легче сделать это в Word-e.



0



Модератор

Эксперт MS Access

11336 / 4655 / 748

Регистрация: 07.08.2010

Сообщений: 13,484

Записей в блоге: 4

11.03.2011, 14:48

6

с вас вордовский прототип отчета —иначе не могу угадать, что-же вам надо получить в итоге



0



3 / 3 / 0

Регистрация: 08.02.2011

Сообщений: 49

11.03.2011, 15:28

 [ТС]

7

Цитата
Сообщение от shanemac51
Посмотреть сообщение

с вас вордовский прототип отчета —иначе не могу угадать, что-же вам надо получить в итоге

Вот примерно так нужно. См. аттач.
Заранее благодарен.



0



Модератор

Эксперт MS Access

11336 / 4655 / 748

Регистрация: 07.08.2010

Сообщений: 13,484

Записей в блоге: 4

11.03.2011, 17:23

8

Макет отчета для вашего случая



0



1179 / 630 / 39

Регистрация: 30.05.2010

Сообщений: 715

11.03.2011, 21:43

10

Здравствуйте San_Sanych.
возможно Вам будет интересен образец от LA (лидер Access).
Евгений.



2



3 / 3 / 0

Регистрация: 08.02.2011

Сообщений: 49

11.03.2011, 22:07

 [ТС]

11

Цитата
Сообщение от shanemac51
Посмотреть сообщение

Макет отчета для вашего случая

Благадарю за участие, но у нас на работе только Office 2003



0



Uno75S

2 / 2 / 0

Регистрация: 14.08.2015

Сообщений: 118

24.10.2017, 17:18

12

Добрый всем вечер!
У меня возникла такая проблема, заполняю таблицу в шаблоне word из запроса в Access, всё работает, но из-за того, что в запросе данные состоят из 4 полей но от 2000 до 6000 записей, этот процесс затягивается на очень долгое время((
Может кто подскажет как ускорить этот процесс?
Заполняю так:

Visual Basic
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
.................................................
Set app = New Word.Application
        app.Visible = True
        Set f = app.Documents.Add(strPathDot)
        
        
       
 
          Set newTable = f.Tables(1)
            i = 5
            suma = 0
           
             zapros.MoveFirst
                        While Not zapros.EOF
                        If Lot = zapros(1) Then
                        For j = 1 To 5
                        newTable.Cell(i, j).Range.Borders.OutsideLineWidth = wdLineWidth075pt
                        newTable.Cell(i, j).Range.Borders.OutsideColor = wdColorAutomatic
                        newTable.Cell(i, j).Range.Borders(wdBorderBottom).Color = wdColorBlack
                        Next j
                        
                        newTable.Cell(i, 1).Range.ParagraphFormat.Alignment = wdAlignParagraphLeft
                        newTable.Cell(i, 2).Range.ParagraphFormat.Alignment = wdAlignParagraphLeft
                        newTable.Cell(i, 3).Range.ParagraphFormat.Alignment = wdAlignParagraphLeft
                               newTable.Cell(i, 1).Range.Text = i - 4
                               newTable.Cell(i, 2).Range.Text = zapros(2)
                               newTable.Cell(i, 3).Range.Text = zapros(3)
                               newTable.Cell(i, 4).Range.Text = zapros(5)
                               newTable.Cell(i, 5).Range.Text = Format(zapros(4), "0.00")
                               
                               suma = suma + zapros(4)
                               i = i + 1
                              
                               newTable.Rows.Add
                        End If
                        zapros.MoveNext
                        Wend
                        'записываем всего в конце таблицы
                        newTable.Cell(i, 2).Range.Words(1).Font.Bold = True
                        newTable.Cell(i, 5).Range.Words(1).Font.Bold = True
                       
                        newTable.Cell(i, 2).Range.Text = "Всего"
                        newTable.Cell(i, 5).Range.Text = Format(suma, "0.00")
....................................................................................



0



Модератор

Эксперт MS Access

11336 / 4655 / 748

Регистрация: 07.08.2010

Сообщений: 13,484

Записей в блоге: 4

24.10.2017, 17:55

13

Цитата
Сообщение от Uno75S
Посмотреть сообщение

2000 до 6000 записей

это примерно от 40 до 100 страниц —это слишком много для таблицы в ворд
более разумно делать гладкий текст(если конечно это возможно)

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

ФИО Дата Подразделение Коментарии
Пронькин 12.12.2010 Транспортный цех  
Пупкин 13.01.2011 Бухгалтерия  



0



2 / 2 / 0

Регистрация: 14.08.2015

Сообщений: 118

24.10.2017, 21:00

14

Пример таблицы:

Инвентарный номер Название Адрес Цена
1 7259-020 Шкаф Prestige GTP new C-11 Иркутская область, Мамско-Чуйский Район, поселок Колотовка, улица Набережная д.2 1548.23
2 9861-020 Платежный терминал T7Plus Иркутская область, Мамско-Чуйский Район, поселок Колотовка, улица Набережная д.2 15234.54

А что такое «гладкий текст»?



0



Модератор

Эксперт MS Access

11336 / 4655 / 748

Регистрация: 07.08.2010

Сообщений: 13,484

Записей в блоге: 4

25.10.2017, 06:56

15

Цитата
Сообщение от Uno75S
Посмотреть сообщение

А что такое «гладкий текст»?

обычный текст без таблиц и надписей



0



2 / 2 / 0

Регистрация: 14.08.2015

Сообщений: 118

25.10.2017, 08:46

16

Дело в том, что это у меня идёт шаблон договора, там кроме таблицы ещё и текст, с некоторыми данными, которые тоже с запроса вставляются, только с другого. Мне нужно именно так и вставлять эту таблицу. Где-то я читал, что таблица намного быстрее вставляется через параграфы, но не знаю как это делать. Форматирование таблицы не особо важно.



0



Модератор

Эксперт MS Access

11336 / 4655 / 748

Регистрация: 07.08.2010

Сообщений: 13,484

Записей в блоге: 4

25.10.2017, 09:12

17

Цитата
Сообщение от Uno75S
Посмотреть сообщение

Где-то я читал, что таблица намного быстрее вставляется через параграфы

не уверена, что это так
вариантов же создания вордовского документа —более 10
но в любом случае таблица в 100 страниц будет очень долго открываться и не на каждом компе хватит силенок на ее открытие

многое зависит от конкретики(лично я предпочитаю формировать программно НТМ документ(доли секунды) и уже его открывать вордом при необходимости

если надо только просмотр —для этого достаточно броузера

при таблицах в 100 страниц —разумнее выводить их в ексель



1



2 / 2 / 0

Регистрация: 14.08.2015

Сообщений: 118

25.10.2017, 09:20

18

А можно например реализовать весь процесс так, чтоб сначала по одному запросу с Access заполнялся данными шаблон Word, потом создавалась новая книга и в нее вставлялись данные с другого запроса (таблица), и потом скопировать и вставить как таблицу в нужное место в этом шаблоне word, а книгу удалить потом?



0



IT_Exp

Эксперт

87844 / 49110 / 22898

Регистрация: 17.06.2006

Сообщений: 92,604

25.10.2017, 09:20

Помогаю со студенческими работами здесь

Код VB на кнопку для экспорта данных из Access в шаблон Word
Доброго времени суток!
Помогите валенку, необходимо чтобы при нажатии на кнопку в форме в…

Формирование таблицы access из данных документа Word
У меня проблема в том, что я не могу понять как и где доставать данные из word в access.

Выгрузка данных из полей формы Access 2007 в Word 2007 шаблон dot 1997-2003 гг
Прошу помощи с примером из protokol10.

Он завязан на генерацию doc-документа со вставкой…

Запись данных в связанные таблицы Access 2007
Ребят. Реально помощь нужна.
Перечитал обрывков и брошюрок тьму — голова уже кругом, толку — ноль….

MS Access — запись данных в разные таблицы при заполнении полей (справочников) на форме
Уважаемые гуру MS Access и VBA, плиз, хэлп!! )
Уже кучу уроков прочитала на сайте MS, а также по…

Как вычислять значения вне таблицы WORD, с использованием данных из таблицы WORD
Ув. прпограммисты, подскажите пожалуйста, как вычислять значения вне таблицы WORD, с использованием…

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:

18

Всем привет, сегодня мы поговорим о том, как можно выгрузить данные из Access в такие приложения как Word и Excel. Но не о стандартном способе, который есть в  Access (связь с Office), а о способе, который позволяет выгружать данные в заданный шаблон как в Word, так и в Excel.

Другими словами, это нужно тогда, когда создать отчет в Access по шаблону, который уже существует, например, в Word, невозможно или слишком трудоемко. Как Вы знаете, отчет в Access может выводиться просто коряво или, самый распространенный вариант, это когда много текста, который в отчете Access не так хорошо форматируется как в Word, а данных не так много, но отчет необходимо автоматизировать, например это какие-то договора, заявления и так далее.

Использование слияния из самого Word-а не очень удобно, поэтому сегодня я расскажу, как можно заполнять такие шаблоны напрямую из Access, путем нажатия на одну кнопку.

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

Содержание

  1. Экспорт данных из Access в шаблон Word
  2. Код VBA для выгрузки данных в шаблон Word
  3. Экспорт данных из Access в шаблон Excel
  4. Код VBA для выгрузки данных в шаблон Excel

Вся разработка делится на две части, это:

  • Настройка шаблона Word;
  • Настройка выгрузки данных в шаблон.

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

Примечание! Я использую Microsoft Word 2003.

Открываем шаблон Word, для начала добавим необходимую панель инструментов, для этого нажимаем «Вид -> Панель инструментов» и ставим галочку «Формы». Теперь у Вас отобразилась панель инструментом «Формы». Все, что осталось сделать — это вставить в местах, в которых необходимо выводить данные, элементы «Текстовое поле», которые доступны на только что добавленной панели инструментов.

После добавления поля, у Вас появится серая область, которая свидетельствует о том, что поле добавлено. Теперь необходимо задать имя этого поля, для того чтобы потом из access вставлять в него значения (стандартное названия не очень удобное). Для этого щелкните правой кнопкой мыши по полю и нажмите «Свойства». В поле закладка напишите желаемое имя этого поля, я в примере назвал его MyTestPole.

Скриншот 1

Курс по SQL для начинающих

Создайте столько полей, сколько Вам нужно.

На этом настройка шаблона закончена, рекомендую сделать этот шаблон только для чтения, а то пользователь возьмет, сформирует документ и сохранит его, и шаблон тем самым потеряется, а если сделать его только для чтения, то у него такой возможности не будет, только сохранять через «Сохранить как».

Переходим к более интересной задачи, это к реализации самой выгрузки из Access в этот шаблон на VBA.

Примечание! Я использую Access в связке с MS SQL 2008, поэтому и данные буду брать от туда.

Код VBA для выгрузки данных в шаблон Word

Допустим, у Вас есть форма, сделайте на ней кнопку (я назвал ее testbutton) и в событие нажатие кнопки вставьте следующий код VBA:

   
   Private Sub testbutton_Click()
   
   'Объявляем переменные
   Dim FileDialog As FileDialog
   Dim rsd As ADODB.Recordset
   Dim strSQL As String
   Dim WordApOb As Object
   Dim WordOb As Object
   Dim path As String
   Set rsd = New ADODB.Recordset
   
   'запрос к базе данных для получения необходимых данных
   strSQL = "select * from dbo.table where KOD = " & Me.kod & ""
   rsd.open strSQL, CurrentProject.Connection
  
  'Выбираем шаблон
   Set FileDialog = Application.FileDialog(msoFileDialogOpen)
   
   'убираем множественный выбор, он нам не нужен
   FileDialog.AllowMultiSelect = False
  
  'очистим и установим фильтры
   FileDialog.Filters.Clear
   FileDialog.Filters.add "Word", "*.doc"
   
   'установим фильтр по умолчанию
   FileDialog.FilterIndex = 1
   
   'проверяем, что сделал user, если выбрал шаблон, то начинаем работу
   If FileDialog.Show = False Then
     'Если нет, то выходим
     Set dlgFile = Nothing
     Exit Sub
   End If
   
   'получаем путь к файлу
   path = Trim(FileDialog.SelectedItems(1))
   
   'Очистим переменную
   Set FileDialog = Nothing
   If path <> "" Then
   
   'Будем отслеживать ошибки
   On Error GoTo Err_testbutton_Click
   
   'Создаем объект Word
   Set WordOb = CreateObject("Word.document")
   
   'Задаем нашему документу значение из шаблона
   Set WordOb = GetObject(path)
   
   'Задаем значение объекту word.Application
   Set WordApOb = WordOb.Parent
   
   'делаем приложение word видимым
   WordApOb.Visible = True
   
   'ищем наше поле в шаблоне
   WordOb.Bookmarks("mytestpole").Select
   
   'задаем ему новое значение из нашего Recordset
   WordApOb.Selection.TypeText Text:=Nz(rsd.Fields("field").Value, " ")
   'и так далее по всем полям
   
   'в конце перейдем на начало нашего документа
   WordApOb.Selection.Goto wdGoToFirst
   'и активируем его
   WordApOb.Activate
   
   'Очистим переменные
   Set WordOb = Nothing
   Set WordApOb = Nothing
   
   Exit_testbutton_Click:
     Exit Sub
   
   Err_testbutton_Click:
     MsgBox Err.Description
     'в случае ошибки будем делать следующие
     'закроем word без сохранения
     WordOb.Close (wddonotsavechanges)
     WordApOb.Quit
    'и также очистим переменные
     Set WordOb = Nothing
     Set WordApOb = Nothing
     Resume Exit_testbutton_Click
    End If
   
   End Sub

Код прокомментирован, поэтому сложностей возникнуть не должно. Здесь весь смысл сводится к созданию объекта word.document и word.application. А после мы уже работаем с нашими объектами, т.е. заполняем их.

Экспорт данных из Access в шаблон Excel

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

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

Код VBA для выгрузки данных в шаблон Excel

Сначала добавьте кнопку на форму (я ее назвал 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 использовал позднее связывание, для того чтобы не добавлять необходимые библиотеки и обеспечить совместимость.

Надеюсь, мои примеры Вам помогут!

Всем привет, сегодня поговорим о выгрузки данных из Access в такие приложения как Word и Excel. Но не о стандартном способе, который есть в  Access (связь с Office), а о способе, который позволяет выгружать данные в заданный шаблон как в Word, так и в Excel.

Другими словами это нужно тогда когда создать отчеты в Access по шаблону, который уже существует, например, в Word, невозможно или слишком трудоемко или как Вы знаете, может получаться просто коряво или самый распространенный вариант это когда много текста, который в отчете Access не так хорошо форматируется как в Word, а данных не так много, но необходимо автоматизировать, например это какие-то договора, заявления и так далее. Использование слияния из самого Word-а не очень удобно, поэтому я расскажу сегодня, как можно заполнять такие шаблоны напрямую из Access, путем нажатия на одну кнопку. Также как и необходимость выгрузки в шаблон Word, существует и необходимость выгрузки в шаблон Excel, и этот способ мы тоже сегодня рассмотрим.

Начнем с Word.

Вся разработка делится на две части это:

• Настройка шаблона Word;

• Настройка выгрузки данных в шаблон.

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

Открываем шаблон Word, для начала добавим необходимую панель инструментов, для этого нажимаем вид->панель инструментов и ставим галочку «формы». Теперь у вас отобразилась панель инструментом «Формы» все, что осталось сделать это встать на то место где необходимо добавить нужное поле и на панели выбрать «Текстовое поле». После в том месте у Вас появится серая область, которая свидетельствует о том, что поле добавлено. Теперь  необходимо задать имя этого поля, для того чтобы потом из access вставлять в него значения (стандартное названия не очень удобное). Для этого щелкните правой кнопкой мы по полю и нажмите «Свойства». В поле закладка напишите желаемое имя этого поля, я в примере назвал его MyTestPole

Создайте столько полей, сколько Вам нужно.

Ну и настройка шаблона закончена, только единственное сделайте этот шаблон только для чтения, а то пользователь возьмет, сформирует документ и сохранит его, и шаблон тем самым потеряется, а если сделать только для чтения, то у него такой возможности не будет только сохранять через «Сохранить как».

Переходим к более интересной задачи это к реализации самой выгрузки из Access в этот шаблон.

Примечание! Я использую Access в связке с MS Sql 2008 поэтому и данные буду брать от туда.

Допустим у Вас есть форма, сделайте на ней кнопку (я назвал ее testbutton) и в событие нажатие кнопки вставьте следующий код:

Private Sub testbutton_Click()

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

Dim FileDialog As FileDialog

Dim rsd As ADODB.Recordset

Dim strSQL As String

Dim WordApOb As Object

Dim WordOb As Object

Dim path As String

Set rsd = New ADODB.Recordset

‘запрос к базе данных для получения необходимых данных

strSQL = «select * from dbo.table where KOD = » & Me.kod & «»

rsd.open strSQL, CurrentProject.Connection

‘Выбираем шаблон

Set FileDialog = Application.FileDialog(msoFileDialogOpen)

‘убираем множественный выбор, он нам не нужен

FileDialog.AllowMultiSelect = False

‘очистим и установим фильтры

FileDialog.Filters.Clear

FileDialog.Filters.add «Word», «*.doc»

‘установим фильтр по умолчанию

FileDialog.FilterIndex = 1

‘проверяем, что сделал user если выбрал шаблон, то начинаем работу

If FileDialog.Show = False Then

‘Если нет то выходим

Set dlgFile = Nothing

Exit Sub

End If

‘получаем путь к файлу

path = Trim(FileDialog.SelectedItems(1))

‘Очистим переменную

Set FileDialog = Nothing

If path <> «» Then

‘Будем отслеживать ошибки

On Error GoTo Err_testbutton_Click

‘Создаем объект Word

Set WordOb = CreateObject(«Word.document»)

‘Задаем нашему документу значение из шаблона

Set WordOb = GetObject(path)

‘Задаем значение объекту word.Application

Set WordApOb = WordOb.Parent

‘делаем приложение word видимым

WordApOb.Visible = True

‘ищем наше поле в шаблоне

WordOb.Bookmarks(«mytestpole»).Select

‘задаем ему новое значение из нашего Recordset

WordApOb.Selection.TypeText Text:=Nz(rsd.Fields(«field»).Value, » «)

‘и так далее по всем полям

‘в конце перейдем на начало нашего документа

WordApOb.Selection.Goto wdGoToFirst

‘и активируем его

WordApOb.Activate

‘Очистим переменные

Set WordOb = Nothing

Set WordApOb = Nothing

Exit_testbutton_Click:

Exit Sub

Err_testbutton_Click:

MsgBox Err.Description

‘в случае ошибки будем делать следующие

‘закроем word без сохранения

WordOb.Close (wddonotsavechanges)

WordApOb.Quit

‘и также очистим переменные

Set WordOb = Nothing

Set WordApOb = Nothing

Resume Exit_testbutton_Click

End If

End Sub


Код прокомментирован, поэтому сложностей возникнуть не должно. Здесь весь смысл сводится к созданию объекта word.document и word.application, конечно же. А после мы уже работаем с нашими объектами, т.е. заполняем их.

Теперь перейдем к Excel.

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

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

Всем привет, сегодня мы поговорим о том, как экспортировать данные из Access в такие приложения, как Word и Excel. Но не о стандартном способе доступа (подключение к Office), а о том, как он позволяет загружать данные в определенный шаблон как в Word, так и в Excel.

Другими словами, это необходимо, когда невозможно или занимает слишком много времени, чтобы создать отчет в Access с использованием уже существующего шаблона, например, в Word. Как вы знаете, отчет в Access может отображаться просто неудобно или, что наиболее распространенный вариант, возникает, когда в отчете Access много текста, который не отформатирован так сильно, как в Word, и данных не так много, но отчеты должны быть автоматизированы, например, некоторые контракты, банковские выписки и так далее.

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

Помимо загрузки в шаблон Word, иногда возникает необходимость загрузить в шаблон Excel, и сегодня мы рассмотрим и этот метод.

Вся разработка разделена на две части, это:

  • Настройка шаблона Word;
  • Настройка загрузки данных по модели.

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

Примечание! Я использую Microsoft Word 2003.

Откройте шаблон Word, сначала добавьте необходимую панель инструментов, для этого нажмите «Вид -> Панель инструментов» и установите флажок «Формы». Вы открыли панель с инструментом «Формы». Все, что остается, — это вставить в те точки, где вы хотите просмотреть данные, элементы «Текстовое поле», доступные на недавно добавленной панели инструментов.

После добавления поля у вас будет серая область, указывающая на то, что поле было добавлено. Теперь вам нужно задать имя этого поля, а затем вставить значения из доступа (стандартное имя не очень удобно). Для этого щелкните поле правой кнопкой мыши и выберите «Свойства». В поле закладки напишите желаемое имя для этого поля, в примере я назвал его MyTestPole.

Экран 1

На этом настройка шаблона завершена, я рекомендую сделать этот шаблон доступным только для чтения, в противном случае пользователь возьмет, сформирует документ и сохранит его, а затем шаблон будет утерян, а если вы сделаете его доступным только для чтения, он не будет есть возможность сохранить только через «Сохранить как».

Перейдем к более интересной задаче, это реализация той же загрузки из Access в этом шаблоне в VBA.

Примечание! Я использую Access в сочетании с MS SQL 2008, поэтому я буду получать данные оттуда.

Код VBA для выгрузки данных в шаблон Word

Допустим, у вас есть форма, создайте на ней кнопку (я назвал ее testbutton) и вставьте следующий код VBA в событие нажатия кнопки:

Private Sub testbutton_Click () ‘Объявить переменные Dim FileDialog As FileDialog Dim rsd As ADODB.Recordset Dim strSQL As String Dim WordApOb As Object Dim WordOb As Object Dim path As String Set rsd = New ADODB.Recordset’ запрашивает необходимые данные в базе данных strSQL = «select * from dbo.table where KOD =» & Me.kod & «» rsd.open strSQL, CurrentProject.Connection ‘Выбрать шаблон Set FileDialog = Application.FileDialog (msoFileDialogOpen)’ удалить множественный выбор, он мне не нужен FileDialog .AllowMultiSelect = False ‘очистить и установить фильтры FileDialog.Filters.Clear FileDialog.Filters.add «Word», «* .doc»‘ установить фильтр по умолчанию FileDialog.FilterIndex = 1 ‘проверить, что пользователь, если он выбрал шаблон, затем начать работу Если FileDialog.Show = False Then ‘Если нет, то выйти Set dlgFile = Nothing Exit Sub End If’ получить путь к пути к файлу = Trim (FileDialog.SelectedItems (1)) ‘Удалить переменную Set FileDial og = Nothing If path «» Then ‘Построить график ошибок при ошибке GoTo Err_testbutton_Click’ Создать объект Word Set WordOb = CreateObject («Word.document») ‘Установить для нашего документа значение из шаблона Set WordOb = GetObject (path) ‘Установите значение для слова. Application Object Set WordApOb = WordOb.Parent’ сделайте слово приложения видимым WordApOb.Visible = True ‘найдите наше поле в шаблоне WordOb.Bookmarks («mytestpole»). Выберите «установить новое значение из нашего набора записей WordApOb.Selection.TypeText Text: = Nz (rsd.Fields (» field «). Value,» «)» и так далее для всех полей «в конце перейдите к начало нашего документа WordApOb.Selection.Goto wdGoToFirst ‘и активируйте его WordApOb.Activate’ Удалите переменные Set WordOb = Nothing Set WordApOb = Nothing Exit_testbutton_Clicktest: Exit Sub Err_testbutton MsgBox.Description ‘в случае ошибки мы сделаем следующее без сохранения WordOb.Close (wddonotsavechanges) WordApOb.Quit ‘, а также удалить переменные Set WordOb = Nothing Set WordApOb = Nothing Resume Exit_testbutton_Click End End Sub

Код закомментирован, поэтому сложностей возникнуть не должно. Дело здесь сводится к созданию объекта word.document и word.application. И тогда мы уже работаем с нашими объектами, например, их компилируем.

Экспорт данных из Access в шаблон Excel

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

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

Код VBA для выгрузки данных в шаблон Excel

Сначала добавьте кнопку в форму (я назвал ее testexcel) и вставьте следующий код в событие Button Click».

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’ Query database 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 способ — если источник данных имеет только одну строку с XLT.Worksheets («Sheet1»). [A1] = rsd.Fields («field1»). [B1] = rsd.Fields («field2»). [c1] = rsd.Fields («поле3»). [d1] = rsd.Fields («field4») Заканчивается на ‘2 способ — если в источнике несколько строк’ и мы учтем, что у нас есть заголовок и заметка в Excel ‘и мы не знаем сколько строк мы вставим ‘а затем мы добавим строки, если необходимо’ мы установим, с какой строки мы начнем вставлять данные Rows = 10 ‘для нумерации и numrow = 1’ мы запускаем цикл, он будет работать, пока мы не запустим вне строк в нашем источнике While Not (rsd.EOF) ‘посмотрите, есть ли больше строк, чем мы установили в модели If Rowss> = 12 Then’, затем добавьте строку XLT.Worksheets («Sheet1»). Rows (Rowss) .Insert ‘Помните нашу строку Set newrow = XLT.Worksheets («Sheet1»). Rows (Rowss) ‘и поместите туда копию предыдущей строки’, если вдруг появятся объединенные ячейки или потребуются некоторые данные, «потому что новая строка будет создана без каких-либо объединений и значений XLT». XLT.Worksheets («Sheet1»). Диапазон («A10: F10»). ClearContents ‘динамически формирует адрес желаемой ячейки cell = «a» & Rowss’ и устанавливает для него значение XLT.Worksheets («Sheet1»). Range (cell) = numrow cell = «b» & Rowss XLT.Worksheets («Sheet1» Range (cell) = rsd.Fields («field5»). Value ‘перейти к следующей строке Rows = Rows + 1’ перейти к следующей строке in — это источник данных rsd.MoveNext Else ‘, и это выполняется до указанных строк в шаблоне’, т.е если в источнике есть только 1 строка, мы даже не будем входить в код выше cell = «a» и Rowss XLT.Worksheets («Sheet1»). Range (cell) = numrow cell = «b» и Rowss XLT.Worksheets («Sheet1»). Range (cell) = rsd.Fields («field5»). Value Rowss = Rowss + 1 rsd.MoveNext End If ‘для нумерации numrow = numrow + 1’ конец цикла Wend ‘- это просто пример того, как вы можете полностью удалить строку’ XLT.Worksheets («Sheet1»). Rows (20) .Delete ‘делает Excel XL visible .Visible = True ‘Очистить переменные Set XL = Nothing Set XLT = Nothing Set newrow = Nothing End subtitle

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

Для информации я использовал позднее связывание при создании объектов Word.Application и Excel.Application, чтобы не добавлять необходимые библиотеки и обеспечить совместимость.

Надеюсь, мои примеры вам помогут!

03. Данный пример показывает как можно быстро создать документ Word из Microsoft Access, используя шаблон *.dot. Для разметки документа используются специальные закладки.

'==============================================================
'   Создание документа Word по шаблону
'   • Для этого Вы должны создать в Word шаблон la_automat.dot
'   и поставить в нем Закладки, имеющие такие же имена как в форме.
'   Например, Вставка - Закладка ... - Имя закладки=Фирма
'   (Нажмите кнопку Добавить и сохраните шаблон)
'
Private Sub butNewWord_Click()
Dim app As Word.Application  'Приложение программы
Dim strDOC As String ' Имя документа
Dim strDOT As String ' Имя шаблона
Dim ctl As Control ' Управляющие элементы в форме
Dim s As String ' Вспомогательная строка
    
    On Error GoTo 999
    ' Определяем имена шаблона и документа Word
    With Application.CurrentProject
        strDOT = .Path  ""  "la_automat.dot"
        strDOC = .Path  ""  "la_automat.doc"
    End With
    
    ' Управление документом Word
    Set app = New Word.Application 'Новое приложение Word
    app.Visible = True 'Отображаем документ
    app.Documents.Add strDOT 'Добавляем шаблон
    With app.ActiveDocument  'Выбираем активный документ
        On Error Resume Next ' Отключаем ошибки
        ' Просматриваем все элементы формы, если
        ' такой закладки нет, то очищаем поток от ошибки
        For Each ctl In Me.Controls
            If ctl.ControlType = acTextBox Then
                s = ctl.Name ' Определяем название элемента
                .Bookmarks.Item(s).Range.Text = Me(s) 'Устанавливаем текст
                Err.Clear ' Очищаем поток от ошибки при отсутствии элемента
            End If
        Next ctl
        .SaveAs strDOC ' Сохраняем файл
        On Error GoTo 999 ' Включаем обработку ошибки
    End With
    ' app.Quit 'Закрываем приложение
    Exit Sub
999:
    MsgBox Err.Description  'Ошибка
    Err.Clear
    app.Quit
End Sub

Понравилась статья? Поделить с друзьями:
  • Access word что это такое
  • Access word from chrome
  • Access word 2007 скачать
  • Access with excel database engine
  • Access violation at address word