Não é o meu código mais limpo, mas faz o trabalho.
SOLUÇÃO
Isso carregará uma série de pares de valores-chave de um arquivo de texto no documento do Word lista ActiveDocument.Variables . Essas Variales são armazenadas persistentemente no Documento, mas eu escolhi separá-las para evitar duplicação e orfandade de variáveis (veja exclusão de marretas no código).
Os valores das variáveis podem ser exibido usando Fields em todo o documento, fazendo referência ao DOCVARIABLE s pelo nome.
O código abaixo não tem tratamento de erros, mas faz algumas verificações básicas de análise para evitar falhas. Não testado muito extensivamente, o mesmo acontece com a sua própria diligência.
USO:
Coloque o código no manipulador Document On Open Event. Ele criará um arquivo com o mesmo nome do documento do Word, mas com uma extensão ".config".
Na criação. o arquivo de configuração terá todas as ActiveDocument.Variables atuais escritas nele para garantir que você não abra um arquivo em branco acidentalmente se copiar o Doc e esquecer ou não tiver conhecimento do arquivo .config.
Se o arquivo de configuração existir, todas as variáveis doc serão excluídas da memória e aquelas na configuração serão carregadas na memória. Você pode alterar o valor de uma variável no arquivo de configuração e ela será atualizada em todo o documento na próxima vez que for aberta.
OptionExplicitPrivateSubDocument_Open()'DimDimiAsLongDimFolderAsStringDimFileNameAsStringDimFullPathAsStringDimFileTextAsStringDimItemAsVariantDimTableAsScripting.DictionaryDimKeyAsVariant'OpenorCreateConfigFileWithNewFileSystemObject'SetupPathFolder=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