Форум программистов, компьютерный форум, киберфорум
Microsoft Access
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.92/78: Рейтинг темы: голосов - 78, средняя оценка - 4.92
1 / 1 / 0
Регистрация: 08.07.2010
Сообщений: 6
1

Слияние Word c базой Access

08.07.2010, 11:49. Показов 14667. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Пытюсь слить в документ WORD данные из запроса ACCESS. Подключаюсь через ODBC, в результате выдает такую ошибку: "Не удаеться открыть файл +Подключение к новому источнику данных.odc как источник данных или заголовока, поскольку он не содержит данных.
Возможно это связано с тем, что несколько полей в ACCESSE вычиляються пользовательскими функциями. Попытался подключиться к другим запросам той же базы без пользовательских функций - усе работает...
При подключении напрямую к mdb - видны только исходные таблицы и запросы, в которых нет вычисляемых полей.
Попытался начать слияние через ACCESS (слияние с ворд) - так же пишет ошибку, что невозможно открыть источник данных...

Может кто сталкивался с таким?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.07.2010, 11:49
Ответы с готовыми решениями:

Слияние Access и Word
Добрый день. Есть форма в access "оформление заказа". Она построена на основе таблицы....

Слияние Word и Access
Добрый день. Прошу помочь - выполнить слияние данных таблицы и готового шаблона ворд как рассылка....

Слияние с WORD базы данных ACCESS (изменение вида передачи данных)
Уважаемые знатоки! В VBA новичок, прошу помощи, очень надо.

Слияние с Word
Есть такая проблемма, Аксессе сделана собственная функция при слиянии Word ругаеться что не...

8
2454 / 797 / 24
Регистрация: 18.08.2009
Сообщений: 1,697
08.07.2010, 13:19 2
не очень понятно, а кусок кода нельзя выложить? Вы делаете передачу из запроса, используя рекордсет или из формы?
0
1 / 1 / 0
Регистрация: 08.07.2010
Сообщений: 6
08.07.2010, 14:40  [ТС] 3
Это не код. в access меню сервис-связи office-слияние с WORD.
Либо из WORD - письма и рассылки - слияния...

Смысл в том, чтобы повторяющиеся данные вставить из запроса ACCESS в документ WORD
1
2454 / 797 / 24
Регистрация: 18.08.2009
Сообщений: 1,697
08.07.2010, 14:47 4
я не пользовалась слиянием, мне удобнее программно переводить данные из акцесса в ворд: делала перевод данных в шаблон договора по нажатию кнопки. Есть код в вба для переноса данных из запроса, формы, заполнение таблицы в шаблоне
0
1 / 1 / 0
Регистрация: 08.07.2010
Сообщений: 6
08.07.2010, 15:11  [ТС] 5
Задача: необходимо сгенерировать экземпляр документа ВОРД под каждую запись запроса, соотвественно с данными из этой строки запроса.
0
2454 / 797 / 24
Регистрация: 18.08.2009
Сообщений: 1,697
08.07.2010, 16:51 6
Лучший ответ Сообщение было отмечено как решение

Решение

код брала не помню где, переделала под свою программу
Visual Basic
1
2
3
4
5
6
7
8
9
Private Sub КнопкаЗаполнитьДоговор_Click()
 'указываем абсолютный путь к шаблону документа, по которму будем формировать свой документ
    strPathDot = CurrentProject.Path & "\Dot\ДоговорШаблон.dot"
    'указываем под каким именем сохранять создаваемый документ
    'при этом добавляем к имени значение кода записи
    strPathWord = CurrentProject.Path & "\Word" & Me!НомерДоговора & "-" & Me!НомерПриложения & "_ДоговорШаблон.doc"
    Me.Путь = strPathWord
    Call funOutputWord(strPathDot, strPathWord)
