電子書籍の厳選無料作品が豊富!

お世話になります。

Accessを使い始めて半月ぐらいの初心者です
次のような条件の検索フォームの作成を依頼されたのですがうまく出来ません。

(1)Accessのフォームフィルタを使用した検索フォームで、3つのテキストボックス(以下TB)を同一
フォーム上に用意し、抽出を実行するボタンと解除するボタンをTBの隣にそれぞれ用意する

(2)あいまいな条件(部分一致)で検索出来るようにする

(3)抽出結果も同一フォーム上に表示

(4)任意のTBに入力した値で抽出後、他のTBを利用し
絞り込み検索を実行できるようにしたい


現在は下記のように作成しました。


●テーブル
[管理番号]、[品名品番]、[仕入先名]のフィールドを持つテーブルを用意。

●フォーム(表形式)
上記テーブルに連結した検索フォームを作成し、抽出する値を入力する
TBの名前はそれぞれ下のように付けました。

フィールド名    TB名
・[管理番号]⇒管理番号検索
・[品名品番]⇒品名品番検索
・[仕入先名]⇒仕入先名検索


・[抽出実行ボタン]のイベント(管理番号で検索時)

Private Sub コマンド47_Click()

Me.Filter = "管理番号 Like '*" & Me!管理番号検索 & "*'"

Me.FilterOn = True

End Sub



・[抽出解除ボタン]のイベント(管理番号で検索時)

Private Sub コマンド49_Click()

Me!管理番号検索 = Null

Me.FilterOn = False

End Sub


他2つも同様に作成して実行した結果、単体での抽出はうまくいくのですが
さらに絞り込もうと他のTBに値を入力して抽出を実行すると先の抽出が解除され
単体でのフィルタがかかって抽出されてしまいます。

どなた様か良い案が御座いましたらご指導ください。
初心者のため、説明不足な点があるかと思いますが
不明な点がございましたらご質問くださいませ。

宜しくお願い致します。

A 回答 (2件)

とりあえずやるなら、



Me.Filter = "管理番号 Like '*" & Me!管理番号検索 & "*'"

Me.Filter = "((管理番号 Like '*" & Me!管理番号検索 & "*') " & _
      "And (品名品番 Like '*" & Me!品名品番検索 & "*') " & _
      "And (品名品番 Like '*" & Me!品名品番検索 & "*'))"


だが、検索項目が3つあるみたいなので3つも同じような処理を記述するのは効率が悪い
そこで下記みたいなフィルタ文字列を返すプロシージャを作成してみる
※検索項目に何も入力されていなければ検索条件にはならない
(下記をコピって、フォーム内貼り付け)

Private Function GetFilterString() as String
  Dim strWhere As String
  strWhere = ""

  If Not IsNull(Me.管理番号検索.Value) Then
    If Len(strWhere) <> 0 Then strWhere = strWhere & " And "
    strWhere = strWhere & "(管理番号 Like '*" & Me.管理番号検索.Value & "*')"
  End If

  If Not IsNull(Me.品名品番検索.Value) Then
    If Len(strWhere) <> 0 Then strWhere = strWhere & " And "
    strWhere = strWhere & "(品名品番 Like '*" & Me.品名品番検索.Value & "*')"
  End If

  If Not IsNull(Me.仕入先名検索.Value) Then
    If Len(strWhere) <> 0 Then strWhere = strWhere & " And "
    strWhere = strWhere & "(仕入先名 Like '*" & Me.仕入先名検索.Value & "*')"
  End If

  GetFilterString = strWhere

End Function


そして、抽出実行ボタンのイベントを下記のように書き換える

・[抽出実行ボタン]のイベント

Private Sub コマンド47_Click()

'//Me.Filter = "管理番号 Like '*" & Me!管理番号検索 & "*'"
Me.Filter = GetFilterString

Me.FilterOn = True

End Sub


抽出実行ボタンのイベントはそのままでもいいかと
    • good
    • 0
この回答へのお礼

ご連絡ありがとうございます。
おかげ様で目的の動作を完成させる事が出来ました。

ところで上記方法ですと[抽出実行ボタン]と[抽出解除ボタン]はそれぞれテキストボックスごとに用意しないで、代表のものを1つずつ用意すれば宜しいのでしょうか?

視覚的に書くと、現在はフォーム上で下記のように配置しています。

[管理番号検索TB] [抽出ボタン] [解除ボタン]

[品名品番検索TB] [抽出ボタン] [解除ボタン]

[仕入先名検索TB] [抽出ボタン] [解除ボタン]

お礼日時:2005/01/27 10:28

>ところで上記方法ですと[抽出実行ボタン]と[抽出解除ボタン]はそれぞれテキストボックスごとに用意しないで、代表のものを1つずつ用意すれば宜しいのでしょうか?



そうですねイメージ的にはこんな感じ
(視覚的イメージお借りしますね)

[検索条件ラベル]
[管理番号検索TB]
[品名品番検索TB]
[仕入先名検索TB]
[抽出ボタン][解除ボタン]


>視覚的に書くと、現在はフォーム上で下記のように配置しています。
>[管理番号検索TB] [抽出ボタン] [解除ボタン]
>[品名品番検索TB] [抽出ボタン] [解除ボタン]
>[仕入先名検索TB] [抽出ボタン] [解除ボタン]

たとえば、上記の場合で
「3項目ともフィルタかけてあって、どれか1項目フィルタ解除したい」
となった場合、動作的には
「残った2項目で再度フィルタをかけなおす」
という動作になります

となると[解除ボタン]の役割が内部ではフィルタ実行になります
何かおかしいですね

ですから、上記のほうが一般的だと思われます
(アプリケーションの仕様にもよりますが)
    • good
    • 0
この回答へのお礼

ありがとうございます。

望んでいた機能が無事に走るようになり、大変満足しております。

また、コピー&ペーストで対応出来るようにこちらの環境に合わせてソースを書いていただけた事、
処理の効率まで考慮して作成して頂けた事に大変感激致しました。

お忙しいなかご対応ありがとうございました。

お礼日時:2005/01/27 14:18

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