Есть документ MS Word 2016 с установленным DOCVARIABLES. Например:
{ DOCVARIABLE "SerialNumber" \* MERGEFORMAT }
Мне нужно заполнить этот DOCVARIABLE через VBA с InputBox. Код VBA:
Sub Document_Open()
Dim sNumber, mNumber, iDate As String
sNumber = InputBox("Please enter the Serial Number", "Serial number", "Enter
the Serial Number here")
mNumber = InputBox("Please enter the Model Number", "Model number", "Enter
the Model Number here")
iDate = InputBox("Please enter the Date of Issue, dd.mm.yyyy", "Date of
Issue", "Enter the Date of Issue here")
With ActiveDocument
.Variables.Add Name:="SerialNumber", Value:=sNumber
.Variables.Add Name:="ModelNumber", Value:=mNumber
.Variables.Add Name:="IssueDate", Value:=iDate
.Fields.Update
End With
End Sub
Когда документ открывается, он автоматически запрашивает данные пользователя. Когда данные вводятся, они затем заполняются в DOCVARIABLES в документе. Но если я снова запускаю код (когда DOCVARIABLES уже хранит данные), он выдаст мне ошибку: Ошибка времени выполнения "5903": имя переменной уже существует.
Вопрос в том, как это исправить и сделать DOCVARIABLES обновляемым.
Вот решение, предоставленное Синди Мейстер, но с введением массива:
Sub Document_Open()
Dim sNumber As String, mNumber As String, iDate As String, i As Integer
Dim varData(1 To 3) As String
varData(1) = "SerialNumber"
varData(2) = "ModelNumber"
varData(3) = "IssueDate"
Dim varInput(1 To 3) As String
varInput(1) = InputBox("Please enter the Serial Number", "Serial number", "Enter the Serial Number here")
varInput(2) = InputBox("Please enter the Model Number", "Model number", "Enter the Model Number here")
varInput(3) = InputBox("Please enter the Date of Issue, dd.mm.yyyy", "Date of Issue", "Enter the Date of Issue here")
For i = 1 To 3
With ActiveDocument
If DocVarExists(varData(i), ActiveDocument) Then
.Variables(varData(i)).Value = varInput(i)
Else
.Variables.Add Name:=varData(i), Value:=varInput(i)
End If
.Fields.Update
End With
Next i
End Sub
Function DocVarExists(sVarName As String, doc As Word.Document) As Boolean
Dim var As Word.Variable, bExists As Boolean
bExists = False
For Each var In doc.Variables
If var.Name = sVarName Then
bExists = True
Exit For
End If
Next
DocVarExists = bExists
End Function