2012-04-02 14 views
3

私はAccessで奇妙な状況に陥っています。通常、Invalid use of Nullエラーは非常に簡単なことです - 文字列変数などにnullを代入します。しかし、私はそれが起こってはいけないはずの場所にエラーが表示されます。MsAccessのDoEventsステートメントで "Nullの無効な使用"エラーが発生しました

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 

何が起こっされていますが、私は通常は私はしばらくの間でコードを実行する最初の時間に、唯一時々このエラーが出るということです。ここでは、コードスニペットです。データベースを閉じて直ちに再オープンすると、通常はエラーは発生しません。私はかなり長い間私を運転しています。だから、これらのすべてを "If Err <> 0 Stop then"ステートメントに入れて、どこで発生したかを追跡しようとしています。これはライブシステムであり、ユーザーは単にアプリケーションを再起動することを知っていますが、大規模なPIAであり、起動するのに恥ずかしいものです。

誰かが試してみるか何かを考えることができますか?私はアクセスのアマチュアではありませんが、これは私がこれまで走ったことのないものの外にあります。 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 
... 

コードが同じエラー、「NULLの使用が無効です。」と、DoEventsをした後、第二の試験で停止します。私はこのコードが完全に遅れていることに気がついていますが、それはエラーの根本原因を突き止めるために追跡し直した結果です。これがなければ、この同じエラーでどこかの道がさらに崩壊します。この時点で、私は他に何か試みることは考えられません。

+0

私は同じ問題を抱えていますが、解決策が見つかったらフィードバックをお送りします。 – celerno

答えて

1

あなたのコードでForm_Akcesに戸惑っています。 Akcesという名前のフォームを作成すると、フォームのコードモジュールの名前はForm_Akcesとなります。しかし、あなたはForm0Akcesのフォームに「」と言っています。だから、Form_Akcesがフォームの名前かフォームのコードモジュールかどうか混乱しています。多分アクセスも混乱します。

いずれかの方法では、コードは、フォームのコードモジュールであることを特徴とするので、私はあなたが編集Form_Akces

ためMeに置き換えてお勧め:私はあなたの状況を誤解。あなたが私たちに示したコードは、実際にはフォームのコードモジュールではなく、別のコードモジュールのプロシージャからのものです。その場合、私は外部プロシージャ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フォームの名前を変更しても、それは壊れません。 2番目のバリエーションでは、コントロール名の変更も受け入れます。

+0

ありがとう、ハンス、私はそれをかなり明確にしていないと思います。このコードは、Form_Akcesコードモジュールから呼び出される別のモジュールにあります。 Form_Akces.txtMaxCisla.BackColorは、Akcesというフォーム上のテキストフィールドを参照します。私はAccessがさまざまなドロップダウンリストに適切な要素を提供しているので、これについて混乱しているとは思わない。私は私を使用することはできませんが、私は確かにフォーム( "Akces")に構文を変更することができます。txtMaxCisla.BackColor - それは助けると思いますか?実際には、私はそれを変更しましたが、エラーが散発的に発生するので、それが助けられたかどうか確信できるようになるまでには時間がかかるでしょう。 –

+0

>これらの2つの表現は同義語ではないことに注意してください。 >フォーム( "Akces")。txtMaxCisla.BackColor > Form_Akces.txtMaxCisla.BackColor –

+0

これを削除しました。 – HansUp

関連する問題