dポイントプレゼントキャンペーン実施中!

アクセス2003での作り込みの段階で悩んでします。ほぼ初心者です。

当方、検索条件をプルダウンで選び、検索キーワードを入力し、データを抽出するプログラムを作りました。またこの検索条件&キーワードは2つあり、絞込検索ができるようになっています。

その際のVBAは、以下の通りです。

Me.Filter=""&Me![検索条件1(コンボ1)]&"like'"&"*"&Me![検索キーワード1(テキスト1)]&"*"&"'and"&Me![検索条件2(コンボ2)]~

質問
(1)検索条件1や検索キーワード1が空欄であった場合、エラーのポップアップが出るようにするには?
→今のところ、検索条件2と検索キーワード2が空欄でも抽出はできるのです。
ただし、検索条件2と検索キーワード2のみに入力すると、エラー「演算子がありません」が出る。

(2)本当なら、どちらかでも空欄になってもエラーが出ないようにしたい。
それに対し、bin-chanさんが回答してくださったVBA(2013/10/26 22:09)ですと、まず
 列って何を指すのか?
 列をテキストにしてみるとエラーが出てしまう。
のです。

(3)本当なら、検索条件なんか選ばず、検索キーワードを2つくらい入力して抽出したい。すなわち、検索するフィールドをテーブルの全フィールを対象とする場合、これまたbin-chanさんが回答してくださった(同上の日時)ユニオンクエリを使ったら、エラー「ユニオンクエリが定義できません」と・・・。どうすればよいでしょうか?
決してbin-chanさんをやり玉にするのではなく、私のやり方が何か間違っていると思いますし、一旦質問内容を整理したく、新たに質問しました。

(4)これはアクセスとは関係ない質問です。goo教えてで行った質問が、やってもいないのに、Okwaveなるものに同じ質問がありました。これはどうしてなんでしょうか?


以上、よろしくお願いいたします。

A 回答 (3件)

No2の一部を載せると、



  '(1)
  If Not IsNull(Me!コンボ2) And Not IsNull(Me!テキスト2) Then
    Me.Filter = "" & Me![コンボ1] & " Like '" & "*" & Me![テキスト1] & "*" & "' AND " & Me![コンボ2] & " Like'" & "*" & Me![テキスト2] & "*" & "'"
    Me.FilterOn = True
    Exit Sub
  End If

  '(2)この場合、コンボ1とテキスト2の組合せをしても問題ないならば
  '問題があれば MsgBox "検索不能" としてExit Sub の前にこれを入れ、あとは削除
  If IsNull(Me!コンボ2) And Not IsNull(Me!テキスト2) Then
    'コンボ1とテキスト1、およびコンボ1とテキスト2の組合せでANDで結ぶ場合
    Me.Filter = "" & Me![コンボ1] & " Like '" & "*" & Me![テキスト1] & "*" & "' AND " & Me![コンボ1] & " Like'" & "*" & Me![テキスト2] & "*" & "'"
    'またはORで結んでテキスト1とテキスト2のどちらかを含む場合。普通はこちらかも。
    'Me.Filter = "" & Me![コンボ1] & " Like '" & "*" & Me![テキスト1] & "*" & "' OR " & Me![コンボ1] & " Like'" & "*" & Me![テキスト2] & "*" & "'"
    Me.FilterOn = True
    Exit Sub
  End If

  '以下省略
  '(3) ここは(2)と同様に複雑。検索、フィルタをしても問題ない組合せを考える
  If Not IsNull(Me!コンボ2) And IsNull(Me!テキスト2) Then
    Me.Filter = "条件を設定"
    Me.FilterOn = True
    Exit Sub
  End If
  '(4) この場合はコンボ1とテキスト1の組合せのみの条件設定。中身は省略
  If IsNull(Me!コンボ2) And IsNull(Me!テキスト2) Then
    Me.Filter = "条件を設定"
    Me.FilterOn = True
    Exit Sub
  End If
    • good
    • 0
この回答へのお礼

回答、ありがとうございます。
この回答で、他に回答が出ないと判断し、ベストアンサーとして選ばせていただきました。

bin-chanさん、piroin654さんらの回答は、家ではなかなか見れませんが、会社のPCでは見ています。

また、ただ単にマネするだけではなく、教えてくださったものからさらに応用ができるように、そのVBA(SQL)文を解読しています。

よって、自分のものにするにはちょっと時間がかかります。しかし、必ずや実現させていきます。

何通りにも設定しないといけないのは、費用対効果の面から、あまり得策ではないですね。

おつきあい、本当にありがとうございました。

お礼日時:2013/11/12 23:59

お礼欄にあります、


>(3)の検索条件を選ばすの件
>そうですか。時間と暇ですか。
>本当は、これを実現したいのです。しかし、
>すぐに運用をと要求されているので、一旦差し置きます。
については、No1で申し上げたようなことですが、
何故?といわれれば、簡単に言いますと、四つのコントロールが
Nullであるか、そうではないかの組合せは、
   2の4乗通り
すなわち、16通りの組合せがあるからです。さらに、
これらの個々の条件を積(AND)にするのか、和(OR)に
するのかによってさらに条件が複雑になり、組合せも膨大に
なるのです。
これと同等のことを二つのテキストボックスでのフィルタで
実現しようと思えば、少なからず考え込むのでは、と思います。
コンピュータはプログラム通りにしか動かないのです。



