MS Access 2010 VBA: таинственная ошибка компиляции на пользовательском сабвуфере LostFocus

В форме проверки данных у меня есть подпрограмма, проверяющая ранее введенные данные для события LostFocus, гарантируя, что время выпуска (TimeReleased в таблице; Me.txtTimeReleased в форме) после времени захвата (ObservationTime в таблице; Me.txtObservationTime on форма). Я использую LostFocus, а не BeforeUpdate, потому что данные были массово импортированы в БД и теперь проверяются на ошибки.

Мои пользователи продолжают получать сообщение об ошибке компиляции (Ошибка компиляции: метод или элемент данных не найдены) после добавления из поля поля, к которому присоединен этот подпрограмма, но я не могу воспроизвести проблему локально. Ошибка возникает в этой строке:

If (Me.txtTimeReleased) <= (Me.ObservationTime) Then

и выделенная часть называется ".txtTimeReleased"

Полный блок кода:

Private Sub txtTimeReleased_LostFocus()

Dim badData As Variant
Dim resp As Variant

'Also check that time released is after time captured
If Not IsNull(Me.txtObservationTime) And Not IsNull(Me.txtTimeReleased) Then
     If (Me.txtTimeReleased) <= (Me.ObservationTime) Then

         resp = MsgBox("Release time must be after capture time." & vbCrLf & "Please double check this field's value: is it correct?", _
                 vbYesNo + vbExclamation + vbDefaultButton2, "Release Time Before Capture Time")

         If resp <> vbYes Then badData = True

     End If
End If

If badData = True Then
     Me.cmbTaxonId.SetFocus 'set focus away so can set focus back
     With Me.txtTimeReleased
         .SetFocus
         .SelStart = 0
         .SelLength = 10
     End With
End If

End Sub

Другие вещи, чтобы отметить:

  • Поле таблицы и элемент управления формы отформатированы как "Короткое время" (24-часовое время)
  • В этом элементе управления формы есть маска ввода на 24 часа; Я использую маски ввода очень редко и, следовательно, не знаком с ними - может быть, проблема связана с маской ввода?
  • На большинстве других элементов управления есть аналогичные сабвуферы LostFocus, которые не вызывают эту (или любую другую) ошибку

Вещи, которые я пробовал:

  • Проверка орфографии
  • Полная декомпиляция и перекомпиляция кода: начиная со сдвига, сжатие и восстановление со сдвигом, открытие с / декомпиляцией флага при удержании сдвига, сжатие и восстановление со сдвигом, повторное открытие со сдвигом и, наконец, компиляция (без ошибок)
  • Замена формы в их базе данных на одну, которая отлично работает для меня на тех же данных
  • Google

Вещи, которые кажутся мне странными:

  • Я не могу воспроизвести ошибку локально.
  • Ошибка запускается на втором экземпляре Me.txtTimeReleased, а не на первом: он уже прошел проверку Not IsNull(Me.txtTimeReleased).
  • Тот факт, что это ошибка компиляции: это может маскировать что-то еще?

Спасибо за ваше время, и, пожалуйста, дайте мне знать, если есть какая-либо дополнительная информация, которая будет полезна. Любые мысли приветствуются!

3 ответа

Решение

Открытие.mdb с помощью /decompile Флаг - это одна из первых вещей, которые я бы предложил, но вы сказали, что уже пробовали это.

Вот еще один недокументированный трюк для решения "скрытых" проблем компиляции, которые скрываются VBA за кулисами:

Во-первых, сделайте резервную копию вашего.mdb просто для безопасности (это, в конце концов, недокументированный метод).

Затем сохраните вашу форму в текстовый файл, используя SaveAsText:

SaveAsText acForm, "MyFormName", "C:\MyFormName.txt"

Наконец, перезагрузите вашу форму, используя такой же недокументированный LoadFromText:

LoadFromText acForm, "MyFormName", "C:\MyFormName.txt"

Компиляция.
Компактный.
Ремонт.
Надеюсь на лучшее.

Удачи.

Вы проверили на пустые значения txtObservationTime и txtTimeReleased, но сравнили затем txtTimeReleased и ObservationTime. Может быть, решение таково:

If Not IsNull(Me.txtObservationTime) And Not IsNull(Me.txtTimeReleased) Then
     If (Me.txtTimeReleased) <= (Me.txtObservationTime) Then

Я предлагаю вам использовать переменные:

intThat = Me.txtTimeReleased 
If intThis <= intThat Then

Попробуйте использовать ! вместо точки:

intThat = Me!txtTimeReleased 
If intThis <= intThat Then

А теперь ответ, который работал для меня на прошлой неделе:

  1. Закомментируйте оскорбительную строку.
  2. Запустите успешную компиляцию.
  3. Восстановите оскорбительную строку.

Компиляция может работать сейчас. Не спрашивай меня почему.

Другие вопросы по тегам