Макрос access в word

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

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

gordan11

1 / 1 / 1

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

Сообщений: 240

1

13.12.2014, 22:54. Показов 15087. Ответов 18

Метки нет (Все метки)


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

Здравствуйте, подскажите как сделать, или в каком направлении гуглить. Мне нужно запусть макрос в access, который открывает файл word. На просторах интернета нашел код.

Visual Basic
1
2
3
4
Dim WD
    Set WD = CreateObject("Word.Application")
    WD.Visible = True
    WD.Documents.Open FileName:="G:UsersNOUTDesktop11.doc"

Он запускает Word документ но:

  • Word свернут
  • Нужно указывать полный путь к файлу

Как можно исправить эти «но», и можно ли их вообще исправит?



0



Alex77755

11482 / 3773 / 677

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

Сообщений: 11,145

13.12.2014, 23:34

2

Visual Basic
1
2
3
    WD.Application.WindowState = 2' свернуть
    WD.Application.WindowState = 0' в окно
    WD.Application.WindowState = 1' полній экран

Добавлено через 2 минуты
По второму вопросу: можно искать рядом с программой

Visual Basic
1
FileName:=app.path & "1.doc"



1



1 / 1 / 1

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

Сообщений: 240

13.12.2014, 23:54

 [ТС]

3

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

По второму вопросу: можно искать рядом с программой
Код Visual Basic
1
FileName:=app.path & «1.doc»

На этой строке выдает ошибку:
run-time error 424
object required



0



11482 / 3773 / 677

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

Сообщений: 11,145

14.12.2014, 00:02

4

А есть файл рядом с программой?

Добавлено через 3 минуты
Сорри не APP надо



0



1 / 1 / 1

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

Сообщений: 240

14.12.2014, 00:07

 [ТС]

5

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

А есть файл рядом с программой?

Да файл в той же папке

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

Сорри не APP надо

Без app ищет файл в C:windowssystem32

Добавлено через 2 минуты
А как можно получить путь от куда запускается макрос?



0



Alex77755

11482 / 3773 / 677

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

Сообщений: 11,145

14.12.2014, 00:09

6

Лучший ответ Сообщение было отмечено gordan11 как решение

Решение

Visual Basic
1
FileName:=CurrentProject.Path & "1.doc"

Добавлено через 1 минуту
APP это в бейсике. Проморгал, что не тот раздел



1



gordan11

1 / 1 / 1

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

Сообщений: 240

14.12.2014, 00:15

 [ТС]

7

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

APP это в бейсике. Проморгал, что не тот раздел

Бывает Главное что помог. Спасибо файл открывает
Только вот, все равно в свернутом окне

Visual Basic
1
2
3
4
5
Dim WD
    Set WD = CreateObject("Word.Application")
    WD.Visible = True
    WD.Application.WindowState = 2
    WD.Documents.Open FileName:=CurrentProject.path & "1.doc"



0



Alex77755

11482 / 3773 / 677

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

Сообщений: 11,145

14.12.2014, 00:18

8

Что написал так и делает!
Я же просто перечислил варианты состояния. Надо выбрать нужный

Visual Basic
1
WD.Application.WindowState = 1



0



1 / 1 / 1

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

Сообщений: 240

14.12.2014, 00:21

 [ТС]

9

Ну как я понял это

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

Код Visual Basic
1
WD.Application.WindowState = 1

открывает word в свернутом состоянии, а мне нужно открывать не в свернутом. Я наверное не правильно сформулировал вопрос)



0



Alex77755

11482 / 3773 / 677

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

Сообщений: 11,145

14.12.2014, 00:57

10

Я смоделировал ситуацию (правда из ексел, но это не важно)
И выполнил в пошаговом режиме

Visual Basic
1
2
3
 WD.Application.WindowState = 2' свернуть
 WD.Application.WindowState = 0' в окно
 WD.Application.WindowState = 1' полній экран

И всё отрабатыватся



1



