お世話になります。
以前にも教えて頂いた複数項目で検索フォームに、項目の追加を考えています。
リストボックス名を月検索(数値型)とし、複数選択が可能なリストボックスで、月を複数選択して、選択した月をすべて抽出したいと、【複数選択リストボックスで選択したレコードの印刷】等々をもとに色々試したのですが、どうすればいいのか、全くわからない状態です。無理な事を考えているのでしょうか?
どうぞよろしくお願いいたします。
フィールド名 | コンボボックス名 | データ型・抽出仕様 |
---|---|---|
氏名 | 氏名検索 | テキスト型 部分一致 |
フリガナ | 氏名検索 | テキスト型 部分一致 |
参加有無 | 参加 | Yes/No型 一致 |
性別 | 性別検索 | テキスト型 部分一致 |
就職年月日 | 就職日 | 日付/時刻型 二つのテキストボックスで範囲指定 |
フィールド名 | テキストボックス名 | データ型・抽出仕様 |
---|---|---|
月 | 月検索 | 数値型 一致 |
Private Sub 抽出_Click()
Dim strfilter As String, strexp As String, aryope As Variant
If Not IsNull(Me.氏名検索) Then
strfilter = strfilter & " AND (氏名 Like ""*" & Me.氏名検索 & "*"" Orフリガナ Like ""*" & Me.氏名検索 & "*"")"
End If
If Me.参加 = True Then
strfilter = strfilter & " AND 参加有無 =" & Me.参加
End If
If Not IsNull(Me.性別検索) Then
strfilter = strfilter & " AND 性別 Like '*" & Me.性別検索 & "*'"
End If
If Not IsNull(Me.min就職日) Then
If Me.min就職日 > Format(Date, "yy/mm") Then
strfilter = strfilter & " AND 就職年月日 >= #" & "19" & Nz(Me.min就職日) & "#"
Else
strfilter = strfilter & " AND 就職年月日>= #" & "20" & Nz(Me.min就職日) & "#"
End If
End If
If Not IsNull(Me.max就職日) Then
If Me.max就職日 > Format(Date, "yy/mm") Then
strfilter = strfilter & " AND 就職年月日 < #" & DateAdd("m", 1, "19" & Me.max就職日) & "#"
Else
strfilter = strfilter & " AND 就職年月日 < #" & DateAdd("m", 1, "20" & Me.max就職日) & "#"
End If
End If
Me.Filter = Mid(strfilter, 6)
If strfilter = "" Then
Me.FilterOn = False
Else
Me.FilterOn = True
End If
End Sub
全くわからないと言われてしまうとどうすべきなのか迷いますが・・・
選択した月をすべて抽出したいということですが、複数選択が可能なリストボックスを使わなかったらできますか?
「月」の抽出なので、例えばテキストボックスを12個使ったりとか、チェックボックスを12個使ったりとかです。
まずはここまで
😄ご回答頂きまして、ありがとうございます。
チェックボックスは試していませんが、
スペースで区切って複数選択!なるものを試してみたのですが・・・・・・下記コードで当然のごとく、文字列として検索してしまい、例えば 1月と4月 を検索すると 入力は 「1 4」 で、検索結果は 1と11と12と4となります。
これを数値で検索できるようにするには・・・・・で、どこを修正すればいいのかわからず、また詰まっています。
すみません。😨
テキストボックスは試してみようと思います。
リストボックス
名前 月検索
複数選択 標準 または 拡張
値集合タイプ 値リスト
値集合ソース 1;2;3;4;5;6;7;8;9;10;11;12
対象フィールド
フィールド名 月 (数値型)
として、下記のようなコードになります。
簡単に解説しておきますと、
リストボックスの ItemsSelectedプロパティには、選択されたアイテムのインデックスが格納されています。
For Each でインデックス(Itm)を一つずつ取り出します。
ItemData(Itm) でインデックスに対応するデータを取り出します。
取り出したデータを カンマ区切りで連結していきます。
最後に、AND 月 In ( ) に挿入して、下記のような条件式文字列にします。
AND 月 In (2,4,6,9,11)
2,4,6,9,11 を選択した場合
ご回答頂きましてありがとうございます。
思うように動作させることが出来ました。
本当にありがとうございました。
テキスト型にも運用できるようにしていきたいと思い以下のようにコード
を変更してみました。
テキスト型の項目に試してみると、抽出出来たのですが、
この部分だけの変更でいいのか、よく理解できていません。😨
はい、それで大丈夫ですよ(^-^)。😊
😆
ほっと安心できました。
ありがとうございました。☺
腰を据えてパソコンの前に座る時間が取れずだいぶ遅くなってしまいましたが返答を入れます。
リストボックスについての話はありません。かなり基礎的な内容です。
今回の案件で考えるべきは
Me.Filter
に設定する値)と3つあり、それぞれの影響はあまり大きくありません。色々試したということですが質問に記載のコードは前回の質問で完成したままで、試した内容がわかりません。
解決策としてはhatenaさん提示の通りという簡単なものですが、どのようなアプローチで無理な事を考えているに至ったのがわからないので「質問丸投げ、コードコピペ、次への応用ができない」という不安がでます。
この部分の確認が>> 1の質問でした。
ということで、不安になりそうなところを上げておきます。
別々な条件をすべて抽出
何となく理解しているだろうことは見えますが、
Or
で抽出できます。例えば1月、2月、3月を抽出したいとなると"月 = 1 Or 月 = 2 Or 月 = 3"
となります。テキストボックスを使って「1 2 3」の入力があるならなんて形になるでしょう。
ただし、実践上は他の条件との兼ね合いがあるので(And Orの優先順位を考慮すると
"And (月 = 1 Or 月 = 2 Or 月 = 3)"
がほしい)>> 2のコードはもう少しというところですね。
(BuildCriteriaを使う方法は不正解ではないですが、今回そこまで難しく考える必要はないので特に補足はしません)
最終的なリストボックスのコードはそれ用に独特の内容もありますが、全体の処理の流れは変わりませんし、出力(strfilterの値)も変わりません。(In句を使うかどうかは別問題です。後述)
最終目標はリストボックスを使ってとなりますが、問題を分割して何がわからないのかをもう少し掘り下げておけるとよかったと思います。
In句について
ここでの使い方は複数のOrをまとめたもの。
つまり「
" And (月 = 1 Or 月 = 2 Or 月 = 3)"
」と「" And 月 In (1,2,3)"
」は全く同じ動作をするということになります。これを表すコード部分で言うと
はどちらを記述しても全く同じ動作をすることになります。完成形のコードのほうであれば
のどちらを書いても同じ結果になります。
In句のほうが読みやすいのが一番のメリットですね。
In句を使っているからと言ってなにも特別なことはないとわかれば>> 4の疑問も理解できると思います。
以上、「全くわからない」を「何がわからないのかわかる」ようにするために問題を切り分けましょうという話でした。