End Sub
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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
Option Compare Database
Option Explicit
Dim strPathDot As String, strPathWord As String 'strPathWord-полный путь к документу'
Dim app As Word.Application
 
 
'Вставка текста
Private Sub SelectionText(ByVal SelTxt As Selection, ByVal StrTxt As String, ByVal Bld As Byte, ByVal Otstup As Boolean, Optional ByVal OtstAbsac As Boolean = False)
    With SelTxt
        If Otstup = True Then
            .ParagraphFormat.LeftIndent = 12
        Else
            .ParagraphFormat.LeftIndent = 0
        End If
        Select Case Bld
            Case 1
                .Font.Bold = True
            Case 0
                .Font.Bold = False
        End Select
        If OtstAbsac = True Then
            .ParagraphFormat.SpaceAfter = 3
        Else
            .ParagraphFormat.SpaceAfter = 0
        End If
        .TypeText StrTxt
     End With
End Sub
 
'проверка наличия закладки
Private Function TrueBookmark(ByVal BookmarkName As String, ByVal wa As Word.Document) As Boolean
Dim i As Integer
    For i = 1 To wa.Bookmarks.Count
        If wa.Bookmarks(i).Name = BookmarkName Then
            TrueBookmark = True
            Exit For
        End If
    Next i
End Function
 
'функция выгрузки в Word значений полей формы через закладки в шаблоне
Function funOutputWord(strPathDot As String, strPathWord As String) As Boolean
On Error GoTo Err_
 
Dim DlgUser As Integer, i As Long
 
    'проверяем наличие софрмированного ранее документа
    If Dir(strPathWord) <> "" Then 'если нашелся документ по заданому в strPathWord полному пути (вместе с именем)
        DlgUser = MsgBox("Документ с таким именем ранее уже был создан. Заменить его?", vbYesNo, "admin")
        If DlgUser = vbNo Then 'если пользователь выбрал Нет - то открываем прежний вариант документа
            Set app = CreateObject("Word.Application") 'создаем объект Word, чтобы можно было работать с его методами и свойствами
            With app
                .Visible = True 'запускаем приложение Word
                .Documents.Open strPathWord 'открываем документ (по пути в переменной strPathWord)
            End With
            Set app = Nothing 'уничтожаем переменную
        Else 'если пользователь выбрал Да - то есть согласился перезаписать документ
            GoTo nn 'переходим по метке nn
        End If
    Else 'если не нашлось документа по заданому в strPathWord полному пути
nn:
        Set app = New Word.Application 'делаем ссылку на объект Word для создания нового документа
        app.Visible = True 'запускаем приложение Word
        app.Documents.Add strPathDot 'присоединяем к объекту Word шаблон по заданому пути
        With app.ActiveDocument 'делаем ссылку на активный документ - в данном случае тот что формируется
            'находим закладку по имени в заменяем ее на текст из поля формы
            .Bookmarks.Item("ДатаДоговора").Range.Text = Nz(ДатаДоговора, "")
        .Bookmarks.Item("НомерПриложения").Range.Text = Nz(НомерПриложения, "")
            .Bookmarks.Item("Дата").Range.Text = Nz(ДатаДоговора, "")
            .Bookmarks.Item("НазваниеЖурнала").Range.Text = Nz(Название, "")
            .Bookmarks.Item("НазваниеЖурналаПриложение").Range.Text = Nz(Название, "")
            .Bookmarks.Item("ПорядокРасчета").Range.Text = Nz(ПорядокРасчетов, "")
            '.Bookmarks.Item("НомерДоговора").Range.Text = Nz(НомерДоговора, "")
            .Bookmarks.Item("ДоговорНомер").Range.Text = Nz(НомерДоговора, "")
            .Bookmarks.Item("Итого").Range.Text = Nz(Итогo, "")
            .Bookmarks.Item("Итого1").Range.Text = Nz(Итогo, "")
            .Bookmarks.Item("СуммаПр").Range.Text = Nz(Поле69, "")
            .Bookmarks.Item("СуммаПроп").Range.Text = Nz(Поле69, "")
            ' заполнить таблицу
            Call funOutputTableWordQuery(strPathDot, strPathWord)
                        
            'Чистим незаполненные закладки
            With .Bookmarks
                For i = .Count To 1 Step -1
                    'если имя Bookmark совпадает с его содержимым
                    If .Item(i).Name = .Item(i).Range.Text Then
                        'Удаляем содержимое (вместе с ним удаляется и сама Bookmark)
                        .Item(i).Range.Text = ""
                    End If
                Next i
            End With
 
            .SaveAs strPathWord 'сохраняем созданный документ по заданному пути strPathWord
        End With
        Set app = Nothing 'уничтожаем переменную
    End If
    funOutputWord = True 'ставим флаг успешного выполнения функции
    
