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, которые не вызывают эту (или любую другую) ошибку
Вещи, которые я пробовал:
- Проверка орфографии
- Полная декомпиляция и перекомпиляция кода: начиная со сдвига, сжатие и восстановление со сдвигом, открытие с / декомпиляцией флага при удержании сдвига, сжатие и восстановление со сдвигом, повторное открытие со сдвигом и, наконец, компиляция (без ошибок)
- Замена формы в их базе данных на одну, которая отлично работает для меня на тех же данных
Вещи, которые кажутся мне странными:
- Я не могу воспроизвести ошибку локально.
- Ошибка запускается на втором экземпляре 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
А теперь ответ, который работал для меня на прошлой неделе:
- Закомментируйте оскорбительную строку.
- Запустите успешную компиляцию.
- Восстановите оскорбительную строку.
Компиляция может работать сейчас. Не спрашивай меня почему.