1

Я не хочу раскручивать свой собственный инструмент в VBA, так как он был бы слишком хрупким для быстрого кодирования (и раздачи другим пользователям), или я бы в конечном итоге много написал для такого простого конечного результата.

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

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

Это для руководств, где содержание, автор, имена и заголовки меняются от одного проекта к другому, но формат следует тому же шаблону.

2 ответа2

1

Чтобы запустить шаблон формы или объединение писем: Word 2016


    Вкладка «Почтовые рассылки» → «Начать слияние» → «Мастер пошагового управления MM»
    Выберите: Письма, [Далее]
    Выберите: Использовать текущий документ, [Далее]
    Выберите: Введите Новый список → СОЗДАТЬнастроить столбцыДобавить / Удалить / Переименовать

    Сохранить: списки адресов Microsoft Office (* .mdb) - это динамический список для формы / шаблона.

[Далее] Напишите ваше письмо. Сделайте свой шаблон сейчас.

Теперь, чтобы вставить динамические "поля":

    Вкладка почтовых рассылок → [Вставить поля слияния] Вставьте "поле" везде, где новая страница будет меняться от проекта к проекту.

Вот как это выглядит: изображение (нажмите на изображение, чтобы посмотреть / просмотреть анимированный GIF)

Служба поддержки Microsoft - Word (объединение писем): ССЫЛКА
Служба поддержки Microsoft - Объединение писем с использованием Excel: LINK

1

Не мой самый чистый код, но он выполняет свою работу.

РЕШЕНИЕ

Это загрузит серию пар ключ-значение из текстового файла в документ Active Document Word.Список переменных . Эти переменные постоянно хранятся в документе, но я решил разбить их, чтобы избежать дублирования и потери переменных (см. Удаление кувалдой в коде).

Значения переменных могут затем отображаться с использованием полей по всему документу путем ссылки на DOCVARIABLE по имени.

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

ИСПОЛЬЗОВАНИЕ:

Поместите код в обработчик события Document On Open. Он создаст файл с тем же именем, что и документ Word, но с расширением «.config».

На создание. файл конфигурации будет иметь все текущие ActiveDocument.Переменные, записанные в него, чтобы вы случайно не открыли пустой файл, если копируете документ и забыли или не знаете о файле .config.

Если файл конфигурации существует, то все переменные doc удаляются из памяти, а переменные в конфигурации загружаются в память. Вы можете изменить значение переменной в файле конфигурации, и оно будет обновляться по всему документу при следующем его открытии.

Option Explicit

Private Sub Document_Open()

    'Dim
    Dim i As Long
    Dim Folder As String
    Dim FileName As String
    Dim FullPath As String
    Dim FileText As String
    Dim Item As Variant
    Dim Table As Scripting.Dictionary
    Dim Key As Variant

    ' Open or Create Config File
    With New FileSystemObject

        ' Setup Path
        Folder = ThisDocument.Path & "\"
        FileName = .GetBaseName(ThisDocument.Name)
        FullPath = Folder & FileName & ".config"

        If (.FileExists(FullPath)) Then

            ' Sledge Hammer Cleanup of Document Vars, avoids memory bloat by synchronizing variables with .config file
            For i = ActiveDocument.Variables.Count() To 1 Step -1
                ActiveDocument.Variables.Item(i).Delete
            Next i

            ' Open / Read
            With .OpenTextFile(FullPath, ForReading, False)

                ' Get File Contents
                If Not (.AtEndOfStream) Then
                    FileText = .ReadAll
                End If

                .Close
            End With
        Else

            ' Create / Write
            With .OpenTextFile(FullPath, ForWriting, True)

                ' Write One Key-Value pair per line
                For Each Item In ActiveDocument.Variables
                    .WriteLine (Item.Name & ":=" & Item.Value)
                Next

                .Close
            End With
        End If
    End With

    ' Parse Config Text for Runtime
    Set Table = ParseVariables(FileText)
    For Each Key In Table.Keys
        ActiveDocument.Variables(Key) = Table(Key)
    Next

    ' Update All Fields in Document
    ActiveDocument.Fields.Update

    ' Save File so user does not get nuisance prompts
    ActiveDocument.Save
End Sub


Private Function ParseVariables(text As String) As Scripting.Dictionary

' Dim
Dim i, n As Long
Dim Lines As Variant: Lines = Split(text, vbCrLf)
Dim VarTable As New Scripting.Dictionary
Dim Key, Value As String

    ' Loop
    For i = LBound(Lines) To UBound(Lines)

        Debug.Print ("Lines(" & i & ") = " & Lines(i))

        ' Find the ":=" delimiter in each line that splits the variable name from its value
        n = InStr(1, Lines(i), ":=", vbBinaryCompare)

        ' Escape if not delimited
        If (n > 0) Then

            ' Extract Key before ":=" and Value from after ":="
            Value = Mid(Lines(i), n + 2)
            Key = Trim(Mid(Lines(i), 1, Len(Lines(i)) - Len(Value) - 2))

            ' Escape if either Key or Value are empty
            If (Len(Key) > 0) And (Len(Value) > 0) Then
                VarTable.Item(Key) = Value
            End If
        End If
    Next i

    ' Return
    Set ParseVariables = VarTable

End Function

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .