Программирование на access в word

04. Данный пример показывает как можно создать таблицу в Microsoft Word, используя vba в Word. При этом создается соединение внутри документа Word. Обратите внимание, что функция InsertDatabase отличается параметрами в разных версиях офиса.

Option Compare Database
Option Explicit
'#Const AccessVer = 2000
'#Const AccessVer = 2002
#Const AccessVer = 2003

'***************************************************************
'04.Пример. Как создать таблицу в документе Word ?
'***************************************************************

'==============================================================
'   Создание таблицы в документе Word
'   ---------------------------------
'   Для этого Вы должны создать в шаблоне la_automat.dot
'   закладку с имеенем Таблица. Например,
'   Вставка - Закладка ... - Имя закладки=Таблица
'   (Нажмите кнопку Добавить и сохраните шаблон)
'
Private Sub butNewWord_Click()
Dim app As Word.Application  'Приложение программы
Dim strDOC As String ' Имя документа
Dim strDOT As String ' Имя шаблона
Dim strMDB As String ' Имя базы данных
Dim rng As Word.Range ' Область данных
Dim tbl As Word.Table ' Таблица документа
Dim c As Word.Cell ' Ячейка таблицы
Dim i As Long ' Переменная

    On Error GoTo 999
    ' Определяем имена шаблона, документа и базы данных
    With Application.CurrentProject
        strDOT = .Path  ""  "la_automat.dot"
        strDOC = .Path  ""  "la_automat.doc"
        strMDB = .Path  ""  .Name
    End With
    
    ' Управление документом Word
    Set app = New Word.Application 'Новое приложение Word
    app.Visible = True 'Отображаем документ
    app.Documents.Add strDOT 'Добавляем шаблон
    
    ' Выбираем закладку (позицию) таблицы
    Set rng = app.ActiveDocument.Bookmarks("Таблица").Range
    With rng
        .Collapse wdCollapseEnd
        ' Вставляем таблицу, используя запрос из базы данных
        #If AccessVer = 2000 Then
            .InsertDatabase _
                Style:=191, _
                LinkToSource:=False, _
                Connection:="Query ЗапросПримера04", _
                DataSource:=strMDB
        #ElseIf AccessVer = 2002 Then
            .InsertDatabase Format:=0, Style:=0, LinkToSource:=False, _
            Connection:= _
            "Provider=Microsoft.Jet.OLEDB.4.0;Password="""";User ID=Admin;Data Source="  strMDB  ";Mode=Read;Extended Properties="""";Jet OLEDB:System database="""";Jet OLEDB:Registry Path="""";Jet OLEDB:Database Password="""";Jet OLEDB:Engi" _
            , SQLStatement:="SELECT * FROM `ЗапросПримера04`"  "", PasswordDocument _
            :="", PasswordTemplate:="", WritePasswordDocument:="", _
            WritePasswordTemplate:="", DataSource:= _
            strMDB, From:=-1, To:=-1, _
            IncludeFields:=True
        #Else
            .InsertDatabase Format:=0, Style:=0, LinkToSource:=False, _
                Connection:= _
                "Provider=Microsoft.Jet.OLEDB.4.0;Password="""";User ID=Admin;Data Source="  strMDB  ";Mode=Read;Extended Properties="""";Jet OLEDB:System database="""";Jet OLEDB:Registry Path="""";Jet OLEDB:Database Password="""";Jet OLE" _
                , SQLStatement:="SELECT * FROM `ЗапросПримера04`"  "", PasswordDocument _
                :="", PasswordTemplate:="", WritePasswordDocument:="", _
                WritePasswordTemplate:="", DataSource:= _
                strMDB, From:=-1, To _
                :=-1, IncludeFields:=True
        #End If
        
        i = .Tables.Count ' Всего таблиц в данной области
        Set tbl = .Tables(i) ' Созданная таблица
        ' Форматируем всю таблицу
        tbl.Range.Font.Size = 10 ' Выбираем шрифт
        tbl.AutoFormat wdTableFormatGrid8 ' Выбираем авто-формат
       
        ' Вставляем колонку в начало таблицы
        tbl.Columns.Add tbl.Columns(1) ' Добавляем колонку
        i = 0
        For Each c In tbl.Range.Columns(1).Cells
            If i Then
                ' Изменяем данные
                c.Range.InsertAfter Format(i, "000") ' Вставить данные
                c.Range.ParagraphFormat.Alignment = wdAlignParagraphRight  'Правый формат
            Else
                ' Изменяем заголовок ячейки
                tbl.Range.Columns(1).Cells(1).Range.Text = "Пункт"
            End If
            i = i + 1
        Next c
        ' Форматируем заголовок, т.е. всю строку
        tbl.Rows(1).Select ' Выбираем заголовок
        With app.Selection
            .ParagraphFormat.Alignment = wdAlignParagraphCenter
            .Font.Name = "Arial" ' Имя шрифта
            .Font.Size = 10 ' Размер шрифта
        End With
        
        ' Добавляем новую строку
        tbl.Rows.Add ' Добавляем строку в конец таблицы
        With tbl.Cell(tbl.Rows.Count, 1) ' Выбираем 1 ячейку строки
          .Formula "=SUM(ABOVE)" ' Устанавливаем формулу
          .Shading.BackgroundPatternColorIndex = wdDarkRed ' Назначаем цвет фона
          .Range.Font.Bold = True ' Толщина (вес) текста
        End With
   End With
    
    app.ActiveDocument.SaveAs strDOC  ' Сохраняем файл
    ' app.Quit 'Закрываем приложение
    Exit Sub
