「これはヤバかったな」という遅刻エピソード

まだ6ヶ月程度のAccess初心者です。データ入力上の誤入力を避けたいのですが方法がわからず悩んでいます。初心者で、未だ基本的な理解ができていないためだと思いますが、どなたか解決法をご教授いただければありがたく存じます。
 1つのフォーム上に複数のコンボボックスを用意して、同じ値集合ソース(テーブル)を参照して入力をしようとしています。
 このとき、まず、コンボボックス1に、参照しているテーブルから”DATA1”という値を入力したとき、次のコンボボックス2のプルダウンメニューには、先の”DATA1”を表示しないように、SQLステートメント:クエリビルダの抽出条件を設定しようと考えています。
 このフォームにはコンボボックスを全部で4つ用意して、順次入力の都度、入力済みのデータはプルダウンメニューに表示しないようにし、重複を避けたいというのが目的です。
 
 コンボボックス2の値集合ソースとして設定する際に、SQLステートメント:クエリビルダの抽出条件に記載したものは次のようなものです。

<>[Forms]![フォーム1]![コンボボックス1]  And  <> [Forms]![フォーム1]![コンボボックス3]  And  <>[Forms]![フォーム1]![コンボボックス4]

 ほかのコンボボックス3~4にも、自分以外のコンボボックスと重複させないつもりで、それぞれ抽出条件を入力しました。

 さて、実際にこれで動かしてみると、1回目はうまくいって喜んだのですが、入力値をDeleteして再入力を試みたところ、リストボックスが何も表示されない状態になり、悩んでいます。
 何か設定上で不足している、あるいは論理上で考え違いをしているのだと思いますが、何とか解決したいと切に思っています。何卒よろしくお願いします。

A 回答 (1件)

[フィールド名]<>[Forms]![フォーム1]![コンボボックス1]


は、[コンボボックス1] が空白の場合に
True でも False でもなく Null になります。
Null と ある値の And 演算の結果は Null になります。
(VBE のヘルプで「And 演算子」を調べてください。)
よって、1つでも未入力のコンボボックスがあると
抽出条件に 「Null」 と書いたのと同じことになってしまいます。

これを回避するには、空白の場合に Null にならないように
Nz 関数を使います。

<>[Forms]![フォーム1]![コンボボックス1]

<>Nz([Forms]![フォーム1]![コンボボックス1] ,"")
のようにしてください。

Nz 関数についてもヘルプで調べてください。

なお、入力するたびに、コンボボックスのリストが変化するように、
下記のような、再クエリの処理が必要なのは、言うまでもありません。
念のため。

Private Sub コンボボックス1_Enter()
  Me.ActiveControl.Requery
End Sub
    • good
    • 0
この回答へのお礼

bonaron様
さっそく解決の方法をご教示いただき、大変ありがとうございました。
ご紹介いただいた方法を適用し解決いたしました。レコードを移動しても、途中でdeleteしても問題なく目的としていた形に到達することができました。本当にありがとうございます。
 Nz関数については以前、表の集計を取る際にnullを0(ゼロ)に置き換えてから合計するという内容を学習したことがありましたが、こういう場合も必要だということを改めて理解しました。null値の扱いについては今後も要注意ということで頭に入れておきます。
 再クエリについては、コンボボックスのイベントプロパティ「フォーカス喪失時」に、コンボボックスごとに再クエリマクロを設定してみました(まだ理解が足りないので試行錯誤ですが…)。
 ありがとうございました。またよろしくお願いいたします。

お礼日時:2008/12/25 17:36

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す


おすすめ情報