重置表单域会损坏Word文档

时间:2019-06-14 19:17:56

标签: vba ms-word form-fields

我有一个很大的动态Word宏,上面有许多表单域。运行需要很长时间,到目前为止,最耗时的部分是在映射所有表单域之前清除它们。现在,我正在遍历它们并将它们分别设置为=“”。我找到了一种更快的方法,但是它总是会损坏文档。

1)当前:

For Each fld In doc.FormFields
    If fld.Type = wdFieldFormTextInput And fld.Result <> "" Then
        fld.Result = ""
    ElseIf fld.Type = wdFieldFormCheckBox Then
        fld.CheckBox.Value = False
    End If
Next

2)尝试过:

ActiveDocument.ResetFormFields

和3)

Unload Me

在命令按钮中单击事件

1)每次至少需要一分钟 2)几乎是即时的,但是破坏了文档(错误提示“ Word遇到问题。您将无法撤消此操作...”) 3)引发错误-“ 361:无法加载或卸载此对象”

我要么希望2)正常工作,要么希望找到更快的方法来清除表单域。 感谢您的宝贵时间。

1 个答案:

答案 0 :(得分:1)

请参阅(2):这不只是警告,而是错误消息,并且没有文档损坏。当文档不受保护时,Word总是会丢失“撤消”列表,这是使用此方法在幕后发生的情况。

我想到了两种方法。一种是禁用警报,这应该抑制该警告。另一个方法是模拟用户取消保护的操作,然后在不保存当前表单字段条目的情况下重新进行保护。

要禁止显示警告(这不会影响真正的错误消息):

Application.DisplayAlerts = wdAlertsNone 

要取消保护然后重新保护文档而不保存用户输入:

Sub UnprotectReprotectToResetFields()
    Dim doc As Word.Document

    Set doc = ActiveDocument

    If doc.ProtectionType <> wdNoProtection Then
        doc.Unprotect
    End If
    doc.Protect wdAllowOnlyFormFields, False

End Sub