【问题标题】:How to change the text of a form field text box on entry of that text box如何在输入该文本框时更改表单字段文本框的文本
【发布时间】:2019-09-10 22:36:33
【问题描述】:

我正在尝试在输入表单字段文本框时更改其文本。我选择在输入时运行宏,但我似乎无法使用该宏为我的所有字段动态更改它。有数百个字段被动态删除和添加,因此为每个字段设置书签不是此问题答案MS Word Document Form - Check Value of Text Form Field on Exit

中指定的选项

有什么方法可以在输入时访问表单字段,以便我可以在他们输入时更改它?

我已经尝试通过书签来更改它,但这又不是我的选择:

ActiveDocument.FormFields(Selection.Bookmarks(1).Name).Result = "my value"

我已经尝试过 Selection.FormFields(1)...等,但它不允许我在进入时访问它。还有其他方法吗?

我想在输入时访问表单字段以更改值,但不知道该怎么做!

【问题讨论】:

    标签: vba ms-word


    【解决方案1】:

    默认情况下,每个表单域都有一个书签和一个名称。它们是在插入表单域时由 Word 生成的,并且文本域的名称遵循 Text1、Text2 等模式。

    虽然Selection 在触发“On Enter”宏时不会返回表单域,但它会返回书签。通过它,可以获得书签名称并从那里访问表单字段。所以:

    Sub WriteValueToFormFieldOnEnter()
        Dim bkm As Word.Bookmark
        Dim ffldName As String, ffld As Word.FormField
    
        If Selection.Bookmarks.Count > 0 Then
            Set bkm = Selection.Bookmarks(1)
            ffldName = bkm.Name
            Set ffld = ActiveDocument.FormFields(ffldName)
            ffld.result = "New"
        End If    
    End Sub
    

    注意:如果表单字段没有书签名称,因为它们是在同一个文档中复制/粘贴的,则必须将名称分配给表单字段。 (书签名称在文档中必须是唯一的,这就是发生这种情况的原因。)以下代码循环文档中的表单域,并为没有名称的表单域分配名称。

    虽然FormField.Name 的语言参考状态

    返回一个字符串,表示指定表单域的结果。读/写。

    写入此属性会导致错误(至少在 Word 2010 和更高版本中,也许在旧版本中也是如此)。所以有必要使用 Word UI 的表单域属性对话框。

    Sub NameUnnamedFormFields()
        Dim ffld As Word.FormField
        Dim rng As Word.Range
        Dim tbCounter As Long, cbCounter As Long, ddCounter As Long
    
        tbCounter = 1: cbCounter = 1: ddCounter = 1
        For Each ffld In ActiveDocument.FormFields
            If Len(ffld.Name) = 0 Then
                ffld.Select
                With Application.Dialogs(wdDialogFormFieldOptions)
                    Select Case ffld.Type
                        Case wdFieldFormTextInput
                            .Name = "myText" & CStr(tbCounter)
                            tbCounter = tbCounter + 1
                        Case wdFieldFormCheckBox
                            .Name = "myCheckBox" & CStr(cbCounter)
                            cbCounter = cbCounter + 1
                        Case wdFieldFormDropDown
                            .Name = "myDropDown" & CStr(ddCounter)
                            ddCounter = ddCounter + 1
                        Case Else
                            MsgBox "Unknown form field type."
                    End Select
                    .Execute
                End With
            End If
        Next
    End Sub
    

    【讨论】:

    • 感谢您的回复!我收到“请求的集合成员不存在”。当我没有设置书签时出现错误消息。你知道为什么会这样吗?
    • 或者在上面提到的检查是否有书签的情况下,它只是跳过了 IF 语句。如何让它读取默认书签?
    • 是否有可能从表单字段/文档中删除了默认名称?也许您首先需要构建一个“循环”宏来遍历文本输入类型的表单字段并为其分配名称(只需使用带有一些文本的计数器)@JakeWest
    • 我想我将不得不采取这种方法。感谢您的帮助!
    • 我已经添加了关于如何做到这一点的信息和代码,@JakeWest
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-12
    • 1970-01-01
    • 2019-10-31
    • 2015-08-23
    相关资源
    最近更新 更多