powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Какой тип поля выбрать в Word-документе, чтобы легко было апдейтить из VBA?
14 сообщений из 14, страница 1 из 1
Какой тип поля выбрать в Word-документе, чтобы легко было апдейтить из VBA?
    #32639892
Фотография Лифчик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уважаемые модераторы аксесса! Низкий поклон Вам за вашу просветительскую и санитарную деятельность. Но у меня большая просьба перед тем, как отправить этот топик в Офис, пусть кто-нить ответит сюда, ибо нет на SQL более популярного, посещаемого знатоками всех и всяческих программистских наук, пакетов и тулзов, форума.

Проблема, которую мне предстоит завтра решать (автоматически или вручную) такова. По постановке она похожа на т.н. слияние, но есть нижеследующие нюансы.

Есть общий документ, в котором из некой табличной формы надо будет подставлять ФИО, должность, организация, "Уважаемый/ая " и т.п.
Но, в отличие от MailMerge (который я, кстати тоже совсем почти не знаю), надо действовать по схеме:

1. Переход по записи табличной формы на нового адресата
2. Открытие исходного документа и подстановка в соответствующие Fields документа соответствующих значений
3. Спасение полученного нового Doc-файла с новым именем
4. Преобразование полученного файла в PDF путем печати на Acrobat Distiller
5. Loop

Т.е. на каждого адресата должен быть создан новый Doc и PDF файл

Внимание вопрос - какого типа Fields под такой обмен лучше всего организовать в исходном Word-документе? Мне желательно, чтобы в нем светилось, например, поле "Position", а в полученном файле на конкретного адресата я мог заменить его командой типа
Код: plaintext
ActiveDocument.Fields("Position").Text=rst!Position
(синтаксис неправильный, но именно так подменяется, например, Гиперлинк в тексте)

ЗЫ Просто потерялся во всевозможных филдах Ворда и не могу найти подходящее без наворотов поле.
...
Рейтинг: 0 / 0
Какой тип поля выбрать в Word-документе, чтобы легко было апдейтить из VBA?
    #32639914
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1) похоже, слияние должно было бы тебя полностью устроить. Только рулить им пришлось бы со стороны ворда. Ну и ладно. Сделал бы в шаблоне документа процу, умеющую получить рекордсет - и вперед.

2) Если объявить запрет на слияние, то видится много дорог, аж глаза разбегаются. я бы, наверно, прошел нижеописанной дорогой (правда кода под рукой нет, поскольку еще не ходил - чистая мысль, и я ее думаю. патамушта у меня есть палец и место к которому его прислонить...), хотя еще мог бы "путей" накидать

"Поля" формы документа я бы оформил как ПОЛЬЗОВАТЕЛЬСКИЕ СВОЙСТВА документа. (Файл-Свойства-Прочие)
В самом документе проставил бы жесткие ссылки на эти свойства.
(Вставка-Поле-поле DocProperty-любимое свойство из списка)

В коде с этим пытался бы работать в стиле
Dim tC As CustomProperty
For Each tC In ActiveDocument.CustomDocumentProperties
tC.Value="bla-bla-bla"
Next

ActiveDocument.Fields.Update

ЗЫ - не знаю будет ли все это работать.... и то ли, чего ожидано было...
...
Рейтинг: 0 / 0
Какой тип поля выбрать в Word-документе, чтобы легко было апдейтить из VBA?
    #32639923
Фотография Лифчик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо, Victosha, как раз одно из того, чего ожидалось, мне бы хоть за что-нибудь зацепиться. Все-таки это обилие наворотов и возможностей меня доканывает, особо когда в привычном месте на витрине не можешь найти своей привычной колбасы по 2р90к (это я про невозможность по имени обратиться к полю -ActiveDocument.Fields("Position"))
Буду щас твой метод испытывать. О результатах доложу
...
Рейтинг: 0 / 0
Какой тип поля выбрать в Word-документе, чтобы легко было апдейтить из VBA?
    #32639924
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот еще подумал - в "офисе" этому вопросу, наверно, луше жилось бы...
...
Рейтинг: 0 / 0
Какой тип поля выбрать в Word-документе, чтобы легко было апдейтить из VBA?
    #32639930
Фотография Лифчик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я об это подумал заранее :) (см.1 абзац)
Модеры - можете отправлять топик по адресу!
...
Рейтинг: 0 / 0
Какой тип поля выбрать в Word-документе, чтобы легко было апдейтить из VBA?
    #32639980
Фотография Лифчик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот так прокатывает - изменение поля документа "в лоб", без всякого Property
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Private Sub start_DblClick(Cancel As Integer)
Dim wordApp As Word.Application
Dim wordDoc As Word.Document
Set wordApp = GetObject(, "Word.Application")
Set wordDoc = wordApp.Documents.Open("D:\Sasha\Test\LetterTemplate.doc")
wordDoc.CustomDocumentProperties("Position") = "Начальник отдела"
ActiveDocument.Fields.Update
wordDoc.SaveAs FileName:="D:\Sasha\Test\1.doc"
wordDoc.Close
Set wordDoc = Nothing
Set wordApp = Nothing
End Sub
Ибо с пропертями опять огород, Object not set и прочая фигня. Но мне достаточно.
Спасибо еще раз
...
Рейтинг: 0 / 0
Какой тип поля выбрать в Word-документе, чтобы легко было апдейтить из VBA?
    #32640042
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
понял.
мне сгодится.
нет ли других признаков аллергии, кроме "неустойчивости" работы с CustomProperty?

