Не мой самый чистый код, но он выполняет свою работу.
РЕШЕНИЕ
Это загрузит серию пар ключ-значение из текстового файла в документ 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