プロが教えるわが家の防犯対策術!

Access歴は2カ月程度です。

クエリから作成したフォームの中でのOR検索を行いたいのですが

フィールド名・・・工具名,使用番号
検索に使用する非連結txtbox・・・工具名条件,使用条件

となっており、

Private Sub 検索_Click()

If [工具名条件] <> "" Then 検索文字 = 検索文字 & " and 工具名 like '*" & [工具名条件] & "*'"
If [使用条件] <> "" Then 検索文字 = 検索文字 & " and 使用番号 like '*" & [使用条件] & "*'"

If 検索文字 = "" Then
Me.FilterOn = False

Else
Me.Filter = Mid(検索文字, 6, 2000)
Me.FilterOn = True

DoCmd.Requery

End If
End Sub

となっており、工具名と使用番号のAND検索は出来ているのですが、使用番号が1~6あり、
OR検索を使用して2つを検索条件にし、それぞれ該当している結果を表示させたいのですが。。。

工具名はカタカナや漢字のみです。
使用番号は「1,2,3」等と入力してあります。

クエリの抽出条件は無記入です。

どうぞ、よろしくお願いします。

A 回答 (2件)

#1です



> 使用条件として1~6の数字の他に、すべてのパターンで使う条件としてALLがありました。
> 使用条件のデータ型はテキスト型です。

使用条件には 1 ~ 6 の数字と、ALL の文字が混在しているという事でしょうか。
また、使用番号を指定するのに、
使用条件1 / 使用条件2 という感じにテキストボックスを増やして、この所が OR
工具名条件 と 使用条件 は、あくまで AND

で良いでしょうか。

あくまで、以下例ですが、使用条件1 ~ 使用条件4 を画面上に作っていたとします。
で、どこかに ALL の入力があれば抽出条件を設定しない・・・・感じです

Private Sub 検索_Click()
  Dim sWhere As String
  Dim sW As String
  Dim i As Long

  sWhere = ""
  If (Not IsNull(Me.工具名条件)) Then
    sWhere = sWhere & " AND 工具名 Like '*" & Me.工具名条件 & "*'"
  End If

  sW = ""
  For i = 1 To 4 ' 使用条件1 ~ 4 ★
    If (Not IsNull(Me("使用条件" & i))) Then
      If (Me("使用条件" & i) = "ALL") Then
        sW = ""
        Exit For
      Else
        sW = sW & " OR 使用番号 Like '*" & Me("使用条件" & i) & "*'"
      End If
    End If
  Next
  If (Len(sW) > 0) Then
    sWhere = sWhere & " AND (" & Mid(sW, 5) & ")"
  End If

  If (Len(sWhere) = 0) Then
    Me.FilterOn = False
    Me.Filter = ""
  Else
    Me.Filter = Mid(sWhere, 6)
    Me.FilterOn = True
  End If
End Sub