версия -то у ворда какая?
...
Рейтинг: 0 / 0
Какой тип поля выбрать в Word-документе, чтобы легко было апдейтить из VBA?
    #32640060
Фотография Лифчик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Офис XP Word 2002 (10.4219.2625)

На счет устойчивости работы ничего не могу сказать - получил результат и продолжил отдых (воскресенье ведь :).И спропетями не стал копаться по этой же причине. Раз там отдельно надо коллекцию и элемент коллекции описывать (Object not set) и еще гадать какое пропети - просто, или Custom, или CustomDocument... - плюнул и обратился в лоб. Получилось...
...
Рейтинг: 0 / 0
Какой тип поля выбрать в Word-документе, чтобы легко было апдейтить из VBA?
    #32640070
lobodava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пока писал уже всё решилось. Ну не пропадать же. Пусть будет запасным вариантом :)

Если в исходный документ вставить именованные закладки, то задачу с созданием большого колличества вордовских документов можно решить так:
Код: plaintext
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.
Public Sub WordTest()
    Dim rst As DAO.Recordset
    Dim wrdApp As Word.Application
    Dim wrdDoc As Word.Document
    Dim i As Integer
    
    Set rst = CurrentDb.OpenRecordset("tblMyTable", dbOpenForwardOnly)
    
    Set wrdApp = New Word.Application
    wrdApp.Visible = True
    
    i =  1 
    
    Do Until rst.EOF
        wrdApp.Documents.Open "C:\test.doc"
        
        Set wrdDoc = wrdApp.ActiveDocument
        
        wrdDoc.Bookmarks("Description").Select
        wrdApp.Selection.Text = rst!Description
        
        wrdDoc.SaveAs "C:\test" & Trim(Str(i)) & ".doc"
        wrdDoc.Close False
        
        rst.MoveNext
    Loop
    
    wrdApp.Quit
    Set wrdApp = Nothing
End Sub
где "Description" - имя закладки и имя поля в таблице.
...
Рейтинг: 0 / 0
Какой тип поля выбрать в Word-документе, чтобы легко было апдейтить из VBA?
    #32640102
Фотография Лифчик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот только исходно закладка как метка выглядит, т.е. не имеет протяжения Вроде бы. ИМХО у меня не получилось в исходном тексте закладку сделать уже с неким текстом, т.е. как с Гиперлинком не получается работать, у которого есть Address и TextToDisplay. Или я не прав?
...
Рейтинг: 0 / 0
Какой тип поля выбрать в Word-документе, чтобы легко было апдейтить из VBA?
    #32640108
lobodava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если выделить какое-либо слово, пойти в меню Вставить>Закладки, там добавить новую закладку, нажать "Закрыть", то закладка будет с текстом.
...
Рейтинг: 0 / 0
Какой тип поля выбрать в Word-документе, чтобы легко было апдейтить из VBA?
    #32640119
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
закладки - хорошо. Пусть это называется вариант2.
С ними - закладками- есть маленькая проблема, или особенность, если слово проблема не нравится.
При вставке текста в закладку умолчательным способом - закладка исчезает из документа. Этот момент нужно специально обходить, если нужно сохранить закладку для дальнейшего использования. Если стоит задача - создать "плоский" документ и сохранить его - это не важно.
Но.
Вариант с пользовательскими реквизитами (ака свойствами), на мой взгляд, а) лучше соответствует задаче трансформации база - данных - документ, б) пригоден для организации циклических операций типа печати множества однотипных документов на открытом рекордсете, в) приходен к обратной трансформации документа в поля базы. Закладки тоже пригодны, при условии, что они сохранены в целевом документе. г) список закладок живет в теле документа, а список реквизитов - в заголовке. На этом основании есть вероятность, что с реквизитами (заполнением, присвоением значений) работа может вестись быстрее, д) при неоходимости внесения ручных изменений в реквизитах - естественным образом есть специальное место, где это должно происходить. Это уменьшает вероятность случайной порчи структуры документа при ручном ползании по закладкам. Запрограммировать ручное заполнение реквизитов через UserForm или форму Акцесс гораздо удобнее, на мой взглад, по сравнению с закладками. Удобство состоит в том, что список реквизитов сам по себе не имеет географической привязки к тексту документа.
Повляется она только после добавления поля, ссылающегося на реквизит.

Вот примерно такую мысль я думал, прислонив палец ко лбу, пока Лифчик трудился над кодом.

Если же перечислять прочие варианты, то упомянуть можно о следующих
а) отвергнутое слияние

б) для документов типа возвратных анкет ( типа клиент заполняет и возвращает в организацию) - удачными могут оказаться внедряемые элементы управления. (Собственно для этого они и задумывались, но уж больно специальная область применения)

