MS Access 2010 VBA:自定义LostFocus子上的神秘编译错误

时间:2013-12-20 17:33:33

标签: ms-access access-vba ms-access-2010

在数据验证表单中,我有一个子程序通过确保释放时间(表中的TimeReleased;表格中的Me.txtTimeReleased)在捕获时间之后(表中的ObservationTime; Me)检查先前输入的LostFocus事件数据表格上的.txtObservationTime)。我正在使用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潜艇,不会产生此(或任何其他)错误

我尝试过的事情:

  • 检查拼写
  • 完全反编译并重新编译代码:从shift开始,紧凑并使用shift修复,在保持shift时打开/反编译标志,使用shift进行紧凑和修复,使用shift重新打开,最后编译(无错误)
  • 将数据库中的表单替换为可在同一数据上运行正常的表单
  • 谷歌

对我来说很奇怪的事情:

  • 我无法在本地重现错误。
  • 错误是在第二个实例上触发 Me.txtTimeReleased而不是第一个:它已经传递了Not IsNull(Me.txtTimeReleased)检查。
  • 这是一个编译错误的事实:是否可能掩盖其他内容?

感谢您的时间,如果有任何有用的其他信息,请告诉我。任何想法都是最受欢迎的!

3 个答案:

答案 0 :(得分:2)

您检查了Null txtObservationTime和txtTimeReleased,但比较了txtTimeReleased和ObservationTime。也许解决方案是:

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

答案 1 :(得分:1)

我建议你使用变量:

intThat = Me.txtTimeReleased 
If intThis <= intThat Then

尝试使用!代替点:

intThat = Me!txtTimeReleased 
If intThis <= intThat Then

现在,上周对我有用的答案是:

  1. 评论违规行。
  2. 运行成功的编译。
  3. 恢复违规行。
  4. 编译现在可以正常工作。不要问我为什么。

答案 2 :(得分:1)

打开带有/decompile标志的.mdb是我建议的第一件事,但你说你已经尝试过了。

这是另一个未记录的技巧,用于处理VBA在幕后烘焙的“隐藏”编译问题:

首先,制作.mdb的备份副本只是为了安全(毕竟,这是一种未记录的技术)。

然后,使用SaveAsText:

将表单保存到文本文件中
SaveAsText acForm, "MyFormName", "C:\MyFormName.txt"

最后,使用同样未记录的LoadFromText:

重新加载表单
LoadFromText acForm, "MyFormName", "C:\MyFormName.txt"

编译。
紧凑。
修复。
希望最好的。

祝你好运。