コンボ1とテキスト1をNull禁止にすれば、
組合せは、積(AND)ならば、(XはNullです)

         1 2 3 4
コンボ1    ○ ○ ○ ○
テキスト1   ○ ○ ○ ○
コンボ2    ○ X ○ X
テキスト2   ○ ○ X X

の四つの組合せのみです。これらの組合せを
フィルタのためのWHERE句をかけばいいのです。
すなわち、わかりやすくしようと思えば、
Xのところは条件からはずせばいいのです。
組合せ別に、たとえば、条件はコンボとテキストの
関係が分からないので書いていませんが、以下のように。

Private Sub コマンド0_Click()
Me.FilterOn = False
  '検索に進む前に最初に入力状況をチェック
  If IsNull(Me!コンボ1) Then
    MsgBox "検索条件1の選択をしてください"
    '処理を中断します。
    Exit Sub
  End If

  If IsNull(Me!テキスト1) Then
    MsgBox "検索キーワード1を入力してください"
    '処理を中断します。
    Exit Sub
    End If

  '検索とフィルタ
  '(1)
  If Not IsNull(Me!コンボ2) And Not IsNull(Me!テキスト2) Then
    Me.Filter = "条件を設定"
    Me.FilterOn = True
    Exit Sub
  End If
  '(2)
  If IsNull(Me!コンボ2) And Not IsNull(Me!テキスト2) Then
    Me.Filter = "条件を設定"
    Me.FilterOn = True
    Exit Sub
  End If
  '(3)
  If Not IsNull(Me!コンボ2) And IsNull(Me!テキスト2) Then
    Me.Filter = "条件を設定"
    Me.FilterOn = True
    Exit Sub
  End If
  '(4)
  If IsNull(Me!コンボ2) And Not IsNull(Me!テキスト2) Then
    Me.Filter = "条件を設定"
    Me.FilterOn = True
    Exit Sub
  End If
End Sub


のようにします。条件によっては中の条件をいくつか
くっつけることで短くはできますが、内容がわからないので
このようにしておきます。
    • good
    • 0

(1)


コンボ1とテキスト1への入力は必須とするのですか。
もし、そうならば、たとえばボタンクリックのイベントで
検索しフィルタをかけるならば、

Private Sub ボタン0_Click()
  If IsNull(Me!コンボ1) Then
    MsgBox "検索条件1を選択してください"
    Exit Sub
  End If
  If IsNull(Me!テキスト1) Then
    MsgBox "検索キーワード1に入力してください"
    Exit Sub
  End If

  以降、変数の宣言や検索、フィルタなどの記述
    ・
    ・
    ・
のように、最初に記述しておき、入力待つようにします。

(2)
>本当なら、どちらかでも空欄になってもエラーが出ないようにしたい。
二つのコンボボックスと二つのテキストボックスの
どのような組合せでフィルタをかけたいのか、そこを
明確にしないと、後出しで「実はこうなのです」と
言っていると、肝心な回答がつかなくなります。

「列」とはフィールドを指すのでは。フィールドとは
テーブルのフィールド、あるいは帳票タイプのフォーム
ならばデザインビューにしたときに表示されるレコードを
表示するテキストボックスなど、では。

>列をテキストにしてみるとエラーが出てしまうのです。
この場合のテキストとはどれを指すのか分からないので
何とも言えません。



(3)
>本当なら、検索条件なんか選ばず、検索キーワード
>を2つくらい入力して抽出したい。
これは、コード量がどのくらいになるのかわかりませんが、
出来ないことはないにしても、時間と暇があれば、
のことになります。これもどのようなデータをどのように
抽出をしたいのか細部にわたり情報が必要になります。
これは、質問の趣旨から離れているのでここでは言及
しません。


(4)
goo以外にもありますが、以下に
http://faq.okwave.jp/EokpControl?&site=guidePC&t …
あるように、OKWaveが主催で、gooなどの提携先からログインして行なわれた
Q&AはOKWaveのサーバーで管理され、それぞれの提携先にサーバーのデータが
再配分されるようになっています。


以上ですが、(2)の前半についてが主要なことなので、
そのあたりはどうですか。
    • good
    • 0
この回答へのお礼

回答、ありがとうございます。

(1)の「検索条件1」「検索キーワード1」を空欄にしたらの件
そうでしたか。最初にIF文を入れるのですね。Me.filterの後に入れてました。

(4)のOKWAVEに載ってしまう件
なんだか勝手に載っているようで、気味が悪かった。
これをやめてくれ、gooだけにしてくれとか訴えることはできないのでしょうか?
あっちゃこっちゃで面倒。

(3)の検索条件を選ばすの件
そうですか。時間と暇ですか。
本当は、これを実現したいのです。しかし、すぐに運用をと要求されているので、一旦差し置きます。

(2)のどちらかを空欄にしてもの件
人間はファジイなので、これの処理を行えれば良いのかなと思っています。
これについては、先のbin-chanさんからいただいたのを試行錯誤しながら行っています。
ご回答してくださった内容と合わせ、もう少し研究させてください。そのうえで改めてご質問します。


次の段階として、抽出したデータでグラフとか集計を要求されてきています。

よろしくお願いいたします。

お礼日時:2013/11/10 00:41

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