Exit_:
    Exit Function
Err_:
    funOutputWord = False
    Err.Clear
    app.Quit
    Resume Exit_
End Function
 
 
Function TextDog(strPathDot As String, strPathWord As String) As Boolean
On Error GoTo Err_
Dim dbs As DAO.Database
Dim rst As DAO.Recordset
Dim i As Long, j As Long, NumStr As Long
 Dim CountRec As Long
 
Set dbs = CurrentDb()
 
           Set rst = dbs.OpenRecordset("ЗапросДог", dbOpenSnapshot)
           'Set rst = CurrentDb.OpenRecordset("QveryWord", dbOpenSnapshot)  'открываем запрос на чтение
            If rst.RecordCount > 0 Then 'если в запросе есть хоть одна строка
        With app.ActiveWindow.Selection 'ставим фокус на текущее окно
             
                For i = 0 To rst.Fields.Count - 1 'создаем цикл перебора столбцов запроса
                    If TrueBookmark(rst.Fields(i).Name, .Document) Then
                        .GoTo What:=wdGoToBookmark, Name:=rst.Fields(i).Name  'Перейти на закладку
                        Call SelectionText(app.ActiveWindow.Selection, Nz(rst.Fields(i), ""), 2, False) 'Вставить текст
                    End If
                Next i
               rst.Close 'закрываем рекордсет - при этом автоматически уничтожается и перенменная rst
                
            'Чистим незаполненные закладки
            With .Bookmarks
                For i = .Count To 1 Step -1
                    'если имя Bookmark совпадает с его содержимым
                    If .Item(i).Name = .Item(i).Range.Text Then
                        'Удаляем содержимое (вместе с ним удаляется и сама Bookmark)
                        .Item(i).Range.Text = ""
                    End If
                Next i
            End With
    
            app.ActiveDocument.SaveAs strPathWord 'сохраняем созданный документ по заданному пути strPathWord
        End With
        Set app = Nothing
    End If
    
    TextDog = True 'ставим флаг успешного выполнения функции
    
Exit_:
    Exit Function
Err_:
    TextDog = False
    Err.Clear
    app.Quit
    Resume Exit_
End Function
 
 
 
'функция выгрузки в Word значений полей запроса через закладки в шаблоне
Function funOutputWordQuery(strPathDot As String, strPathWord As String) As Boolean
On Error GoTo Err_
 
 
 
Dim dbs As DAO.Database
Dim rst As DAO.Recordset
Dim i As Long, j As Long, NumStr As Long
 Dim CountRec As Long
Set dbs = CurrentDb()
 Dim i As Long
Dim DlgUser As Integer
 
    'проверяем наличие софрмированного ранее документа
    If Dir(strPathWord) <> "" Then 'если нашелся документ по заданому в strPathWord полному пути (вместе с именем)
        DlgUser = MsgBox("Документ с таким именем ранее уже был создан. Заменить его?", vbYesNo)
        If DlgUser = vbNo Then 'если пользователь выбрал Нет - то открываем прежний вариант документа
            Set app = CreateObject("Word.Application") 'создаем объект Word, чтобы можно было работать с его методами и свойствами
            With app
                .Visible = True 'запускаем приложение Word
                .Documents.Open strPathWord 'открываем документ (по пути в переменной strPathWord)
            End With
            Set app = Nothing 'уничтожаем переменную
        Else 'если пользователь выбрал Да - то есть согласился перезаписать документ
            GoTo nn 'переходим по метке nn
        End If
    Else 'если не нашлось документа по заданому в strPathWord полному пути
