Word.Application и области редактирования

S

seoman2

Lotus team
17.02.2010
480
1
Не совсем к лотус разделу, проблема более общая.

Есть шаблонный файл docx с несколькими разрешенными областями редактирования.
Хочу получить значение одной из них.

Set WA = CreateObject ("Word.Application")
Set wdoc = WA.Documents.Open

А потом непонятно, как обратиться определенной области редактирования.
Всякие секции и параграфы не подойдут.
 
lmike

lmike

нет, пердело совершенство
Lotus team
27.08.2008
7 256
439
Есть шаблонный файл docx с несколькими разрешенными областями редактирования.
странная формулировка, ну да ладно...
мне почему-то кажется что "областями" вы называете поля (так раньше они, в ворде, назывались), программно - это bookmark
предупреждаю - названия могут "слетать", если вы создадите с "таким же" названием (интерактивно, в ворде)
есть ограничение на длину вставляемой замены
лучше-всего искать их и целиком менять, на свой текст
на эту тему было 100500 вариантов, в т.ч. на notesnet.ru

Более гибким будет замена по шаблону (но там тоже есть засада с длиной текста) - т.е. создаем текст (а не поле) помеченный к-л тегами (я, для себя избрал <Field1>)
почему - для того чтобы м.б. одинаковые "названия" для подстановки
поиск и замену выкладывал здесь, ЕМНИП - в двух вариантах: с использованием COM и POI
последнее - предпочтительнее, работает быстрее, нет ограничение на длину подстановки (я не втыкался)
 
A

alexas1

Lotus team
10.04.2014
1 108
216
неплохой вариант размещать "области редактирования" в ячейки таблицы ворд (можно без границ), тогда просто писать в нужную ячейку (номер табл. известен номер ячейки тоже)
 
S

seoman2

Lotus team
17.02.2010
480
1
Msgbox Cstr(wdoc.Bookmarks.Count) выдает 0.
На основе шаблона на скрине в лотусовой базе есть много доков с заполненным шаблоном.
Мне надо получить значение в поле "Текст".
Менять шаблон уже нельзя.
 

Вложения

lmike

lmike

нет, пердело совершенство
Lotus team
27.08.2008
7 256
439
неплохой вариант размещать "области редактирования" в ячейки таблицы ворд (можно без границ), тогда просто писать в нужную ячейку (номер табл. известен номер ячейки тоже)
с таблицами есть особенности: обтекание, переносы, опять же вложенные - не всегда адекватно ведут себя, именами - только с офиса 2010 (а номера могут и поплыть ;) )
вот потому я и остановился на решении выше
а еще - бывает нужно заменить таблицу целиком (это проще - чем итерировать её стр-ру)
 
lmike

lmike

нет, пердело совершенство
Lotus team
27.08.2008
7 256
439
если это formsfield -
 
S

seoman2

