для общей информации по теме (так - вспомнилось)...
многие граблеходцы КОМа базируются на создании "полей" (так называемых) в ворде...
ограничения:
- невозможность одинакового названия (а такая необходимость часто возникает)
- проблемы с типами, при попытке заполнять их из нотусов, вокэраунд - реплэйсить букмарки, к кот. они относятся)
- при реплэйсах букмарков - слетают стили, вокэраунд - установка пробела перед полем и задание такогоже стиля, вместе с полем
при часто повторяющихся, одинаковых данных, всё это превращается в гимор неописуемый (чего стоит только создание полей)
вощем - МСО, со всеми удобствами
Вот у меня есть контракт с необходимостью >300! замен, при уникальных ок 20...
ну и вытекающие вокэраунды:
- в существующих шаблонах заменить все поля (букмарки) на шаблон текста, типа <Field_Name_Client>, например - в таких брэкетах
- использовать (если уж КОМ) замену текста
- ну и напряжённо думать про уход от ворда к ХМЛ
ну и ф-ции, набросал (в т.ч. исполльзуя код Андрея
Ссылка скрыта от гостей
, в букмарках и константах):
- получение списка букмарков (полей, в нашем контексте)
Код:
Function GetBookmarks(worddoc As Variant, bookmarks List As String) As Boolean
Erase bookmarks
Dim bmkName As String, bmkText As String
On Error Goto ErrorHandler
Forall mark In worddoc.Bookmarks
On Error Goto WrongMark
bmkName=mark.Name
worddoc.Application.Selection.GoTo wdGoToBookmark, , , bmkName
bmkText=worddoc.Application.Selection.Text
On Error Goto ErrorHandler
bookmarks(bmkName)=bmkText
Goto nxt
WrongMark:
Resume nxt
nxt:
End Forall
GetBookmarks=True
ExitFunctoin:
Exit Function
ErrorHandler:
Call RaiseError()
Erase bookmarks
Resume ExitFunctoin
End Function
- получение списка шаблонов текста, есть тонкость - колапс, без него зацикливает ворд, даже в нативном вордвасике, в табличных параграфах:
Код:
Function GetListByTemplate(worddoc As Variant, template As String, textlist List As String) As Boolean
Erase textlist
On Error Goto ErrorHandler
Dim wObj As Variant
Dim rngToSearch As Variant
Dim rngResult As Variant
Dim i As Integer
Dim s As String
Set wObj = worddoc.Application
Set rngToSearch = worddoc.Content
Set rngResult = rngToSearch.Duplicate
'.Text = ""
rngResult.Find.Text = template '"\<*\>"
rngResult.Find.Forward = True
rngResult.Find.Wrap = wdFindStop
rngResult.Find.MatchCase = False
rngResult.Find.MatchWildcards = True
Do While rngResult.Find.Execute()
' rngResult.Find.Execute , MatchWildcards:=True, Forward:=True
' If Not rngResult.Find.Found Then Exit Do
i = i + 1
rngResult.Select
s = worddoc.Application.Selection.Text
rngResult.Collapse 0 'wdCollapseEnd
textList(s)=""
'rngResult.Start = rngResult.Start + Len(s)
'rngResult.End = rngResult.Start + 20
'rngResult.Select
's = worddoc.Application.Selection.Text
'and extending the end of rngResult
' rngResult.End = rngToSearch.End
'Loop Until Not rngResult.Find.Found
Loop
Print "Occurance#"+Cstr(i)
GetListByTemplate=True
ExitFunctoin:
Exit Function
ErrorHandler:
Call RaiseError()
Erase textlist
Resume ExitFunctoin
End Function
- реплейс по шаблонам, тоже с "толстостью" - замена ср-вами ворда (иначе - медленно):
Код:
Function ReplaceByTemplate(replacementList List As String, worddoc As Variant) As Boolean
On Error Goto ErrorHandler
Dim wObj As Variant
Dim rngToSearch As Variant
Dim rngResult As Variant
Dim i As Integer
Dim s As String
Set wObj = worddoc.Application
Set rngToSearch = worddoc.Content
Forall m In replacementList
i=0
Set rngResult = rngToSearch.Duplicate
rngResult.Find.Text = Listtag(m)
rngResult.Find.Forward = True
rngResult.Find.Wrap = wdFindStop
rngResult.Find.MatchCase = False
rngResult.Find.MatchWildcards = True
rngResult.Find.Replacement.Text=m
rngResult.Find.Execute ,,,,,,,,,,wdReplaceAll
' Do While rngResult.Find.Execute()
' i = i + 1
' rngResult.Select
' worddoc.Application.Selection.Text=m
' rngResult.Collapse 0 'wdCollapseEnd
' Loop
Print {Значение:}Listtag(m) ' & ", #"+Cstr(i)
End Forall
ReplaceByTemplate=True
ExitFunctoin:
Exit Function
ErrorHandler:
Call RaiseError()
Resume ExitFunctoin
End Function
ну и экзампелы пользования (обратите внимание на "толстость" экранирования брэкетов - потому как они служебные в ворде):
- получение списка шаблонов:
Код:
Sub Initialize
Dim textlist List As String
Dim worddoc As Variant
Set worddoc=GetWordDocumentObject("c:\test.doc")
Call GetListByTemplate(worddoc, "\<*\>",textlist)
Debug=True
Dim i As Integer
Forall m In textList
i=i+1
End Forall
DbgMsg("Unique strings#"+Cstr(i))
End Sub
- замены, по шаблону
Код:
Sub Initialize
Dim textlist List As String
Dim worddoc As Variant
Set worddoc=GetWordDocumentObject("c:\test.doc")
textList({\<Сетра\>})={[Форма1]}
textList({\<Сетры\>})={[Форма2]}
textList({\<Сетре\>})={[Форма3]}
Call ReplaceByTemplate(textlist, worddoc)
End Sub