1 / 1 / 1

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

Сообщений: 240

14.12.2014, 11:40

 [ТС]

11

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

Я смоделировал ситуацию (правда из ексел, но это не важно)
И выполнил в пошаговом режиме

Понял)) Я пробовал вставлять только одну строку, когда вставил все три — Заработало)



0



1 / 1 / 1

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

Сообщений: 78

10.07.2015, 17:28

12

а как сделать чтоб открываемый файл запускался поверх всех окон



0



texnik-san

шапоклякистка 8-го дня

3674 / 2234 / 391

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

Сообщений: 4,647

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

11.07.2015, 09:47

13

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

а как сделать чтоб открываемый файл запускался поверх всех окон

WD.Activate

Добавлено через 2 минуты

Visual Basic
1
2
3
4
5
6
Dim WD As Object
    Set WD = CreateObject("Word.Application")
    WD.Documents.Open FileName:=CurrentProject.Path & "1.doc"
    WD.Visible = True
    WD.Application.WindowState = 1
    WD.Activate



0



1 / 1 / 1

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

Сообщений: 78

12.07.2015, 06:13

14

WD.Activate грубо говоря дописать… Спасибо работает



0



0 / 0 / 0

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

Сообщений: 5

15.06.2017, 08:32

15

Добрый день всем,
Помогите пожалуйста, тоже самое повторить только со слиянием. Есть форма «Запросы» с кнопкой открытия файла Word, все открывается и работает, но вот не задача, нужно чтобы было слияния еще с таблицей «Запросы». Подскажите пожалуйста

Добавлено через 15 секунд
Добрый день всем,
Помогите пожалуйста, тоже самое повторить только со слиянием. Есть форма «Запросы» с кнопкой открытия файла Word, все открывается и работает, но вот не задача, нужно чтобы было слияния еще с таблицей «Запросы». Подскажите пожалуйста



0



Juliya_pjv

0 / 0 / 0

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

Сообщений: 2

15.03.2018, 14:20

16

Здравствуйте! Использовала для запуска Word макрос, который предложил автор темы:

Visual Basic
1
2
3
4
Dim WD
    Set WD = CreateObject("Word.Application")
    WD.Visible = True
    WD.Documents.Open FileName:="G:UsersNOUTDesktop11.doc"

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



0



Модератор

Эксперт MS Access

11342 / 4661 / 748

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

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

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

15.03.2018, 14:45

17

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

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

а зачем вам слияние, если запускаете из аксесс

в аксессе сделайте ленточную форму
—для поиска и фильтрации по нескольким полям
—в шаблон ворда поместите закладки(или поля замены) , чтобы показать, куда делать вставки
—небольшой код для вывода данных выбранной строки в шаблон word(вариантов более 10)



0



0 / 0 / 0

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

Сообщений: 2

16.03.2018, 08:38

18

Так слишком много всего переделывать придется.



0



Модератор

Эксперт MS Access

11342 / 4661 / 748

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

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

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

16.03.2018, 09:34

19

выложите пример базы и шаблона(со слиянием)
+сколько примерно у вас шаблонов

Добавлено через 2 минуты

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

Так слишком много всего переделывать придется.

глаза боятся а руки делают
переделывать —это одноразовая работа
а выбор и запуск на выполнение —десятки-сотни раз



0



Использование слияния для отправки данных Access в Word

Access для Microsoft 365 Access 2021 Access 2019 Access 2016 Access 2013 Access 2010 Access 2007 Еще…Меньше

Слияние — отличный способ заработать в Access. В этом видео показано, как создать типичную букву формы в Microsoft Word, начав с команды «Объединить в Word» Access. При этом ознакомьтесь с основными действиями, которые приведены ниже.

Примечание: Это видео было записано с помощью Access 2013, но основные действия применяются к Access 2010, Access 2016 и версии Access, которая распространяется по подписке.

Ваш браузер не поддерживает видео.

В этом видео