999:
    MsgBox Err.Description  'Ошибка
    Err.Clear
    app.Quit
End Sub

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

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

0 / 0 / 0

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

Сообщений: 41

1

18.11.2011, 09:41. Показов 39757. Ответов 74


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

Пожалуйста, помоги довести базу до ума.
Мне необходимо сделать :
1. Выгрузку данных из формы ПУТЕВКА в шаблон word-кого файла ТУРИСТСКАЯ ПУТЕВКА:
Надо чтобы поля формы выгружались в соответствующие места документа word. При чем выгружалась путем нажатия кнопки на форме.
2. В подчиненной форме формы ТУРИСТЫ необходимо сделать следующее: при двойном нажатии на код путевки открывалась путевка с указанным кодом.



0



Эксперт MS Access

7267 / 4469 / 288

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

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

18.11.2011, 09:55

2

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

Пожалуйста, помоги

Кто-то конкретно должен помочь? Вы к кому обращаетесь?
1.Глазки поднимаем и видим:
Путеводитель по форуму
там про Word и не только.

2.Я не буду против того, чтобы увидеть ваш mdb.



0



Модератор

Эксперт MS Access

11343 / 4661 / 749

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

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

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

18.11.2011, 10:26

3

а где шаблон

и

форма ПУТЕВКИ1, которую вы вызываете

по идее вроде должно бы быть
-ленточная

Путевки для навигации и поиска путевок
-при клике на строке —открытие текущей или новой путевки в столбиковой форме и подчиненной для подбора туристов
-в клике на подчиненной -выход на сведения о туристе

соответственно 3 таблицы(не считая справочников)
1-перечень путевок
2—список туристов для некой путевки
3-личные данные туриста(фото,паспорт…..)

перечень путешествий туриста —это уже расчетная величина



0



0 / 0 / 0

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

Сообщений: 41

18.11.2011, 14:23

 [ТС]

4

Спасибо за оперативные ответы. Прошу прощения за не верно составленный текст просьбы.
вот что на данном этапе у меня получилось. но я не знаю как правильно составить программу кнопки для выгрузки в word (в форме ПУТЕВКА). (т.к. не сильна в программировании).
прикрепляю БД и шаблон
Заранее благодарю за помощь откликнувшимся



0



Ameli

2091 / 1167 / 39

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

Сообщений: 1,605

18.11.2011, 16:17

5

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

Решение

