【问题标题】:Word userform - only allowing to add data to bookmark onceWord 用户表单 - 只允许将数据添加到书签一次
【发布时间】:2020-03-19 22:20:17
【问题描述】:

我确实有一个用 word 填充预定义书签的用户表单。我使用以下代码将文本写入书签:

Private Sub OKButton_Click()

Dim Text1 As Range
Set Text1 = ActiveDocument.Bookmarks("Text1").Range
Text1.Text = Me.ComboBox1.Value

当我再次点击 OK 按钮时,文本被添加到书签中(并且可以一遍又一遍地完成)。这应该是不可能的。怎么解决?

【问题讨论】:

  • 提出的建议有帮助吗?

标签: vba ms-word userform


【解决方案1】:

如果书签应该只写入一次,我会在第一次写入时删除书签。如果代码再次运行,这将导致错误,因此首先检查书签是否存在。

例如

Private Sub OKButton_Click()

Dim Text1 As Range
Dim doc As Document
Dim bkm As Bookmark
Dim bkmName As String

Set doc = ActiveDocument
bkmName = "Text1"
If doc.Bookmarks.exists(bkmName) Then
    Set bkm = doc.Bookmarks(bkmName)
    Set Text1 = bkm.Range
    Text1.Text = "test" ' Me.ComboBox1.value
    bkm.Delete
Else
    Debug.Print "The bookmark has been removed."
End If
End Sub

请注意,此方法假定书签类型是“工字形”类型的书签:它标记文档中的一个位置并且不包含任何内容。

如果使用了“括号”书签(书签包围/包含至少一个字符),那么为书签分配的文本会自动删除书签。在这种情况下,不需要bkm.Delete 行。

【讨论】:

    【解决方案2】:

    通常,您会使用关闭用户窗体的命令来结束 OK 按钮子,这会阻止第二次单击:

      Unload UserForm1
    

    但如果您想让文本无法再次添加,您可以在书签中添加对现有文本的检查:

    Private Sub OKButton_Click()
      Dim Text1 As Range
      Set Text1 = ActiveDocument.Bookmarks("Text1").Range
      If Text1.Text <> Me.ComboBox1.value Then
        Text1.Text = Me.ComboBox1.value
      Else
        MsgBox "That text has already been entered."
      End If
    End Sub
    

    【讨论】:

    • 鉴于问题描述的上下文,书签是“I-beam”类型并且不包含任何内容。所以上面描述的检查是行不通的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-26
    • 1970-01-01
    • 1970-01-01
    • 2018-03-25
    相关资源
    最近更新 更多