Вот как можно создать слияние почты Word в Access:

  1. Откройте базу данных Access с адресами, которые вы хотите объединить с Word.

  2. Если не открыта области навигации, нажмите F11, чтобы открыть ее.

  3. Выберите таблицу или запрос с адресами. Если поля адресов находятся в нескольких таблицах, создайте простой запрос на выборки, содержащий нужные поля, и выберите его для слияния.

  4. На вкладке «Внешние данные» в группе «Экспорт» нажмите кнопку «Слияние Word».

  5. Откроется диалоговое окно мастера слияния Microsoft Word.

    Выберите, чтобы связать данные с существующим документом Word или создать новый.

  6. Выберите, следует ли мастер связывать адресные данные с существующим документом Word или начинать с нового пустого документа.

  7. Нажмите кнопку ОК.

Word запускает и отображает вкладку «Рассылки» и области «Слияние».

  1. Для работы с мастером щелкните ссылки «Далее» и «Предыдущее» в нижней части области слияния.

  2. На шаге 3 мастера выбирать список получателей не нужно. Это было определено, когда вы выбрали его в Access. Однако вы можете настроить список, нажав кнопку «Изменить список получателей». В открываемом окне можно удалить отдельных получателей из слияния, применить фильтры, отсортировать список и так далее.

  3. На шаге 4 мастера напишите письмо (если вы не работаете с существующим документом).

  4. Поместите курсор в документе в то место, где должны отображаться данные адреса, и щелкните «Блок адреса», «Строка приветствия» или «Другие элементы» на области слияния, чтобы вставить данные Access в документ. В появившись полях выберите нужный формат и нажмите кнопку «Подбор полей», чтобы убедиться в правильном совпадении полей.

  5. На шаге 5 мастера нажмите кнопки «Далее» (>>) и «Назад» (<<) для предварительного просмотра того, как будут выглядеть объединенные данные при печати документа.

  6. На шаге 6 мастера нажмите кнопку «Печать» и выберите нужные параметры печати.

  7. Сохраните и закроем документ Word.

    Примечания: 

    • Если после завершения работы мастера вам потребуется вернуться и настроить какие-либо параметры слияния, все операции доступны на вкладке «Рассылки» в Word.

    • При внесении изменений в оформление базы данных Access может потребоваться изменить некоторые параметры слияния в Word, чтобы снова правильно сработать слияние.

    • Мастер слияния предназначен для работы с данными адресов рассылки. Однако с помощью функции слияния можно объединять в Word данные любого типа, например записи о запасах, задачи или другие данные, хранимые в Access.

Дополнительные сведения о функции слияния в Word см. в указанных здесь статьях.

  • Персонализация документов с помощью слияния

  • Создание наклеев с помощью слияния

  • Слияние электронной почты в Word

Нужна дополнительная помощь?

Similarily to my post regarding exporting records to MS Excel, below is some sample code that illustrates how one can export data into a new Word document (in a table structure). The code determines the necessary rows and columns based on the table or query passed to it and then does the rest. You can easily from this simple example get into formatting fonts, etc…