У меня, как и многих других форумчан 2003 офис, и нет возможности открыть accdb, поэтому alvk и просил вас выложить mdb формат. Также просьба перед выкладыванием сжимать бд.
Но могу предложить вам код, который использую я. С помощью него заполняется вордовский документ на основе шаблона, в котором сделаны закладки в нужных местах.

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
Dim app As Word.Application
Dim strPathDot As String, strPathWord As String
 
strPathDot = "ПутьНазвание шаблона.dot"
strPathWord = "ПутьНазвание документа.doc"
 
'Если есть документ с таким же названием и местом расоложения, выдается сообщение о замене
If Dir(strPathWord) <> "" Then
DlgUser = MsgBox("Документ с таким именем ранее уже был создан. Заменить его?", vbYesNo, "admin")
 
'Если нет, открывается старый документ
If DlgUser = vbNo Then
Set app = CreateObject("Word.Application")
With app
.Visible = True
.Documents.Open strPathWord
End With
Set app = Nothing
Else
GoTo nn
End If
Else
 
'Если такого документа нет или, если человек выбрал "да", то создается новый документ взамен старого на основе шаблона
nn:
Set app = New Word.Application
app.Visible = True
app.Documents.Add strPathDot
With app.ActiveDocument
 
'Вставка данных
.FormFields("Название закладки").Result = Forms![Название формы]![Название поля]
 
'и т.д. по всем закладкам
 
.SaveAs strPathWord
.Protect wdAllowOnlyFormFields, True, ""
End With
Set app = Nothing
End If
funOutputWord = True
Exit_:



8



Ameli

2091 / 1167 / 39

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

Сообщений: 1,605

18.11.2011, 17:14

6

Набросала примерчик.
Уточняю, что в редакторе VBA на панели Tools — References надо включить Microsoft Word Object Library.
В шаблоне ворда должны быть созданы текстовые поля с закладками.
Строчка

Visual Basic
1
.Protect wdAllowOnlyFormFields, True, ""

включает защиту формы (все, кроме полей формы). Поэтому смотрите сами, нужна ли она вам

Вложения

Тип файла: rar Новая папка.rar (22.1 Кб, 452 просмотров)



1



0 / 0 / 0

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

Сообщений: 41

18.11.2011, 18:21

 [ТС]

7

Большое спасибо за ответ.
Я сделала как вы сказали, но у меня выходит ошибка Word «Не верно указана единица измерения»
В чем причина?
Кроме того, шаблон все равно не заполняется
Прикрепляю БД с корректировкой

P.s. в формате mdb сохранить не получается (из-за не совместимости)

Вложения

Тип файла: rar БД.rar (3.00 Мб, 164 просмотров)



0



Ameli

2091 / 1167 / 39

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

Сообщений: 1,605

19.11.2011, 13:03

8

В 2007 офисе не нашла, как создавать элементы управления, тем более в вашем случае их использование не обязательно. Поэтому для вставки данных можно воспользоваться обычными закладками ворда:

Visual Basic
1
.Bookmarks("КодПутевки").Range.Text = Forms![ПУТЕВКА]![Код путевки]

У вас закладки были перепутаны, не все добавлены, я их исправила;
Слишком сложное обращение к полю на форме, вот правильное:
Forms![ПУТЕВКА]![Код путевки]
На форме не совпадали названия полей с теми, к которым вы обращались в коде;
К некторым полям со списком надо обращаться к кокретному столбцу:
Forms![ПУТЕВКА]!Страна.Column(1)
В программном коде исправила обращение к шаблону и файлу ворда — путь к текущей базе данных + название шаблона. К названию файла добавила текущий номер путевки (код путевки);
В шаблоне добавила закладки Турист1…Турист5 (один под другим), Покупатель = Туристу1 (если я правильно поняла). В коде добавила цикл по списку туристов, входящих в данную путевку:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
Dim MyTable As DAO.Recordset
Set MyTable = CurrentDb.OpenRecordset("SELECT Направления.[Код направления], Направления.Направления_Код, [Туристы]![Фамилия] & ' ' & [Туристы]![Имя] & ' ' & [Туристы]![Отчество] AS ФИОтуриста FROM Туристы INNER JOIN Направления ON Туристы.[Код туриста] = Направления.Туристы_Код WHERE (((Направления.Направления_Код)=" & [Forms]![ПУТЕВКА]![Код путевки] & "))")
i = 1
Do While Not MyTable.EOF
        Турист = "Турист" & i
        If i = 1 Then .Bookmarks("Покупатель").Range.Text = CStr(MyTable.Fields("ФИОтуриста"))
        
        .Bookmarks(Турист).Range.Text = CStr(MyTable.Fields("ФИОтуриста"))
        i = i + 1
        MyTable.MoveNext
