Возникновение ошибки "через раз"

Koriolan
Дата: 23.02.2016 22:31:27
Добрый день.

Возникла проблема следующего плана. При щелчке на кнопке в форме открывается копия документа Word, в котором находим соответсвующую метку и вводим текст, взятый из поля этой самой формы. Технически это реализуется при помощи слудющей процедуры:
автор
'Процедура перехода к необходимой метке и вставка соответсвуюещго текста
Public Sub TextInMetka(metka, content)
Selection.GoTo What:=wdGoToBookmark, Name:=metka
With ActiveDocument.bookmarks
.DefaultSorting = wdSortByName
.ShowHidden = False
End With

TypeText (content)

metka = ""
content = ""

End Sub


Проблема в том, что код срабатывает через раз. При закрытии файла Word и повторном запуске данной процедуры возникает ошибка в строке

автор
Selection.GoTo What:=wdGoToBookmark, Name:=metka


т.е., как я понимаю, не удается найти указанную метку. Хотя оная в документе присутствует.

Подскажите, что я упускаю?
Predeclared
Дата: 23.02.2016 22:35:56
Где описана процедура TextInMetka?
Koriolan
Дата: 23.02.2016 22:43:40
Predeclared, в модуле базы данных.

Вызов процедуры при щелчке:

+

Private Sub Кнопка126_Click()
'Готовим шаблон приказа
OpenBlank

'Рабочие переменные

Dim DataPrint As Date

Dim NumberPrint As Integer

Dim ThemePrint As String

Dim Preambula As String


'Присваиваем переменным необходимые данные

DataPrint = Forms!Книга_Наказів!ДатаНаказуДрук

NumberPrint = Forms!Книга_Наказів!НомерНаказу



Call TextInMetka("ДатаНаказу", DataTextInNakaz(DataPrint))

Call TextInMetka("НомерНаказу", NumberPrint)




End Sub
Predeclared
Дата: 23.02.2016 22:51:15
    Selection
    ActiveDocument

Эти методы нужно привязать к их объектам.
Koriolan
Дата: 23.02.2016 22:56:05
Predeclared, В смысле?
Predeclared
Дата: 23.02.2016 23:13:10
Ты пользуешь свойства объекта Application, которые есть в объектной модели WORD,
и которые в VBA проекте Word-а могут быть описаны без указания самого объекта (Application).

В объектной модели Access у объекта Application нет таких свойств,
потому надлежит описывать полностью Объект.Свойство

Неполное описание "проскакивает" в первый раз, и подвешивает экземпляр Word-а.
При следующем попытке возникают ошибки.

зы: а лучше вообще отказаться от пользования этих свойств.
Koriolan
Дата: 23.02.2016 23:30:43
В начале я писал следующее:

Option Compare Text
Option Explicit

Dim obWord As Object 'сам Word - Application
Dim obWindow As Object 'окно документа

этого, выходит не достаточно??
Predeclared
Дата: 23.02.2016 23:40:01
Просто описать объектные переменные недостаточно ни для каких целей.

Во-первых, им нужно присвоить значения - ссылки на объекты.
Set obWord = ...

Во вторых, пользуя методы и свойства этого объекта,
надлежит указывать и сам объект:
obWord.Selection
obWord.ActiveDocument

Засада кроется еще и в том, что на момент исполнения кода
имеется вероятность того, что и Selection и ActiveDocument
вернут ссылки не на то, что планировалось.

Вместо ActiveDocument, например, я бы рекомендовал указывать конкретный экземпляр коллекции Documents.
Koriolan
Дата: 23.02.2016 23:48:50
Может я немного направильно понял Тебя, но когда речь идет о "ссылке на объект" ,что именно подразумевается? Если речь идет об адресе Word'овского файла, то в моем случае, физически он нигде не находится. Я работаю с копией документа, взятого из поля OLE, находящегося в другой таблице базы. Подготовка самого бланка происходит в процедуре openblank вызваной при щелчке. В ней следующее:

Forms!Книга_Наказів!Шаблон = DLookup("ШаблонНаказу", "Типи_наказів", "Номер=" & 1)
Forms!Книга_Наказів!Шаблон.Action = acOLEActivate



Set obWord = GetObject(, "Word.Application")
Set obWindow = obWord.ActiveDocument.ActiveWindow
obWindow.WindowState = 1
obWord.WindowState = 1
obWord.Activate
Predeclared
Дата: 23.02.2016 23:53:08
Koriolan
... Set obWord = GetObject(, "Word.Application") 

Вот. Все правильно.

Осталось при пользовании свойств указать, чьи свойства интересуют:
obWord.Selection