'---------------------------------------------------------------------------------------
' Procedure : Export2DOC
' Author    : Daniel Pineault, CARDA Consultants Inc.
' Website   : http://www.cardaconsultants.com
' Purpose   : Export a recordset to a MS Word table in a new document
' Note      : Overwrites file if it already exists without any warning, so you may wish
'               to add a check prior to calling this function
' Copyright : The following is release as Attribution-ShareAlike 4.0 International
'             (CC BY-SA 4.0) - https://creativecommons.org/licenses/by-sa/4.0/
' Req'd Refs: Uses Late Binding, none required
'
' Input Variables:
' ~~~~~~~~~~~~~~~~
' sQuery        : Name of the Table or Query to Export the data from
' sFileName     : Path and Filename to save the Word Document as
' bOpenDocument : Leave the document open to the users or not (close after generating)
'
' Usage:
' ~~~~~~
' Export2DOC "Contacts", "C:Temptesting01.docx"
' Export2DOC "IncomingOrders", "C:Temporders.docx", True
'
' Revision History:
' Rev       Date(yyyy/mm/dd)        Description
' **************************************************************************************
' 1         2012-Apr-23             Initial Release
' 2         2020-04-08              Updated proc header
'                                   Added sFileName and bOpenDocument arguments
'                                   Added PageSetup.Orientation to proc
'                                   Fixed a bug in the table row count
'                                   Updated and expanded the error handler
'---------------------------------------------------------------------------------------
Function Export2DOC(sQuery As String, _
                    sFileName As String, _
                    Optional bOpenDocument As Boolean = False)
    Dim oWord                 As Object
    Dim oWordDoc              As Object
    Dim oWordTbl              As Object
    Dim bWordOpened           As Boolean
    Dim db                    As DAO.Database
    Dim rs                    As DAO.Recordset
    Dim iCols                 As Integer
    Dim iRecCount             As Integer
    Dim iFldCount             As Integer
    Dim i                     As Integer
    Dim j                     As Integer
    Const wdPrintView = 3
    Const wdWord9TableBehavior = 1
    Const wdAutoFitFixed = 0
    '    Const wdOrientPortrait = 0
    Const wdOrientLandscape = 1

    'Start Word
    On Error Resume Next
    Set oWord = GetObject("Word.Application")    'Bind to existing instance of Word

    If Err.Number <> 0 Then    'Could not get instance of Word, so create a new one
        Err.Clear
        On Error GoTo Error_Handler
        Set oWord = CreateObject("Word.application")
        bWordOpened = False
    Else    'Word was already running
        bWordOpened = True
    End If
    On Error GoTo Error_Handler
    oWord.Visible = False   'Keep Word hidden until we are done with our manipulation
    Set oWordDoc = oWord.Documents.Add   'Start a new document
    'Not strictly necessary, but for larger tables switching to Landscape can be very beneficial!
    '   so the next line demonstrates how that can easily be done
    oWordDoc.PageSetup.Orientation = wdOrientLandscape

    'Open our SQL Statement, Table, Query
    Set db = CurrentDb
    Set rs = db.OpenRecordset(sQuery, dbOpenSnapshot)
    With rs
        If .RecordCount <> 0 Then
            .MoveLast   'Ensure proper count
            iRecCount = .RecordCount    'Number of records returned by the table/query
            .MoveFirst
            iFldCount = .Fields.Count   'Number of fields/columns returned by the table/query

            'Switch to print preview mode (not req'd just a personal preference)
            oWord.ActiveWindow.View.Type = wdPrintView
            'Create the basic table
            oWord.ActiveDocument.Tables.Add oWord.selection.Range, _
                                            iRecCount + 1, _
                                            iFldCount, _
                                            wdWord9TableBehavior, _
                                            wdAutoFitFixed

            Set oWordTbl = oWordDoc.Tables(1)
            'Build our Header Row
            For i = 0 To iFldCount - 1
                oWordTbl.Cell(1, i + 1) = rs.Fields(i).Name
            Next i
            'Build our data rows
            For i = 1 To iRecCount
                For j = 0 To iFldCount - 1
                    oWordTbl.Cell(i + 1, j + 1) = Nz(rs.Fields(j).Value, "")
                Next j
                .MoveNext
            Next i
        Else
            MsgBox "There are no records returned by the specified queries/SQL statement.", _
                   vbCritical + vbOKOnly, "No data to generate an Word spreadsheet with"
            GoTo Error_Handler_Exit
        End If
    End With

    oWordDoc.SaveAs (sFileName)   'Save and close
    If bOpenDocument = False Then
        oWordDoc.Close

        '    Close Word if is wasn't originally running
        If bWordOpened = False Then
            oWord.Quit
        End If
    End If