nn:
        Set app = New Word.Application 'делаем ссылку на объект Word для создания нового документа
        app.Visible = True 'запускаем приложение Word
        app.Documents.Add strPathDot 'присоединяем к объекту Word шаблон по заданому пути
        With app.ActiveWindow.Selection 'делаем ссылку на активный документ - в данном случае тот что формируется
           Set rst = dbs.OpenRecordset("QveryWord", dbOpenSnapshot)
           'Set rst = CurrentDb.OpenRecordset("QveryWord", dbOpenSnapshot)  'открываем запрос на чтение
            If rst.RecordCount > 0 Then 'если в запросе есть хоть одна строка
                For i = 0 To rst.Fields.Count - 1 'создаем цикл перебора столбцов запроса
                    If TrueBookmark(rst.Fields(i).Name, .Document) Then
                        .GoTo What:=wdGoToBookmark, Name:=rst.Fields(i).Name  'Перейти на закладку
                        Call SelectionText(app.ActiveWindow.Selection, Nz(rst.Fields(i), ""), 2, False) 'Вставить текст
                    End If
                Next i
               rst.Close 'закрываем рекордсет - при этом автоматически уничтожается и перенменная rst
            End If
            'если в шаблоне нужно заполнить таблицу - запускаем соответсвующую функцию
            'если заполнять таблицу не нужно - убираем эту строку
           ' Call funOutputTableWordQuery(strPathDot, strPathWord)
    
            'Чистим незаполненные закладки
            With .Bookmarks
                For i = .Count To 1 Step -1
                    'если имя Bookmark совпадает с его содержимым
                    If .Item(i).Name = .Item(i).Range.Text Then
                        'Удаляем содержимое (вместе с ним удаляется и сама Bookmark)
                        .Item(i).Range.Text = ""
                    End If
                Next i
            End With
    
            app.ActiveDocument.SaveAs strPathWord 'сохраняем созданный документ по заданному пути strPathWord
        End With
        Set app = Nothing
    End If
    
    funOutputWordQuery = True 'ставим флаг успешного выполнения функции
    
Exit_:
    Exit Function
Err_:
    funOutputWordQuery = False
    Err.Clear
    app.Quit
    Resume Exit_
End Function
 
Private Sub butExit_Click()
    DoCmd.Close 'закрываем форму
End Sub
 
Private Sub butWord_Click()
    'запускаем функцию выгрузки в Word из полей формы
    Call funOutputWord(strPathDot, strPathWord)
End Sub
 
Private Sub butWordQuery_Click()
    'запускаем функцию выгрузки в Word из запроса
    Call funOutputWordQuery(strPathDot, strPathWord)
End Sub
 
'функция выгрузки в Word из запроса в таблицу
Function funOutputTableWordQuery(strPathDot As String, strPathWord As String) As Boolean
On Error GoTo Err_
Dim dbs As DAO.Database
Dim rst As DAO.Recordset
Dim i As Long, j As Long, NumStr As Long
 Dim CountRec As Long
 Set dbs = CurrentDb()