Lotus team
17.02.2010
480
1
Msgbox Cstr( worddoc.Sections(2).FormFields(1).Name ) - нет такого объекта у меня, как FormFields.
Поле не я создавал (
 
lmike

lmike

нет, пердело совершенство
Lotus team
27.08.2008
7 256
439
Msgbox Cstr( worddoc.Sections(2).FormFields(1).Name ) - нет такого объекта у меня, как FormFields.
Поле не я создавал (
я не могу сказать - что у вас есть, у меня и дока нет...
и в принципе, как уже не раз здесь говорил - ССЗБ - накорячили документ, запихнули туда "неизвестно что", используем КОМ, в кот. свои особенности...
Чем не метод заполнения доков - как указано было выше? Переделайте их (шаблоны) под свой документооборот, выкиньте свисто-перделки добавленные неучами МСО - всё - проблема решена
да, не забудьте снять защиту с доков (может в этом причина ваших "проблем), если "ворд" приложен к документу нотуса - не нужна ему псевдо-защита от МС
Мы, сейчас, обсуждаем с вами тему, кот. никаким боком не относится к LDN
 
S

seoman2

Lotus team
17.02.2010
480
1
Могу прислать такой док, но не на форум.
У меня есть рабочий документооборот, в каждом лотусовом документе в одном из полей вложен шаблонный docx файл, в котором юзеры заполняют разрешенные для редактирования поля. Мне нужно у таких доков вытянуть содержимое поля "текст".
 
lmike

lmike

нет, пердело совершенство
Lotus team
27.08.2008
7 256
439
пароли от этих доков известны (чтобы я не ломал вордятину)?
 
lmike

lmike

нет, пердело совершенство
Lotus team
27.08.2008
7 256
439
в вашем случае, иного способа как через... параграфы нет ;)
но здесь есть хак
Код:
Dim pars As Paragraphs, word As Document
Set word = Application.ActiveDocument
Set pars = word.Paragraphs
Dim par As Paragraph
For Each par In pars
    If par.Range.Editors.Count > 0 Then
        MsgBox par.Range.Text
    End If
Next
это VB, переделать код на LS несложно - типы убрать, ActiveDocument не нужен - wdoc у вас, цикл заменить на forall...End forall
 
S

seoman2

Lotus team
17.02.2010
480
1
С параграфами я пробовал. Если в поле "Текст" будет много параграфов, как не взять лишние?
Я как бы думал, брать все параграфы со второй секции, пропустив несколько первых, но тогда зацеплю и . последующие за "текст" поля...
 
lmike

lmike

нет, пердело совершенство
Lotus team
27.08.2008
7 256
439
Если в поле "Текст" будет много параграфов, как не взять лишние?
if будет срабатывать только для тех параграфов, у кот. есть права на "редактирование" (на самом деле - присвоены те - кто может редактировать)
 
lmike

lmike

нет, пердело совершенство
Lotus team
27.08.2008
7 256
439
стразу оговорюсь - такой способ управления информацией в ворде - порочен, в принципе
будет глючать, программный доступ с абзацам (через VBA) работает не всегда стабильно
бывает наслоение всяких объектов/стилей... как результат - сам ворд как-то кажет и находит текст, а вот программно - нет
сталкивался с таким в букмарках (иногда помогало убиение текст и воссоздание заново без форматирования)

второй момент - у вас невозможно отследить - куда ввели текст - т.е. текст получить можно , но понять к чему он относится - нет
Отсюда вывод - информация должна заводится в нотус (в виде полей/документов...) и оттуда подставляться в ворд (в нужные места)

Пользователя НУЖНО максимально изолировать от возможности вносить изменения в МСО, тогда - большинстово проблем отпадет
Желательно, на выходе, получать ПДФ (дабы исправлять стало ощутимо сложнее)
 
S

seoman2

Lotus team
17.02.2010
480
1
Еще вопрос - получаю диапазон
Set worddoc = WordApp.Documents.Open ....
Set myRange = worddoc.Range (кусок текста между закладками)
Причем Cstr(myRange.text) содержит просто текст без абзацев, каких-то пометок жирности и прочего.
Как бы получить текст из myRange, который можно было бы потом обработать?
Мне потом надо заменить символы ворда на html.
 
lmike

lmike

нет, пердело совершенство
Lotus team
27.08.2008
7 256
439
Причем Cstr(myRange.text) содержит просто текст без абзацев, каких-то пометок жирности и прочего.
Как бы получить текст из myRange, который можно было бы потом обработать?
Мне потом надо заменить символы ворда на html.
аппетит приходит...
вот я не вижу правильной такую постановку задачи
оно как-то все вывернуто наизнанку
как можно разделить задачу:
  • вордовые шаблоны - это разные файлы ворда присобаченные к доку нотуса. В них есть "поля" (некие метки, м.б. текстовые) кот. подлежат замене
  • поля для подстановки - нотусевые доки, кот. включают описание, название, значение, шаблон заполнения
  • юзер заполняет поля (нотусевые доки), саму вордятину он не трогает, по кнопке - ему формируют вордятину (в соответ. с выбранным шаблоном)
  • буде на то необходимость - можно выдавать на выход ПДФ (дабы юзеру не повадно было пальцА сувать в документ), кот. сохраняется в БД (в т.ч.)
по вопросу - смотрите в VBA пропертЯ и ф-ции Range
 
S

seoman2

Lotus team
17.02.2010
480
1
Как обработать ошибку, если у документа нет закладок? Не могу проверить существование закладки.
всякие Bookmark(1).Range.Start is nothing не работают ((
Код:
Set worddoc = WordApp.Documents.Open ....
Set Bookmark = worddoc.Bookmarks
mStart% = Bookmark(1).Range.Start
 
savl

savl

Lotus team
28.10.2011
2 249
136
Если версия 2010+ , то возможно через Bookmarks.Count
Свойство возвращает коллекцию закладок, есть подозрение, что коллекция есть всегда, но количество равно нулю.
 
garrick

garrick

Lotus team
26.10.2009
1 024
81
Msgbox Cstr(wdoc.Bookmarks.Count) выдает 0.
На основе шаблона на скрине в лотусовой базе есть много доков с заполненным шаблоном.
Мне надо получить значение в поле "Текст".
Менять шаблон уже нельзя.
Надо точно знать как называется поле. Скорее всего, то, что вы видите на экране это Default Value. Попробуйте
Код:
Dim word As Variant
Set word = CreateObject("Word.Application")
word.Selection.GoTo -1,,,FieldName
MsgBox word.Selection.Text
 
Мы в соцсетях:  ТелеграмВконтактеДзенФейсбукТвиттерЮтуб