Error_Handler_Exit:
    On Error Resume Next
    rs.Close
    Set rs = Nothing
    Set db = Nothing
    oWord.Visible = True   'Make Word visible to the user
    Set oWordTbl = Nothing
    Set oWordDoc = Nothing
    Set oWord = Nothing
    Exit Function

Error_Handler:
    If Err.Number = 5148 Then
        MsgBox "Your Table/Query contains a total of " & iFldCount & " fields/columns, but Word tables can only support a maximum of 63.  " & _
               "Please change your Table/Query to only supply a maximum of 63 fields/columns and try again.", _
               vbCritical Or vbOKOnly, "Operation Aborted"
    Else
        MsgBox "The following error has occurred" & vbCrLf & vbCrLf & _
               "Error Number: " & Err.Number & vbCrLf & _
               "Error Source: Export2DOC" & vbCrLf & _
               "Error Description: " & Err.Description & _
               Switch(Erl = 0, "", Erl <> 0, vbCrLf & "Line No: " & Erl) _
               , vbOKOnly + vbCritical, "An Error has Occurred!"
    End If
    Resume Error_Handler_Exit
End Function

You may also wish to review my MS Access Sample- Export Data to Excel and/or Word.

Всем привет, сегодня поговорим о выгрузки данных из 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).


Форум программистов Vingrad

Модераторы: Akina

Поиск:

Закрытая темаСоздание новой темы
Создание опроса
> Как сдеать макросм кнопку, чтобы открыть файл doc? Как сдеать макросм кнопку, чтобы открыть 

:(

   

Опции темы

LeonM
Дата 5.6.2005, 12:12 (ссылка)
   |    (голосов: 0)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Unregistered

Здравствуйте.

Подскажите, пожалуйста, можно ли сделать макрос, открывающий постоянный файл в формате Word? И как?

  Вверх
SPrograMMer
Дата 5.6.2005, 18:04 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Спамер :)
**

Профиль
Группа: Участник
Сообщений: 442
Регистрация: 5.11.2004
Где: Краснодар

Репутация: нет
Всего: 6

Цитата(LeonM @ 5.6.2005, 12:12)
Подскажите, пожалуйста, можно ли сделать макрос, открывающий постоянный файл в формате Word? И как?

Можна! даже нужно! smile

Будем макросами баловаться smile
1) на Access`овскую форму бросаем кнопочку, открывается мастер создания кнопок, в котором выбираем «Приложение» и «Запустить MS Word». «Готово»

2)смотрим получившийся макрос:

Код

Private Sub Кнопка0_Click()
On Error GoTo Err_Кнопка0_Click
    Dim oApp As Object
    Set oApp = CreateObject("Word.Application")
'
' вот сюда кое чего вставим :)
'
    oApp.Visible = True
Exit_Кнопка0_Click:
    Exit Sub
Err_Кнопка0_Click:
    MsgBox Err.Description
    Resume Exit_Кнока0_Click
End Sub

3) Открываем Word, начинаем писать макрос «Сервис / Макрос / Начать запись», Открываем нужный файлик, заканчиваем писать этот макрос, смотрим на него:

Код

    Documents.Open FileName:="2_.doc", ConfirmConversions:=False, ReadOnly:= _
        False, AddToRecentFiles:=False, PasswordDocument:="", PasswordTemplate:= _
        "", Revert:=False, WritePasswordDocument:="", WritePasswordTemplate:="", _
        Format:=wdOpenFormatAuto, XMLTransform:=""

тута ВСЕ кроме FileName можно выкинуть smile а в него пишем полный путь к файлу ну что-то вроде:

Код

    Documents.Open FileName:="C:MyDocumentsOthers2_.doc"

4) Эту строчку вставляем в Access`овскую кнопку, незабывая, что Объект Documents, с помощью которого это все происходит принадлежит Объекту — приложению oApp, в результате получаем:

Код

Private Sub Кнопка0_Click()
On Error GoTo Err_Кнопка0_Click
    Dim oApp As Object
    Set oApp = CreateObject("Word.Application")
    oApp.Documents.Open FileName:="C:MyDocumentsOthers2_.doc"    ' уже вставили :)
    oApp.Visible = True
