2017-02-16 1 views
0

私は昨日、SEのキャストを行い、WebはAccessデータベースのクエリ/レポート構造の一部として複数のレコードの特定のフィールドを連結する方法を模索していました。私はを見つけたので、私はAllen BrowneのConcatRelated()関数 hereにつながりました。関数と同じモジュールに名前を付けて間違った足で降りた後、私はそれを望みどおりに動かすことができました。このエラーは、関数を終了する代わりにループを引き起こすのはなぜですか?

しかし、最初にクエリで使用しようとすると、私は間違いを犯して、'WHERE Employee = ' & [Employee] & "'"の代わりに"WHERE Employee = " & [Employee]と等しいパラメータを入力して文字列として評価しました。これにより、予想される3464(データ型の不一致)ランタイムエラーが発生しましたが、Allenの修正により、エラーの原因となった実際の文字列が示されました。驚きはありません、私はちょうどOKをクリックし、SQLを修正するつもりです。私はそれがうまくいかなかったことに驚いた。私がmsgboxをクリックするとすぐに、それは再び来るでしょう。 Ctrl+Breakを使用してコードを停止しましたが、Endをクリックすると、実際に関数を終了するのではなく、同じエラーに戻ります。ループを止める唯一の方法は、Debugをクリックして私のコードを期待どおりに落とすことでしたが、元のクエリを変更するコードから抜け出せませんでした。ヒット・リセットにより、エラーが再びポップしてループの中に戻ってきました。

最終的にエラーハンドラからすべてをコメントし、Exit Functionに伝えることで、それから抜け出しました。ほとんどの場合、問題を隠しているだけなので、カウンタを追加してエラーハンドラが呼び出され、イミディエイトウィンドウの値がチェックされるたびにインクリメントしていたことが分かりました。確かに、私はクエリのどこかをクリックするたびに10以上になるだろう。

私が理解していないことは、エラーの原因となるものです。 Err_Handlerは、Resumeを試すように指示するものは何もないので、最初のエラーで関数からダンプする必要があります。具体的には、Exit_Handlerに指示して、いくつかの変数をリセットしてからExit Functionにします。直接Exit FunctionErr_Handlerに入れても、私のエラーカウンタには複数の増分が発生します。 Debugをさらに実験すると、Set rs = DBEngine(0)(0).OpenRecordset(strSql, dbOpenDynaset)という行が強調表示されます。関数の後に最初の行であるので、それが助けになることはわかりません。strSqlの値を構成します。それをコメントアウトすると、次の行が強調表示されました。

私は初期のエラー(私の間違い)の原因を知っています。それは簡単な修正です。私は間違いの意図しない結果とそれが作成したループにもっと興味があります。

TL; DR

  1. は、代わりに出たり破壊のループにこのエラーが発生しますか?
  2. エラー処理が即時終了を呼び出すが、最初にmsgboxのようなものを追加すると、無限にループするように見えたり、少なくともクリックするのが疲れるまで、有限回数発生するように見えるのはなぜですか?
  3. コード内でこれを回避する方法はありますか?実際には、最初のエラーの後で停止しますか?

最初は600+レコードのテーブルを使用していましたが、さらにわずか10レコードの小さなテーブルで実験しました。 小さなテーブルクエリSELECT TestEmpHistory.Employee, ConcatRelated("EmpGroup", "TestEmpHistory", "Employee = " & Employee) AS CompliedNames FROM TestEmpHistoryを実行すると、エラーが再現されます。 テーブルTestEmpHistoryの形式は次のとおりです。
ID(AutoNum)| Employee | EmpGroup |クエリで参照されていない他のフィールド


ID |従業員| EmpGroup |

1 | Employee1 | G & A
2 | Employee1 |営業
3 |従業員2 | CSR
4 | Employee2 | G & A
5 | Employee3 | CSR
6 | Employee3 |プログラミング
7 | Employee3 | G & A
8 | Employee4 | CSR
9 | Employee4 | CSR
10 | Employee4 |私は、全体の記事を読むことなくアクセス2016

+3

私は誰もあなたの質問をすべて読むつもりはないと思いますが、要約したり、コードを追加したりできますか? – Moreno

答えて

1

を使用してい

のプログラミング、私はそれがクエリによって返されるすべての行に対してこのコードを実行しているので、あなたがループにいる理由は推測しています。この問題を解決する唯一の方法は、コードに侵入したときに一時的にすべてコメントアウトして、すべての行についてエラーを生成せずにクエリを完了できるようにすることです。これが完了したら、機能コードのコメントを外して再試行する前に、クエリのデザインを修正して修正することができます。

+0

クリックする前にこれを数回読んでいましたが、意味があります。私がクエリで関数を使用したのはこれが初めてです。関数はループ内でスタックされていませんが、本質的にスタックされている関数を呼び出すクエリです。問題は、私が探していた場所の上流でした。私のトラブルシューティングで私を捨てたのは、ErrorCountがクエリに600以上の行がある場合、通常は33〜35回のエラーしか返さないということでした。これは、画面上に表示される線の数が多いためです。行の高さを狭め、ErrorCountを増やして一致させました。 –

+0

私はupvoteの担当者がこの時点でカウントする必要はありませんが、Upvotedと答えとしてマークされています。 –

関連する問題