2012-04-02 79 views
3

我在Access中有一个奇怪的情况。通常,Null错误的无效使用是一件非常简单的事情 - 为一个字符串变量或其他类型赋值null。但是我在一个看起来不应该发生的地方出现错误。以下是代码片段:MsAccess中的DoEvents语句中的“空使用空值”错误

bch = Form_Akces.txtMaxCisla.BackColor 
If Err <> 0 Then Stop 
Form_Akces.txtMaxCisla.BackColor = vbYellow 
If Err <> 0 Then Stop 
DoEvents 
If Err <> 0 Then Stop ' This is where I get the error 
With qdf_GPsp 

什么是怎么发生的事情是,我得到这个错误只是有时,通常只在我第一次在一段时间运行代码。如果我关闭数据库并立即重新打开它,通常我不会得到错误。这让我疯狂了很长一段时间,所以我把所有这些“如果错误<> 0然后停止”语句,试图追踪它发生的地方。这是一个实时系统,用户知道只需重新启动应用程序,但这是一个庞大的PIA,并且引导很尴尬。

任何人都可以想到一些事情来尝试或检查?我不完全是Access中的业余爱好者,但这远远超出我曾经遇到过的任何事情。为什么DoEvents语句应该会产生这样的错误超出了我的想象,特别是因为即使在前面的语句中,我也没有做任何事情,应该会产生这样的错误,直到处理器有机会抛出错误。如果我拿出DoEvents,我只会在相同的线下得到相同的错误。 txtMaxCisla是Form_Akces表单上的一个未绑定的文本字段,包含此代码的例程将从其中调用。只有在启动时 - 一旦一切都被加载并运行,这再也不会发生。它只发生一次 - 没有模式,我已经能够检测到。

通过大量的编译,反编译,重新编译,压缩和修复循环,它已经持续了几个月,没有明显的变化,除了有时会发生在其他地方,再次没有理由我可以看到。

  • 更新*

没有运气 - 它仍然崩溃,并绝对没有理由,我可以看到。下面的代码现在:

Public Sub ReloadMaxNumbers(tmc As TextBox) 
Dim rst As DAO.Recordset, x$, xb$, xe$, bch& 
On Error GoTo 0 
If Err <> 0 Then Stop 
DoEvents 
If Err <> 0 Then Stop 
... 

代码停在第二次测试中,后的DoEvents,用同样的错误,“无效的使用Null”。我意识到这个代码是完全延迟的,但它是追溯的结果,试图找到错误的根源。没有这个,它就会在某个地方进一步崩溃,同样的错误。在这一点上,我想不出别的什么来尝试。

+0

我有同样的问题,如果我找到解决方案,我会给你反馈。 – celerno 2013-08-10 01:38:19

回答

1

我对你的代码中的Form_Akces感到困惑。如果我创建一个名为Akces的表单,则表单的代码模块名为Form_Akces。但是您在表格Form_Akces上表示“”。所以我很困惑Form_Akces是窗体的名称还是窗体的代码模块。也许访问也困惑。

无论哪种方式,因为你说的代码是窗体的代码模块中,我建议你代替MeForm_Akces

编辑:我误解你的情况。您向我们展示的代码实际上来自另一个代码模块中的过程,而不是表单的代码模块。在这种情况下,我会做这样的事情的外部过程DoSomething

Public Sub DoSomething(ByRef frm As Form) 
    bch = frm.txtMaxCisla.BackColor 
    frm.txtMaxCisla.BackColor = vbYellow 
    DoEvents 
    ' whatever else you need 
End Sub 

然后窗体的代码模块中,您拨打的DoSomething:

DoSomething Me 

如果DoSomething只能对每一个单一的控制时间,你可以只传递一个对该控件的引用。

Public Sub DoSomething(ByRef ctl As Control) 

这种做法将使DoSomething重新用于其他形式的无需任何改变,因为目标表单名称不是“硬连线”进入程序。此外,如果您重命名您的Akces表单,它不会中断。在第二种变体中,它也会适应对控件名称的更改。

+0

谢谢,汉斯,我想我没有说清楚。此代码位于从Form_Akces代码模块调用的独立模块中。 Form_Akces.txtMaxCisla.BackColor引用名为Akces的表单上的文本字段。我不认为Access对此感到困惑,因为它提供了各种下拉列表中的适当元素。我不能使用ME,但我肯定可以将语法更改为Forms(“Akces”)。txtMaxCisla.BackColor - 你认为这有帮助吗?事实上,我只是改变了它,但由于错误偶尔发生,我可能需要一段时间才能确定是否有帮助。 – 2012-04-02 14:51:36

+0

>重要的是要记住这两个表达式不是同义词: > Forms(“Akces”)。txtMaxCisla.BackColor > Form_Akces.txtMaxCisla.BackColor – 2012-04-02 15:36:38

+0

我删除了这个。 – HansUp 2012-04-02 15:43:21