Код проверки орфографии в поле формы MS Access - выдает ошибку при принятии изменения

Я добавил следующий код в событие AfterUpdate текстового поля в форме MS Access:

Private Sub txtComments_AfterUpdate()
With Me!txtComments
    .SetFocus
    If Len(.Value) > 0 Then
        DoCmd.SetWarnings False
        .SelStart = 1
        .SelLength = Len(.Value)
        DoCmd.RunCommand acCmdSpelling
        .SelLength = 0
        DoCmd.SetWarnings True
    End If
End With
End Sub

Это запускает проверку орфографии, когда пользователь выходит из поля. Частично работает. Он открывает диалог проверки орфографии и находит первую ошибку. Проблема в том, что когда вы нажимаете «Игнорировать», «Изменить» и т. д., чтобы обработать/исправить орфографическую ошибку, происходит сбой кода и появляется следующее окно с ошибкой:

«Макрос или функция, установленная для свойства BeforeUpdate или ValidationRule для этого поля, не позволяет Microsoft Office Access сохранять данные в поле».

Я попытался добавить код сохранения записи перед кодом проверки орфографии:

DoCmd.DoMenuItem acFormBar, acRecordsMenu, acSaveRecord, , acMenuVer70 DoCmd.DoMenuItem acFormBar, acRecordsMenu, 5, , acMenuVer70

но это не решило.


person Michael T    schedule 02.08.2012    source источник
comment
Видели ли вы answers.microsoft.com/en-us/office/forum/office_2007-access/ ?   -  person Fionnuala    schedule 02.08.2012


Ответы (2)


Этот код работает как событие On Exit (вместо After Update).

Private Sub txtComments_Exit(Cancel As Integer)
With Me!txtComments
    .SetFocus
    If Len(.value) > 0 Then
        .SelStart = 1
        .SelLength = Len(.value)
        DoCmd.RunCommand acCmdSpelling
        .SelLength = 0
    End If
End With
End Sub
person HansUp    schedule 02.08.2012
comment
Событие On Exit будет запускаться каждый раз, когда кто-то просматривает элемент управления, и пользователю будет предложено всплывающее окно проверки правописания. - person Fionnuala; 03.08.2012
comment
Верно, но они запрашиваются только в том случае, если есть орфографические ошибки, которые нужно исправить. - person Michael T; 06.08.2012
comment
Добавьте DoCmd.SetWarnings = False, чтобы скрыть окно сообщения, если в текущем тексте нет орфографических ошибок: csharpdeveloper.wordpress.com/2021/02/25/ - person Rob Kraft; 25.02.2021

Использование события обновления, связанного с элементом управления, не будет работать, поскольку каждое изменение снова вызывает событие. Вам нужна кнопка или что-то вроде:

Private Sub Spell_Click()
    With Me!txtComments
        .SetFocus
        .SelStart = 0
        .SelLength = Len(Me!txtComments)
    End With
    DoCmd.RunCommand acCmdSpelling
End Sub

Можно было бы избежать некоторых проблем с событием On Exit, добавив строку:

    If Me.txtComments.Value <> Me.txtComments.OldValue Then
       With Me!txtComments
           .SetFocus
           .SelStart = 0
          .SelLength = Len(Me!txtComments)
       End With
    <...>    

По крайней мере, это будет работать только тогда, когда вы проходите через элемент управления, пока запись не будет сохранена, а не каждый раз, независимо от того, изменен ли txtComments или нет.

person Fionnuala    schedule 02.08.2012
comment
Хорошо, я говорил слишком рано. Если я нажму «Игнорировать», это сработает, но если я нажму «Изменить», чтобы изменить значение, я снова получу ошибку. Акт изменения данных запускает другое событие проверки орфографии и ошибки. - person Michael T; 03.08.2012
comment
Я протестировал и принял изменения, и это сработало для меня. Вы бежите от кнопки или от событий, принадлежащих элементу управления? - person Fionnuala; 03.08.2012
comment
Он запускается из событий, принадлежащих текстовому полю. Мне нужно, чтобы он запускался автоматически, когда пользователь добавляет текст, а не с отдельной кнопки. Решение HansUp (поместив его в событие OnExit) решило эту проблему. - person Michael T; 03.08.2012
comment
Рему, во втором примере вы забыли включить самую важную строку: DoCmd.RunCommand acCmdSpelling - person Parfait; 10.01.2014