Set rst = dbs.OpenRecordset("Запрос2", dbOpenSnapshot) 'открываем запрос для перебора столбцов
CountRec = rst.RecordCount 'определяем число строк в запросе
     With app.ActiveWindow.Selection 'ставим фокус на текущее окно
           If CountRec > 0 Then 'смотрим, чтоб не пустой запрос
            rst.MoveLast 'переходим в конец набора строк - тем самым они гарантированно загружаются в переменную rstTable
            rst.MoveFirst 'возращаемся в начало набора строк
            If TrueBookmark("NZ", .Document) Then 'если есть закладка
                .GoTo What:=wdGoToBookmark, Name:="NZ" 'Перейти на закладку ZT - начало втыкания данных в таблицу
            End If
            'запоминаем номер строки таблицы где стоит начальная закладка
            j = .Information(wdEndOfRangeRowNumber)
            If CountRec > 1 Then
                'Вставим необходимое количество строк
                .InsertRowsBelow CountRec - 1
            End If
            'Заполняем таблицу данными из запроса
             NumStr = 1
            Do While Not rst.EOF 'Запускаем цикл перебора столбцов запроса
                For i = 0 To rst.Fields.Count - 1
                'MsgBox (rst.Fields(i).Name)
                    If rst.Fields(i).Name = "НомерСтроки" Then 'если в запросе будет столбец с именем NumStr - то вместо него в ячейку таблицы встанет порядковый номер записи
                        .Tables(1).Cell(j, i + 1).Range = NumStr
                    Else
                        'Заполняем таблицу по координатам: номер столбца, номер строки
                        .Tables(1).Cell(j, i + 1).Range = Nz(rst.Fields(i), "")
                    End If
                Next i
                rst.MoveNext 'переходим на следующую запись
                NumStr = NumStr + 1 'увеличиваем номер по порядку
                j = j + 1 'увеличиваем номер координаты ячейки (номер столбца)
            Loop
        End If
        rst.Close 'закрываем рекордсет - при этом автоматически уничтожается и перенменная rstTable
    End With
    funOutputTableWordQuery = True 'ставим флаг успешного выполнения функции
    
Exit_:
    Exit Function
Err_:
    funOutputTableWordQuery = False
    Err.Clear
    Resume Exit_
End Function
3
1 / 1 / 0
Регистрация: 08.07.2010
Сообщений: 6
08.07.2010, 16:53  [ТС] 7
буду разбираться
0
1180 / 631 / 39
Регистрация: 30.05.2010
Сообщений: 715
08.07.2010, 18:24 8
Здравствуйте alanez.
Слияние очень полезный "инструмент" например для подготовки массовой рассылки.
Всё зависит от Вашего решения - использовать его или отдельный продукт,
я бы отдал предпочтение Слиянию, хотя для работы с ним стоит подумать о создании специального источника (таблицы/запроса) именно для этих целей, а "наполнять" этот источник из конструкций с "вычисляемыми полями"
. И тогда "проблема" - "..При подключении..к mdb - видны..таблицы и запросы, в которых нет вычисляемых полей.." не будет казаться такой страшной.
Евгений.
0
1 / 1 / 0
Регистрация: 08.07.2010
Сообщений: 6
09.07.2010, 09:36  [ТС] 9
Так в том - то и дело что необходимые данные можно получить только вычислением. Уже есть готовый запрос с нужными данными под слияние - но в самый последний момент возникает ошибка. Хотелось бы узнать :
1. являеться ли действиетельно источником ошибки наличие вычисляемого поля в запросе
2. Если да, то можно ли это как-нибудь обойти?
3. Если нет, то в чем я не прав?

PS Пока что в голову пришла одна идея: экспортнуть из ACCESSa результаты запроса в какой-нибудь dbf и с ним уже сливаться.

Добавлено через 12 часов 40 минут
Всем спасибо за внимание. Усе заработало как хочеться! Здесь я нашел ответ на свой вопрос если кому интересно:
http://support.microsoft.com/k... sid=global
0
09.07.2010, 09:36
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.07.2010, 09:36
Помогаю со студенческими работами здесь

Слияние с word
Добрый день. Прошу помощи. Есть запрос, который собирает данные для документа из разных таблиц....

??? программное слияние с Word ???
access 2000, задача: получить слияние c Word и заполнить шаблон данными из этой же базы. в...

Слияние между SQL-запросом и таблицей в Word-e
У меня есть в Access-e запрос (таблица) имя | цена | дата ааа | 50 | 01.02.2017 bbb | 100 |...

Слияние таблиц MS Access 97
подскажите, как слить две таблицы сравнивая по одному полю на VBA. или хотя бы как узнать значение...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru