Вопрос по Ole (ms Word)

vvlad

Well-known member
19.01.2007
63
0
#1
Hi All!

Ситуация такова:
Есть код, написанный для Shared Action, который прекрасно работает:
...
Set wObj = CreateObject("Word.Application")
wObj.Documents.Add FileName
wObj.Application.WindowState = wdWindowStateMaximize '
wObj.Visible = True
With wObj
With .Selection
.GoTo wdGoToBookmark, , , "ResumeNumber"
...

Проблема: Создаю Агент, вставляю в него тот же код (касающийся OLE),
на строке ".GoTo wdGoToBookmark, , , "ResumeNumber"" в Word вываливается ошибка "Закладка не найдена". Причем Documents.Add и wObj.Visible = True выполняются.

Файл шаблона "FileName" в обоих случаях "c:\Шаблон.doc"

Никто не сталкивался с таким?
Или может я что-то делаю не так?

Спасибо.
 
A

allex

#2
Работал с полями-Word`a, все окейно.
С bookmark-ми такая же засада
 

morpheus

скриптописец
07.08.2006
3 915
1
#4
я работал не с полями а просто заменял текст , так
Код:
Set wordApp = CreateObject ("Word.Application")
Let wordApp.Visible = False ' Показывать
Set wordDoc = wordApp.Documents.Open(TmpNameFile) ' имя шаблона
Call FindAndReplaceText(wordApp, wordDoc, "%SocialStatus%", GDoc.Social(0)) 'Соц.статус - заменяем в документе Word текст %SocialStatus% на значение поля GDoc.Social(0)
Call FindAndReplaceText(wordApp, wordDoc, "%Address%", GDoc.Address(0)) ' адреса		
Call FindAndReplaceText(wordApp, wordDoc, "%Phone%", GDoc.Phone(0)) 'тел автора	
If GDoc.Anonym(0) ="1" Then
Соответкственно в шаблоне в места где должен быть внесён текст ставяться такие вот записи(тоже обычный текст, но для себя я его выделил спец символами, в данном случае с обоих сторон % ), вот собсвенно и всё

Да, вот код самой процедуры реплейса
Код:
Sub FindAndReplaceText(WordApp As Variant, wordDoc As Variant, ChangedText As String, ReplacementText As String)
Const intMaxLenWord = 255		' максимальная длина значения переменной для замены в шаблоне
Const intCutLenWord = 245		' длина частей значений переменной при выводе длинных значений (если длина > intMaxLenWord)
Const strReplaceKey = "~1#$*"	' хвост для вывода длинных значений
Dim j, lngCountSteps As Long
Dim strOutputWord As String 

On Error Goto LocalErrorHandler

' for ReplacementText, which Len < 255. Replace once
If Len(ReplacementText) < intMaxLenWord Then
With WordApp.Selection.Find
.Text = ChangedText
.Replacement.Text = ReplacementText
.Forward = True
.Wrap = 1
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
End With
Call WordApp.Selection.Find.Execute(,,,,,,,,,,2)	'wdReplaceAll

' for ReplacementText, which Len >= 255. Replace for several steps
Else 		' count of steps	
lngCountSteps = (Len(ReplacementText)\intCutLenWord) ' Msgbox("частей=" + Cstr(lngCountSteps + 1))
For j = 0 To lngCountSteps
If j = lngCountSteps Then			' last step
strOutputWord = ReplacementText
ReplacementText = ""
Else									' not last step - add "tail" 
strOutputWord = Left(ReplacementText, intCutLenWord) + strReplaceKey
ReplacementText = Right(ReplacementText, Len(ReplacementText) - IntCutLenWord)
End If
If j = 0 Then
Call wordDoc.Content.Find.Execute (ChangedText,_
False, False, False, False, False, True,, False, strOutputWord, 2)
Else 
Call wordDoc.Content.Find.Execute (strReplaceKey,_
False, False, False, False, False, True,, False, strOutputWord, 2)
End If	
Next	
End If
Done:
Exit Sub
LocalErrorHandler:	
Print " FindAndReplaceText Error:" + Error$
Resume done
End Sub
 
A

allex

#5
А с полями это как?
т.е. переход не на закладку, а на поле?
Если не сложно, приведите пример.
Код:
Here is the code for creating a new Word document with form fields and updating the form fields with predefined values.

If you are in a UIDcument it is very easy to substitue the predefined values with variables/fields from the UIDocument


Dim s As New notessession
Dim todaydate As New notesdatetime("Today")

Dim word As Variant
Dim wordoc As Variant

Dim todaysdate As String
Dim orderid As String
Dim producedby As String
Dim storeid As String
Dim customername As String
Dim address As String
Dim citytown As String
Dim postcode As String
Dim daytimeno As String
Dim eveningno As String

'Predefined values: (replace with field values from uidoc)
todaysdate = todaydate.localtime
orderid = "2183763248"
producedby = s.username
storeid = "12345"
customername = "John Doe"
address = "Apartment 5c, 5 Test Avenue"
citytown = "Testtown"
postcode = "XX5 5XX"
daytimeno = "1234567890"
eveningno = "0987654321"

'Create the Word object:
Set word = CreateObject("Word.Application") 'Create Word object
Call word.documents.add("Return and Uplift.dot") 'Create a new document based on the template "Return and Uplift.Dot"
Set worddoc = word.activedocument 'Get a handle for the active document

'Assign the field values:
worddoc.FormFields(1).result = todaysdate
worddoc.FormFields(2).result = orderid
worddoc.FormFields(3).result = producedby
worddoc.FormFields(4).result = storeid
worddoc.FormFields(5).result = customername
worddoc.FormFields(6).result = address
worddoc.FormFields(7).result = citytown
worddoc.FormFields(8).result = postcode
worddoc.FormFields(9).result = daytimeno
worddoc.FormFields(10).result = eveningno

worddoc.saveas(customername) 'save the document with the filename of "John Doe.doc"
word.visible = True 'Comment this line if you don't want to show Word.
'word.quit 'remove comment if you want to close rather than show Word.
 

Вложения

O

oshmianski

#6
Для: vvlad
У меня все ОК.
LN 7.0.2, MS Office 2002
Код:
Dim wObj As Variant
Set wObj = CreateObject("Word.Application")
wObj.Documents.Add "e:\temp\asd.doc"
wObj.Application.WindowState = 1
wObj.Visible = True
With wObj 
With .Selection 
.GoTo -1, , , "asd"
End With
End With
Закладку делал так: выделил текст, Вставка -> Закладка
 

vvlad

Well-known member
19.01.2007
63
0
#7
Спасибо всем за помощь!
Испробовал все предложения.
В моей конфигурации (LN 6.5.5 + MS Office 2003) я остановился на следующем:

...
With wObj
With .Selection
.GoTo wdGoToComment, , , "A1"
.TypeText doc.GetItemValue("f1")(0)
...

Для моей задачи важно именно поставить курсор в заданное место шаблона.
На практике выяснено, что из "назначений" метода GOTO (wdGoToBookmark, wdGoToComment, wdGoToField, wdGoToLine, wdGoToTable) у меня работает только wdGoToComment. На нем и остановился.