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」等と入力してあります。
クエリの抽出条件は無記入です。
どうぞ、よろしくお願いします。
No.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 に変更すれば・・・・
※※ 上記、未検証ですので動かなかったらごめんなさい。
また、考え違いをしているところがあるかも・・・・
>※※ 上記、未検証ですので動かなかったらごめんなさい。
>また、考え違いをしているところがあるかも・・・・
VBを入力してみたところ、しっかりと動きました。
>使用条件には 1 ~ 6 の数字・・・
>また、使用番号を指定するのに、
>使用条件1 / 使用条件2 という感じに・・・
>工具名条件 と 使用条件 は、あくまで AND
>で良いでしょうか。
ばっちりです。
>> 使用番号は「1,2,3」等と入力してあります。
>からするとテキスト型ですかね・・・・以下は不要かも
テキスト型で合っています。
とても勉強になります。(不要だなんて!)
30246kikuさんの細かい説明はとてもわかりやすくて勉強になります。
今回教えて頂いたVBを今後に生かせるよう頑張りたいと思います。
本当にありがとうございました。
No.1
- 回答日時:
チャンと動いているのかわかりませんが、
テキストボックスで入力がない状態の基本は 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はいまだよくわからなく、
前任の方のものをわかる範囲で調べて行っていました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
gas 全角数字を半角数字に変換
-
「終了していない文字列型の定...
-
正整数の半角数字かどうか判定する
-
JavaScriptでフォームの入力項...
-
Access VBAで、数字だけをチェ...
-
ハイフンだけ置換したい。
-
JavaScriptの正規表現の全角ス...
-
VC#でテキストボックスに変数の...
-
JavaScriptで ブラウザの閉じる...
-
contenteditableで編集した内容...
-
PDFフォームで条件つき金額を表...
-
csvファイルを読み込み、該当項...
-
GoTo文とかSelect文の処理の仕...
-
ローカルのレジストリを読みたい
-
Excel vba 配列内の最大値を求...
-
javascriptで「オブジェクトを...
-
JSPの処理の途中で、JavaScript...
-
「戻る」ボタン使用時のフォー...
-
VBScriptでのforms[0]など配列...
-
フォームバリデーションする際...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VB.NET2003 テキストボックスに...
-
gas 全角数字を半角数字に変換
-
VBAによる第3、4水準文字の判定...
-
「終了していない文字列型の定...
-
正整数の半角数字かどうか判定する
-
エクセルVBA/ Formatで文字列が...
-
VC#でテキストボックスに変数の...
-
Excel VBA カタカナ セル判定...
-
JavaScriptでこの正規表現を利...
-
禁止文字チェック
-
エクセル 半角英数6文字以上 ...
-
正規表現について
-
C#でTextBoxに数値のみ入力可能...
-
Visual Basic 6.0 のテキストボ...
-
javascript 文字列の最後から1...
-
Vba SelStart、SelLen教えてく...
-
Javascript 全角カナ+半角スペ...
-
文字数の制限について
-
漢字などを正規表現でパターン...
-
”吴”とはなんですか?
おすすめ情報