なお、聞き漏れていたのですが、使用番号 は数値型でしたでしょうか。
(#1では、使用番号 で書いたつもりが、使用条件になってました)
使用番号が数値型であれば、部分的に以下に変更して大丈夫かと・・・・

> 使用番号は「1,2,3」等と入力してあります。
からするとテキスト型ですかね・・・・以下は不要かも

  sW = ""
  For i = 1 To 4 ' 使用条件1 ~ 4 ★
    If (Not IsNull(Me("使用条件" & i))) Then
      If (Me("使用条件" & i) = "ALL") Then
        sW = ""
        Exit For
      Else
        sW = sW & "," & Me("使用条件" & i)
      End If
    End If
  Next
  If (Len(sW) > 0) Then
    sWhere = sWhere & " AND 使用番号 IN (" & Mid(sW, 2) & ")"
  End If

※ ここまでの記述では、使用条件1 ~ 4 への入力値のチェックは行っていないので
各テキストボックスでの入力規則とか、更新前処理でチェックしてください。

※ 使用条件で用意したテキストボックスの個数が2つなら、
使用条件1 / 使用条件2 名にして、上記 ★ 部分の 4 を 2 に変更すれば・・・・


※※ 上記、未検証ですので動かなかったらごめんなさい。
また、考え違いをしているところがあるかも・・・・
    • good
    • 0
この回答へのお礼

>※※ 上記、未検証ですので動かなかったらごめんなさい。
>また、考え違いをしているところがあるかも・・・・

VBを入力してみたところ、しっかりと動きました。

>使用条件には 1 ~ 6 の数字・・・
>また、使用番号を指定するのに、
>使用条件1 / 使用条件2 という感じに・・・
>工具名条件 と 使用条件 は、あくまで AND

>で良いでしょうか。

ばっちりです。

>> 使用番号は「1,2,3」等と入力してあります。
>からするとテキスト型ですかね・・・・以下は不要かも

テキスト型で合っています。
とても勉強になります。(不要だなんて!)

30246kikuさんの細かい説明はとてもわかりやすくて勉強になります。
今回教えて頂いたVBを今後に生かせるよう頑張りたいと思います。
本当にありがとうございました。

お礼日時:2013/02/26 13:28

チャンと動いているのかわかりませんが、


テキストボックスで入力がない状態の基本は Null だったと思います。

Null と <> "" しているので、Else 側にまわっているのかもしれません。(?)
使用条件 部分に関して考えてみると、
(クエリ内での 使用条件 は、数値型だとして)

> If [使用条件] <> "" Then 検索文字 = 検索文字 & " and 使用番号 like '*" & [使用条件] & "*'"

上記部分を

If (Not IsNull(Me.使用条件)) Then
  検索文字 = 検索文字 & " and 使用番号 IN (★★)"
  検索文字 = Replace(検索文字,"★★",StrConv(Me.使用条件, vbNarrow))
End If

で、どうでしょう・・・・

※ StrConv(Me.使用条件, vbNarrow) 部分は、念のため全てを半角に置換えてます。

※※ 上記で半角に置換えても、数字じゃなかったらエラーになると思います。
   また、不要な , が前後についていたら・・・・とか(?)


ただ、
> となっており、工具名と使用番号のAND検索は出来ているのですが、使用番号が1~6あり、
> OR検索を使用して2つを検索条件にし、それぞれ該当している結果を表示させたいのですが。。。

の解釈ができてません。

単に 2つの条件の OR であれば、
それぞれの文字列先頭にある " and ・・・・" 部分を " or ・・・・" に変更し、

Me.Filter = Mid(検索文字, 5)

とすれば良さそうです。

※ Me.Filter = Mid(検索文字, 6, 2000) の 2000 が意味あるものか判断できませんでした。
単に 6文字目以降であれば Mid(検索文字, 6) で良いと思います。


※ 後は好き嫌いになるかと思いますが、自分が使う変数ぐらい初期化を明示されてはどうでしょう、

検索文字 = "" ' ★
If [工具名条件] <> "" Then 検索文字 = 検索文字 & " and 工具名 like '*" & [工具名条件] & "*'"
If [使用条件] <> "" Then 検索文字 = 検索文字 & " and 使用番号 like '*" & [使用条件] & "*'"

でないと
> If 検索文字 = "" Then
これが、どういう状態なのか分からなくなることが、私にはあります。

また、どこで宣言されているか・・・・読み取れませんでした。


追記)

> Me.Filter = Mid(検索文字, 6, 2000)
> Me.FilterOn = True
>
> DoCmd.Requery

再クエリのタイミングは、Me.Filter もしくは Me.FilterOn = True で発生したと思います。
なので、改めて DoCmd.Requery する必要はないと思います。


※ 解釈に間違いあれば、ごめんなさい。

この回答への補足

説明不足で申し訳ないです。

>使用条件 部分に関して考えてみると、
(クエリ内での 使用条件 は、数値型だとして)

使用条件として1~6の数字の他に、すべてのパターンで使う条件としてALLがありました。
使用条件のデータ型はテキスト型です。

>ただ、
>> となっており・・・
>> OR検索を使用して・・・
>
>の解釈ができてません。

こちらも説明不足で申し訳ないです。
使用番号の検索に使用条件1,使用条件2とtxtboxを作り、使用条件のOR検索を行いたいと思っていました。

>※ 後は好き嫌いになるかと思いますが、自分が使う変数ぐらい初期化を明示されてはどうでしょう

>再クエリのタイミングは、Me.Filter もしくは Me.FilterOn = True で発生したと思います。
>なので、改めて DoCmd.Requery する必要はないと思います。

とても勉強になります。VBはいまだよくわからなく、
前任の方のものをわかる範囲で調べて行っていました。

補足日時:2013/02/26 09:22
    • good
    • 0
この回答へのお礼

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

お礼日時:2013/02/26 09:22

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