Exit_Кнопка0_Click:
    Exit Sub
Err_Кнопка0_Click:
    MsgBox Err.Description
    Resume Exit_Кнока0_Click
End Sub

PS: у меня офис 2003, в других офисах, действия могут по другому именоваться, а сама суть остаётся smile

———————

животное = зверь
законченный гентушник

PM MAIL ICQ Jabber   Вверх
likhobory
Дата 5.6.2005, 18:33 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Опытный
**

Профиль
Группа: Участник
Сообщений: 466
Регистрация: 17.5.2005
Где: Москва

Репутация: 4
Всего: 20

Цитата(SPrograMMer @ 5.6.2005, 19:04)
в других офисах, действия могут по другому именоваться

для полной уверенности могу добавить, что не только суть, но и действия с указанными объектами аналогичны во всей линейке office97-2003

———————

TSC! Russia 

PM MAIL   Вверх



















Закрытая темаСоздание новой темы
Создание опроса
Правила форума «MS Access»
Akina
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • Используйте теги [code=vb][/code] и [code=sql][/code] для подсветки кода. Используйтe чекбокс «транслит» (возле кнопок кодов) если у Вас нет русских шрифтов.

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Akina.

 

0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MS Access | Следующая тема »

this is the first time I coding VBA. I need to generate a Word Doc using the data in my database (Selected Tables Only). I managed to create the Word Doc with some text inside the document using XXX.Selection.TypeText. However I can’t figure out how to include the Header and Footer for the report. I tried many ways and I can’t get the results i wanted.

My question is, it is possible for me to use/open a prefined word document (with Headers and Foots) and populated my data inside that prefined word document?

Thank you!

Olle Sjögren's user avatar

Olle Sjögren

5,2653 gold badges31 silver badges51 bronze badges

asked Jun 4, 2014 at 7:24

Alfred's user avatar

3

Have a look on the following code:

this will create a new word document including header and footer content as well as body content.

NOTE: Don’t forget to add reference for Microsoft Word Object

Dim objWord As Word.Application
Dim doc As Word.Document
Dim WordHeaderFooter As HeaderFooter

Set objWord = CreateObject("Word.Application")

With objWord
    .Visible = True

    Set doc = .Documents.Add
    doc.SaveAs CurrentProject.Path & "TestDoc.doc" 
End With

With objWord.Selection

 .Font.Name = "Trebuchet MS"
 .Font.Size = 16

  .TypeText "Here is an example test line, #" & " - Font size is " & .Font.Size
  .TypeParagraph

    'Add header and footer

    ActiveDocument.Sections(1).Headers(wdHeaderFooterPrimary).Range.Text = "Header"
    ActiveDocument.Sections(1).Footers(wdHeaderFooterPrimary).Range.Text = "Footer"
End With

doc.Save
doc.Activate

vba ms-access ms-word

answered Jun 11, 2014 at 10:16

Access Guru's user avatar

Формулировка задачи:

Имеем составную форму из который нужно заполнить данными документ ворд, путем нажатия на кнопку. Нужно изменить код VBA, чтобы данными заполнялась вся таблица, а не только первая строка активными строками формы. Помогите, пожалуйста…
вот код VBA

Код к задаче: «Перенос данных из базы данных Access в Word»

textual

 wdd.Tables(1).Cell(wdd.Tables(1).Rows.Count, 1).Range.Text = Q(3)
 wdd.Tables(1).Cell(wdd.Tables(1).Rows.Count, 2).Range.Text = Q(1)

Полезно ли:

14   голосов , оценка 3.786 из 5

Понравилась статья? Поделить с друзьями:
  • Макрорекордер в excel что это
  • Макрокоманды в word это
  • Макрокоманды в excel это
  • Макровирусы заражают файлы документов word
  • Макровирус заражает документы word