в) Собственный механизм закладок, реализованный как специальные маркеры в тексте документа, далее а) с прямой реплейсом на вычитанном в строку документе, хранимом в формате ртф или хтмл, б) ОЛЕ-файд и реплейс.

г) ... - кто продолжит дальше?
...
Рейтинг: 0 / 0
Какой тип поля выбрать в Word-документе, чтобы легко было апдейтить из VBA?
    #32717158
Ворд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Захотел навставлять CustomDocumentProperties програмно (чтобы потом проверить, что удобнее - закладки-то у меня уже есть):
Help 2000CustomDocumentProperties Property

Returns a DocumentProperties collection that represents all the custom document properties for the specified document. Read-only.

больше ничего найти не смог, но делаю в аксессе так (при заполнения из рекордсета, одновременно заполняя закладки):
Код: plaintext
1.
wrD.Bookmarks.Add (sName & sSuf), wrdR 
wrD.CustomDocumentProperties.Add sName & sSuf,  1 ,  1 ,  1 , sName & sSuf
- работает!!! т.е. вставляет проперти, первый параметр - имя, последний - ссылка. Как бы раскрутить это дело на вставку несвязанных свойств, + понять, через что передается значение (а не ссылка)...
ага, понял. работает точно так-же как Office.DocumentProperties (который у меня в аксессе отключен, да и все одно не поставлена справка).
Кстати, как этот класс называется "абстрактный?", или еще как? и как пройти (как "точки расставить") от наследника к "предку" и его методам/св-вам? Чтобы синтаксис подсвечивался. Не понял (подключение ссылок на офис не выдало методов "предка"), поэтому видимо так и для кастомов:
авторFunction Add(Name As String, LinkToContent As Boolean, [Type], [Value], [LinkSource]) As DocumentProperty

... придется перебрать все Type ? справка-то недоступна...
текс, перебрал:
(wrD.CustomDocumentProperties.Add "test" & i, False, i, i )
1 - число
2 - буленовский
3 - дата
4 - текст
5 - число (интересно, чем отличается от 1)
(все остальное не лезет)
при связи (LinkToContent:=True) тип и значения перекрываются данными из закладки.


удаляется из этого "ридонли" так:
wrD.CustomDocumentProperties(sName).Delete
(если документ не занят).




ЗЫ : Интересно, Read-only. это в том смысле, что совем коллекцию дропнуть низзя, а членов в нее натыкать можно, или еще почему???? И почему тогда методы не подсвечиваются?

Пока не придумал, чем пропертя лучче закладок (кроме того, что их нет в тексте, и юзер не должен смочь убить их руками)
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Какой тип поля выбрать в Word-документе, чтобы легко было апдейтить из VBA?
    #36259889
assa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лифчик
какого типа Fields под такой обмен лучше всего организовать в исходном Word-документе? Мне желательно, чтобы в нем светилось, например, поле "Position", а в полученном файле на конкретного адресата я мог заменить его командой типа
Код: plaintext
ActiveDocument.Fields("Position").Text=rst!Position
(синтаксис неправильный, но именно так подменяется, например, Гиперлинк в тексте)

ЗЫ Просто потерялся во всевозможных филдах Ворда и не могу найти подходящее без наворотов поле.
на пятый год вопроса докопался я до семейства FormFIelds.
т.е. вставлем обычные текстовые поля { FORMTEXT } или { FORMCHECKBOX }, к которым в защищенном режиме ходим через их закладки (примерно как у lobodava)

Код: plaintext
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.
Function WordFldsPutFrRstByName (wrD As Object, rst As Recordset, sSuf As String, SetNull As Integer) As Integer   'wrD As  Word.Document 'Object
'wrD As Word.Document , Rst - текущая запись
Dim wrdR As Object  'Word.FormFields '
Dim sName As String, i   As Long
    If Not (rst.EOF And rst.BOF) Then
        On Error Resume Next
        For i =  0  To rst.Fields.Count -  1 
            sName = rst.Fields(i).Name
            If (SetNull) And IsNull(rst.Fields(i)) Then
                'пропускаем публикацию Null (оставляем "по умолчанию)
            Else
                Set wrdR = wrD.FormFields(sName & sSuf) '.Result
                If Not wrdR Is Nothing Then
                    If wrdR.Type =  71  Then 'wdFieldFormCheckBox = 71
                        wrdR.CheckBox.Value = rst.Fields(i)
                    Else
                        wrdR.Result = rst.Fields(i)
                    End If
                End If
            End If
            Set wrdR = Nothing 'чтобы не вставлять при ошибках в старые
        Next i
        
        wrD.UndoClear
    End If
    WordFldsPutFrRstByName = True
End Function

кто бы навел на идею, как приходящий из рекордсета разрыв строки (VbNewLine) на вордовый конец строки ^l, или, на худой, конец абзаца ^p помянять в поле в защищенном режиме (режим правки полей)? (т.е. когда все эти методы Find и т.п. не работают). А то ж на стороне запроса придется заранее рубить на части, а на стороне шаблона ворда - делать кучу доп полей (подабзацев)).
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Какой тип поля выбрать в Word-документе, чтобы легко было апдейтить из VBA?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]