- 締切済み
サブフォームに複数検索機能を使用する
はじめまして。 今卒業研究で顧客管理システムを製作しています。 つまづいてしまいどうにも作業が進まなくなってしまったので質問させてもらいます。 日付(テキストボックス、カレンダー表示)と時間帯(リストボックス)の二つの条件が合致した結果を出したいのですが、コマンドボタンで検索をかけるとすべての結果が出てしまいます。 フィルターをかけているのですが、参照の仕方が悪いのかと思い、いろいろ試しましたがうまくいきません。 [T予約マスタ]![来店日] Like '*' & [Form]![textbox] And [T予約マスタ]![時間帯] Like '*' & [Form]![listbox] 参照テーブル→[T予約マスタ] 日付のテキストボックス名前→[textbox] 時間帯のリストボックス名前→[listbox] とこのようになっています。 Access2010のマクロビルダーで製作しています。 まだまだAccessのことを理解できていません。 些細なことでもいいのでご指摘アドバイスお願いします。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- piroin654
- ベストアンサー率75% (692/917)
>コマンドボタンはサブフォームについています。 >コマンドボタン、textbox、listboxはすべて同じフォーム内にあります。 ということであれば、たとえばサブフォームが帳票形式 あるいはデータシート形式のようなものであるとするならば、 Private Sub コマンド2_Click() If Not IsDate(Me!textbox) Then MsgBox "日付を正しく入力してください" '一旦テキストボックスの表示を空にするならば Me!textbox = Null Exit Sub End If Me.Filter = "[来店日] Like #" & Me![textbox] & "# And [時間帯] Like '*" & Me![listbox] & "*'" Me.FilterOn = True End Sub のように直接自分自身にフィルタをかける ということでどうでしょう。 なお、フィルタを解除してデータをすべて表示する場合は、 もう一つボタンを設定して、 Private Sub コマンド3_Click() Me.FilterOn = False End Sub とすれば全件表示されます。
- piroin654
- ベストアンサー率75% (692/917)
一応確認のために >コマンドボタンで検索をかけると としているコマンドボタンはどのフォームにあるのか 補足してください。 わかりやすい適当な画像がないので英語版ですが、以下に説明が あります。 http://www.btabdevelopment.com/ts/ewtrhtrts No1の最後で、 >なお、デザインビューで >サブフォームの端っこで右クリックしてプロパティを >見ればそのコントロールの名前が確認できるはずです。 というのが、上記の画像の赤線で囲まれた左の四角形の、 When you click this border,・・・・・ というくだりと同じになります。そして、 「"サブフォームを表示するコントロール名"」 というのが、右の赤線で囲まれた四角形から伸びた 矢印の先のプロパティシートの「Name」というところの名称、 すなわち日本語のAccessでは「名前」というのが 「"サブフォームを表示するコントロール名"」 ということになります。 なお、補足の >時間帯→値リスト"ランチ","ディナー" となってます。 については、特にコードを変更することはありません。
- piroin654
- ベストアンサー率75% (692/917)
No1です。追加します。 Me!埋め込み0.Form.Filter = "[来店日] Like #" & Me![textbox] & "# And [時間帯] Like '*" & Me![listbox] & "*'" のように、#を使用すると、たとえば、textboxに 2012と入力すると実行時エラーの構文エラーが 表示されます。この場合は入力されるデータが 日付型に特定されています。 *を使用すると入力されたデータをテキスト型 で判断します。したがって2012とだけ入力 してもエラーは出ずに、来店日に2012を含む データを抽出対象とします。 なお、入力値を日付型に強制する場合は、たとえば#の場合 Private Sub コマンド2_Click() If Not IsDate(Me!textbox) Then MsgBox "日付を正しく入力してください" Exit Sub End If Me!埋め込み0.Form.Filter = "[来店日] Like #" & Me![textbox] & "# And [時間帯] Like '*" & Me![listbox] & "*'" Me!埋め込み0.Form.FilterOn = True End Sub あるいは*の場合、 Private Sub コマンド2_Click() If Not IsDate(Me!textbox) Then MsgBox "日付を正しく入力してください" Exit Sub End If Me!埋め込み0.Form.Filter = "[来店日] Like '*" & Me![textbox] & "*' And [時間帯] Like '*" & Me![listbox] & "*'" Me!埋め込み0.Form.FilterOn = True End Sub のような方法もあります。 なお、質問に、 >日付(テキストボックス、カレンダー表示) とありますので上記のようなことは不要かもしれませんが。
補足
回答ありがとうございます。 こんなに早く答えてもらえるとは思ってませんでしたのでうれしい限りです。 さらに質問…というか補足なのですが、 時間帯→値リスト"ランチ","ディナー" となってます。 "サブフォームを表示するコントロール名"がまだよく分かりません。 フォーム自体をナビゲーションで作っていて、今3つのフォームを連結させています。 プロパティのサブフォーム/サブレポートが3つすべて"NavigationSubform"になっています。 お手数をおかけしますがよろしければまた回答お願いします。
- piroin654
- ベストアンサー率75% (692/917)
必要な情報が少ないので以下のようにこちらで 設定してみました。 (1) T予約マスタの来店日および時間帯のフィールドの型が どのようなものかの情報がないのでこちらで、 来店日 日付/時刻型 時間帯 数値型 とします。違っていいたら補足してください。 何故ならば、この型の違いだけでエラーが生じるからです。 (2) リストボックスの値集合タイプは値リストとし、 値集合ソースは以下のように設定されているもとします。 9;10;11;12;13;14;15;16;17 (3) サブフォームのレコードソースはT予約マスタとします。 (4) コマンドボタンのクリック時のイベントに、 Private Sub コマンド2_Click() Me!埋め込み0.Form.Filter = "[来店日] Like '*" & Me![textbox] & "*' And [時間帯] Like '*" & Me![listbox] & "*'" Me!埋め込み0.Form.FilterOn = True End Sub 上記の「埋め込み0」とはサブフォームを表示するコントロール名で、 初期値はこのような名前になっているはずです。サブフォームの 名前ではありません。 名前を変更した場合はここを変更してください。なお、デザインビューで サブフォームの端っこで右クリックしてプロパティを 見ればそのコントロールの名前が確認できるはずです。 一応、以上を確認してみてください。
お礼
いろいろとお答えありがとうございました。
補足
>>コマンドボタンで検索をかけると >としているコマンドボタンはどのフォームにあるのか >補足してください。 コマンドボタンはサブフォームについています。 コマンドボタン、textbox、listboxはすべて同じフォーム内にあります。