Loop
MyTable.Close

Вложения

Тип файла: rar БД.rar (120.7 Кб, 609 просмотров)



1



0 / 0 / 0

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

Сообщений: 41

20.11.2011, 21:22

 [ТС]

9

Здорово, спасибо!!!
Пробую это вариант. И делаю дальше.



0



0 / 0 / 0

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

Сообщений: 41

21.11.2011, 11:21

 [ТС]

10

Добрый день!!!
подскажите, пожалуйста,
1) как избавиться правильно от ошибки при незаполненном поле (т.е. если, например, поле стоимость не заполнено, то в шаблон ничего не выгружалось (ну или пробел)
2) можно ли сделать так, чтобы после нажатия кнопки » выгрузка в word», данный документ открывался сразу (необходимо для дальнейшего редактирования).
Заранее благодарю за ответ.

Вложения

Тип файла: rar БД.rar (139.3 Кб, 186 просмотров)



0



shanemac51

Модератор

Эксперт MS Access

11343 / 4661 / 749

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

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

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

22.11.2011, 13:51

11

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

1) как избавиться правильно от ошибки при незаполненном поле (т.е. если, например, поле стоимость не заполнено, то в шаблон ничего не выгружалось (ну или пробел)

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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
Private Sub Кнопка54_Click()
Dim app As Word.Application
Dim strPathDot As String, strPathWord As String
 
strPathDot = CurrentProject.Path & "Туристская путевка.dotx"
strPathWord = CurrentProject.Path & "Туристская путевка " & Forms![ПУТЕВКА]![Код путевки] & ".doc"
 
'Если есть документ с таким же названием и местом расоложения, выдается сообщение о замене
If Dir(strPathWord) <> "" Then
DlgUser = MsgBox("Документ с таким именем ранее уже был создан. Заменить его?", vbYesNo, "admin")
 
'Если нет, открывается старый документ
If DlgUser = vbNo Then
Set app = CreateObject("Word.Application")
With app
.Visible = True
.Documents.Open strPathWord
End With
Set app = Nothing
Else
GoTo nn
End If
Else
 
'Если такого документа нет или, если человек выбрал "да", то создается новый документ взамен старого на основе шаблона
nn:
Set app = New Word.Application
app.Visible = True
app.Documents.Add strPathDot
With app.ActiveDocument
 
'Вставка данных
    .Bookmarks("КодПутевки").Range.Text = "" & Forms![ПУТЕВКА]![Код путевки]
    .Bookmarks("Страна").Range.Text = "" & Forms![ПУТЕВКА]!Страна.Column(1)
    .Bookmarks("Отель").Range.Text = "" & Forms![ПУТЕВКА]!Отель.Column(1)
    .Bookmarks("Туроператор").Range.Text = "" & Forms![ПУТЕВКА]![Туроператор].Column(1)
    .Bookmarks("Маршрут").Range.Text = "" & Forms![ПУТЕВКА]!Маршрут.Column(1)
    .Bookmarks("Катег_проездн_билета").Range.Text = "" & Forms![ПУТЕВКА]!Катег_проездн_билета.Column(1)
    .Bookmarks("Рейс").Range.Text = "" & Forms![ПУТЕВКА]!Рейс
    .Bookmarks("Тип_номера").Range.Text = "" & Forms![ПУТЕВКА]!Тип_номера.Column(1)
    .Bookmarks("Питание").Range.Text = "" & Forms![ПУТЕВКА]!Питание.Column(1)
    .Bookmarks("Виза").Range.Text = "" & Forms![ПУТЕВКА]!Виза
    .Bookmarks("Страховка").Range.Text = "" & Forms![ПУТЕВКА]!Страховка
    .Bookmarks("Трансфер").Range.Text = "" & Forms![ПУТЕВКА]!Трансфер
    .Bookmarks("Экскурсии").Range.Text = "" & Forms![ПУТЕВКА]!Экскурсии
    .Bookmarks("Начало_маршрута").Range.Text = "" & Forms![ПУТЕВКА]!Начало_маршрута
    .Bookmarks("Окончание_маршрута").Range.Text = "" & Forms![ПУТЕВКА]!Окончание_маршрута
    .Bookmarks("Стоимость").Range.Text = "" & Forms![ПУТЕВКА]!Стоимость
Err.Clear ' Очищаем поток от ошибки при отсутствии элемента
Dim MyTable As DAO.Recordset
Set MyTable = CurrentDb.OpenRecordset("SELECT Направления.[Код направления], Направления.Направления_Код, [Туристы]![Фамилия] & ' ' & [Туристы]![Имя] & ' ' & [Туристы]![Отчество] AS ФИОтуриста FROM Туристы INNER JOIN Направления ON Туристы.[Код туриста] = Направления.Туристы_Код WHERE (((Направления.Направления_Код)=" & [Forms]![ПУТЕВКА]![Код путевки] & "))")
 
i = 1
Do While Not MyTable.EOF
        Турист = "Турист" & i
        If i = 1 Then .Bookmarks("Покупатель").Range.Text = CStr(MyTable.Fields("ФИОтуриста"))
        
        .Bookmarks(Турист).Range.Text = CStr(MyTable.Fields("ФИОтуриста"))
        i = i + 1
        MyTable.MoveNext
Loop
 
MyTable.Close
 
.SaveAs strPathWord
On Error GoTo 999 ' Включаем обработку ошибки
End With
Set app = Nothing
End If
funOutputWord = True
Exit Sub
''Exit_:
999:
    MsgBox Err.Description  'Ошибка
    Err.Clear
    app.Quit
End Sub
 
'''' и не забывайте закрывать WORD



1



2091 / 1167 / 39

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

Сообщений: 1,605

22.11.2011, 16:51

12

Или с помощью ф-ии Nz(), которая возвращает пустую строку «» или другое указанное значение, если переменная в скобках = Null. Добавим ее перед каждым обращением к полю формы для вставки в шаблон ворда

Вложения

Тип файла: rar БД.rar (146.8 Кб, 210 просмотров)



1



0 / 0 / 0

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

Сообщений: 41

23.11.2011, 14:23

 [ТС]

13

2.

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

2. В подчиненной форме формы ТУРИСТЫ необходимо сделать следующее: при двойном нажатии на код путевки открывалась путевка с указанным кодом.

Сделала сама. ))))



0



0 / 0 / 0

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

Сообщений: 41

23.11.2011, 15:10

 [ТС]

14

теперь у меня возникли следующие вопросы:
1) когда нажимаю на кнопку » выгрузка в шаблон word» в форме ПУТЕВКА возникают ошибки
пожалуйста, подскажите как от них избавиться?
2) а можно как-то сделать чтобы при нажатии на указанную выше кнопку сразу открывался для дальнейшего редактирования созданный вновь документ? (а то совсем не удобно выполнять следующие действия: нажать на кнопку; пропустить ошибки; потом зайти в папку, где лежит шаблон; открыть шаблон; затем может зависнуть word; закрыть шаблон и только потом можно работать с новым документом)



0



0 / 0 / 0

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

Сообщений: 41

23.11.2011, 15:46

 [ТС]

15

приложила в формате 2003



0



0 / 0 / 0

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

Сообщений: 41

23.11.2011, 20:17

 [ТС]

16

с горем на пополам я изменила версии access и word.
помогите избавиться от ошибок и сделать возможным открывать новый выгруженный документ сразу после нажатия кнопки в форме ПУТЕВКА
Заранее благодарю за помощь (ответ)



0



Эксперт MS Access

7267 / 4469 / 288

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

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

24.11.2011, 07:51

17

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

Решение

Посмотрите как сделано здесь и продублируйте:
Кнопка для экспорта



1



2091 / 1167 / 39

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

Сообщений: 1,605

24.11.2011, 08:58

18

Базу данных с ошибкой вы так и не приложили ни в каком формате — ни в 2003, ни в 2007. Мой приложенный пример у меня работает без проблем — ошибки не выскакивают, открывать документ не нужно, он открывается сам, правда свернутый.
У вас мой приложенный пример (пост № 12) открывается также? или выскакивают ошибки?
Приложите базу с ошибкой хоть в каком-нибудь формате



0



0 / 0 / 0

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

Сообщений: 41

24.11.2011, 09:49

 [ТС]

19

прикрепила
ошибки все равно есть



0



0 / 0 / 0

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

Сообщений: 41

24.11.2011, 11:16

 [ТС]

20

прикрепила в той версии, над которой я сейчас тружусь

Вложения

Тип файла: rar БД.rar (259.2 Кб, 263 просмотров)



0



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

Поиск:

Ответ в темуСоздание новой темы
Создание опроса
> Слияние Access в Word, Выводится только одна запись 

:(

   

Опции темы

Artmishin
Дата 17.8.2010, 19:44 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




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

Цитата

Новичок

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

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

Необходимо, при нажатии на кнопку передать все записи (по условию фильтра) из Access в Word по готовому шаблону /dot/шаблон.dot при этом сколько записей столько и страниц в документе.
Написал в VBA следующий код, отталкиваясь от примера в Интернете.

Код

Function funOutputWord(strPathDot As String) As Boolean
Dim app As Object

Set app = CreateObject("Word.Application")
        app.Visible = True
        app.Documents.Add strPathDot

                    With app.ActiveDocument
            .Bookmarks.Item("ФИО").Range.Text = Nz(Me.ФИО)
            .Bookmarks.Item("Улица").Range.Text = Nz(Me.Улица)
            .Bookmarks.Item("Дом").Range.Text = Nz(Me.Дом)
            .Bookmarks.Item("Квартира").Range.Text = Nz(Me.Квартира)
            End With

        Set app = Nothing
        funOutputWord = True
End Function

Затем код для кнопки на событие Click

Код

Dim strPathDot As String
    strPathDot = CurrentProject.Path & "dotшаблон.dot"
    Call funOutputWord(strPathDot)

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

PM MAIL   Вверх
bopoha
Дата 17.8.2010, 21:56 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




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

Цитата

Эксперт
***

Профиль
Группа: Завсегдатай
Сообщений: 1283
Регистрация: 10.5.2006
Где: Беларусь, Минск

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

А где цикл по записям?

———————

Как создавать приложения на MS Access

PM MAIL WWW ICQ Skype GTalk   Вверх
Artmishin
Дата 18.8.2010, 06:33 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




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

Цитата

Новичок

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

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

Цитата(bopoha @  17.8.2010,  21:56 Найти цитируемый пост)
А где цикл по записям? 

Точно! А слона я и не увидел!
После правки выдает ошибку 5941 «Запрашиваемый номер семейства не существует»

Код

Function funOutputWord(strPathDot As String) As Boolean
Dim app As Object

Set app = CreateObject("Word.Application")
        app.Visible = True
        app.Documents.Add strPathDot

                Do While Me.Активация = True
            With app.ActiveDocument
            .Bookmarks.Item("ФИО").Range.Text = Nz(Me.ФИО)
            .Bookmarks.Item("Улица").Range.Text = Nz(Me.Улица)
            .Bookmarks.Item("Дом").Range.Text = Nz(Me.Дом)
            .Bookmarks.Item("Квартира").Range.Text = Nz(Me.Квартира)
            End With
        Loop
        Set app = Nothing
        funOutputWord = True
End Function

Это сообщение отредактировал(а) Artmishin — 18.8.2010, 06:40

PM MAIL   Вверх
bopoha
Дата 23.8.2010, 11:44 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




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

Цитата

Эксперт
***

Профиль
Группа: Завсегдатай
Сообщений: 1283
Регистрация: 10.5.2006
Где: Беларусь, Минск

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

Artmishin, а переходить по записям кто будет?

Лучше делать так:

Код

dim rst as DAO.Recordset

set rst = me.recordsetclone
'-- rst.bookmark = me.bookmark '-- если нужно начать с текущей записи

do while not rst.EOF
   '-- берем данные из rst
   rst.MoveNext
Loop

———————

Как создавать приложения на MS Access

PM MAIL WWW ICQ Skype GTalk   Вверх
Artmishin
Дата 28.8.2010, 11:37 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




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

Цитата

Новичок

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

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

Решил проблему следующим кодом

Код

Public Sub otUved5000()

'Код для Word
Dim pstrAppPath As String
Dim objWord5000 As Word.Application

pstrAppPath = CurrentProject.Path

On Error Resume Next

                Set objWord5000 = GetObject(, "Word.Application")

    If objWord5000 Is Nothing Then
    Set objWord5000 = New Word.Application
    If objWord5000 Is Nothing Then
        MsgBox "MS Word не установлен на Вашем компьютере!"
    End If
End If

    objWord5000.Documents.Add (pstrAppPath & "DotШаблон.dot")

    objWord5000.ActiveDocument.MailMerge.MainDocumentType = wdFormLetters
    objWord5000.ActiveDocument.MailMerge.OpenDataSource Name:= _
        pstrAppPath & "DB.mdb", ConfirmConversions:=False, _
        ReadOnly:=True, LinkToSource:=True, AddToRecentFiles:=False, _
        PasswordDocument:="", PasswordTemplate:="", WritePasswordDocument:="", _
        WritePasswordTemplate:="", Revert:=False, Format:=wdOpenFormatAuto, _
        Connection:="QUERY Main_group", SQLStatement:= _
        "SELECT * FROM Main_group WHERE Активация = True", SQLStatement1:=""

    With objWord5000.ActiveDocument.MailMerge
        .Destination = wdSendToNewDocument
        .Execute
    End With

    objWord5000.Visible = True

    Set objWord5000 = Nothing

Добавлено через 7 минут и 14 секунд
Теперь проблема в следующем, имеется таблица с двумя логическими полями «Поле1» и «Поле2». Выбор необходимых записей происходит по условию Поле1 = True. Необходимо после выполнения слияния с Word, сначала приравнять значения этих полей, а затем очистить Поле1. Написал код, но никак не пойму куда влепить условие отбора?

Код

Dim rst5000 As Recordset
Dim dbs5000 As Database

Set dbs5000 = OpenDatabase("DB.mdb")
Set rst5000 = dbs5000.OpenRecordset("Main_group", dbOpenForwardOnly)

    Do While Not rst5000.EOF
        Me.Поле2 = Me.Поле1
        Me.Поле1 = False

                rst5000.MoveNext
    Loop

PM MAIL   Вверх
bopoha
Дата 30.8.2010, 11:16 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




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

Цитата

Эксперт
***

Профиль
Группа: Завсегдатай
Сообщений: 1283
Регистрация: 10.5.2006
Где: Беларусь, Минск

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

Цитата(Artmishin @  28.8.2010,  11:37 Найти цитируемый пост)
Написал код, но никак не пойму куда влепить условие отбора?

Не понятно что хотите сделать…

———————

Как создавать приложения на MS Access

PM MAIL WWW ICQ Skype GTalk   Вверх



















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

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

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

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


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

 

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

Like this post? Please share to your friends:
  • Программирование макросов на vba в excel что это
  • Программирование макросов на vba в excel курсы
  • Программирование макрос vba excel
  • Программирование линейных алгоритмов в excel
  • Программирование линейного вычислительного процесса в excel