【问题标题】:vba word variables value deletevba word变量值删除
【发布时间】:2018-07-06 13:06:33
【问题描述】:

有一个 MS Word 2016 文档,其中设置了 DOCVARIABLES。例如:

{ DOCVARIABLE "SerialNumber" \* MERGEFORMAT }

我需要通过 VBA 使用 InputBox 填写此 DOCVARIABLE。 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 可更新。

这是 Cindy Meister 提供的解决方案,但引入了数组:

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

【问题讨论】:

    标签: vba ms-word docvariable


    【解决方案1】:

    使用文档Variables,您有两种可能。

    “简单”的方法是简单地分配值。根本不需要使用Add 方法。所以你只需要一行代码,不管Variable是否已经存在于文档中:

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

    (注意:Variables 起源于旧的 Word Basic 时代,在那个时代,事情远没有现在那么正式。相比之下,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 对象就会被删除,并且不再在文档中可用。

    【讨论】:

    • 我明天将测试您的解决方案并提供反馈。感谢您的快速回复!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多