vba слово переменные значение удалить - PullRequest
0 голосов
/ 05 июля 2018

Есть документ 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

1 Ответ

0 голосов
/ 05 июля 2018

С документом Variables у вас есть две возможности.

«Простой» - просто присвоить значение. Нет необходимости использовать метод Add. Таким образом, вам нужна только одна строка кода, независимо от того, существует ли в документе Variable или нет:

ActiveDocument.Variables("name").Value = "new value"

(Примечание: Variables происходят из старых дней Word Basic, когда вещи были гораздо менее формальными, чем они стали. A CustomDocumentProperty, напротив, требует метода Add - объект был введен в дни VBA.)

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

Sub Document_Open()
  Dim sNumber as String, mNumber As String, iDate As String

  sNumber = InputBox("Please enter the Serial Number", "Serial number", _
    "Enter the Serial Number here")

  With ActiveDocument
    If DocVarExists("SerialNumber", ActiveDocument) Then
       .Variables("SerialNumber").Value = sNumber
    Else
       .Variables.Add Name:="SerialNumber", Value:=sNumber
    End If
   .Fields.Update   
  End With   
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

(Примечание: это подход требуется для CustomDocumentProperties.)

Просто замечание о Variable объектах для всех, кто читает это и не знаком с ними: как только назначается строка emtpy (нулевой длины), объект Variable удаляется и больше не доступен в документе.

...