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

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

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

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

Может кто сталкивался с таким?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
08.07.2010, 11:49
Ответы с готовыми решениями:

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

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

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

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

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

Решение

код брала не помню где, переделала под свою программу
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  [ТС]
буду разбираться
0
1181 / 632 / 39
Регистрация: 30.05.2010
Сообщений: 715
08.07.2010, 18:24
Здравствуйте alanez.
Слияние очень полезный "инструмент" например для подготовки массовой рассылки.
Всё зависит от Вашего решения - использовать его или отдельный продукт,
я бы отдал предпочтение Слиянию, хотя для работы с ним стоит подумать о создании специального источника (таблицы/запроса) именно для этих целей, а "наполнять" этот источник из конструкций с "вычисляемыми полями"
. И тогда "проблема" - "..При подключении..к mdb - видны..таблицы и запросы, в которых нет вычисляемых полей.." не будет казаться такой страшной.
Евгений.
0
1 / 1 / 0
Регистрация: 08.07.2010
Сообщений: 6
09.07.2010, 09:36  [ТС]
Так в том - то и дело что необходимые данные можно получить только вычислением. Уже есть готовый запрос с нужными данными под слияние - но в самый последний момент возникает ошибка. Хотелось бы узнать :
1. являеться ли действиетельно источником ошибки наличие вычисляемого поля в запросе
2. Если да, то можно ли это как-нибудь обойти?
3. Если нет, то в чем я не прав?

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

Добавлено через 12 часов 40 минут
Всем спасибо за внимание. Усе заработало как хочеться! Здесь я нашел ответ на свой вопрос если кому интересно:
http://support.microsoft.com/k... sid=global
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
09.07.2010, 09:36
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru