Сброс форм-полей портит документ Word - PullRequest
2 голосов
/ 14 июня 2019

У меня есть большой динамический макрос 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 Ответ

1 голос
/ 20 июня 2019

Ссылаясь на (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
...