重置损坏的 Word 文档的表单域
Reset formfields corrupts Word document
我有一个大型动态 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 has encountered a problem. You will not be able to undo this action...")
3) 抛出错误-“361:无法加载或卸载此对象”
我要么想要 2) 工作,要么找到任何更快的方法来清除表单域。
谢谢你的时间。
参考(2):与其说这是一条错误信息,不如说是一条警告,并且没有文件损坏。当文档不受保护时,Word 总是会丢失撤消列表,这就是使用此方法在幕后发生的情况。
我想到了两种方法。一种是禁用警报,这应该会抑制警告。另一种是模拟取消保护的用户操作,然后 re-protecting 不保存当前表单字段条目。
要抑制警告(这不会影响真正的错误消息):
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
我有一个大型动态 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 has encountered a problem. You will not be able to undo this action...") 3) 抛出错误-“361:无法加载或卸载此对象”
我要么想要 2) 工作,要么找到任何更快的方法来清除表单域。 谢谢你的时间。
参考(2):与其说这是一条错误信息,不如说是一条警告,并且没有文件损坏。当文档不受保护时,Word 总是会丢失撤消列表,这就是使用此方法在幕后发生的情况。
我想到了两种方法。一种是禁用警报,这应该会抑制警告。另一种是模拟取消保护的用户操作,然后 re-protecting 不保存当前表单字段条目。
要抑制警告(这不会影响真正的错误消息):
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