• 締切済み

ACCESSで複数検索と日付範囲検索

先日、http://okwave.jp/qa/q6917268.html でご回答をいただいたのですが、 それに付け加えて、No.の検索(完全一致)と日付の範囲検索(売上日を範囲で検索)が必要になってしまいました。 上記URLで教えていただいたものはフィルタのコードだったのですが、 日付の範囲検索というものも上記コードに追加することができるのでしょうか? (日付の範囲検索単独であればクエリでできるのですが・・・。) [Txt売上日] しかなかったテキストボックスを、[Txt売上日自]と[Txt売上日至]の2つにし、その際、  1 [Txt売上日自]、[Txt売上日至]ともに空欄→検索条件には入れない  2 [Txt売上日自]は入力、[Txt売上日至]は空欄→[Txt売上日自]以降~直近のデータを検索  3 [Txt売上日自]は空欄、[Txt売上日至]は入力→一番古い日付~[Txt売上日至]までのデータを検索  4 [Txt売上日自]、[Txt売上日至]ともに入力→2つのテキストボックスの範囲の日付で検索 のような指定ができるものなのでしょうか? 超がつく初心者のため、質問の意図が伝わっていなかったらすみません・・・。 どうぞよろしくお願いいたします。

みんなの回答

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.9

【ついでに】 '### 売上日と得意先名と商品名の複合検索 ### ElseIf Not IsNull(Txt売上日自) And IsNull(Txt売上日至) And Not Not IsNull(Txt得意先名) And Not IsNull(Txt商品名) And IsNull(TxtNo) Then str = strDay & " And " & strCustomer & " And" & strGoods ElseIf IsNull(Txt売上日自) And Not IsNull(Txt売上日至) And Not IsNull(Txt得意先名) And Not IsNull(Txt商品名) And IsNull(TxtNo) Then str = strDay & " And " & strCustomer & " And" & strGoods ElseIf Not IsNull(Txt売上日自) And Not IsNull(Txt売上日至) And Not IsNull(Txt得意先名) And Not IsNull(Txt商品名) And IsNull(TxtNo) Then str = strDay & " And " & strCustomer & " And" & strGoods これで、主要な組み合わせは済んだと思いますが、 '### その他複合検索 ### については必要ならば 付け加えてください。全て入力した場合、Noとの 組み合わせなどは必要ならば、ということです。 【訂正です】 '### 得意先名と商品名の複合検索 ### ElseIf IsNull(Txt売上日自) And IsNull(Txt売上日至) And Not IsNull(Txt得意先名) And Not IsNull(Txt商品名) And IsNull(TxtNo) Then str = strCustomer & " And " & strGoods にしてください。 str = strCustomer & " And " & strGoods にするところが、 str = strCustomer & strGoods になっていました。 【その他】 また、コードの中で、 '## 得意先 ## strCustomer = " 得意先名 Like '*" & Me.Txt得意先名.Value & "*'" '## 商品名 ## strGoods = " 商品名 Like '*" & Me.Txt商品名.Value & "*'" のように、Valueをつかっていますが、この場合は特に必要ないので Me.Txt得意先名 Me.Txt商品名 でいいです。 なお、質問の最初の部分、 >先日、http://okwave.jp/qa/q6917268.html でご回答をいただいたのですが、 >それに付け加えて、No.の検索(完全一致)と日付の範囲検索(売上日を範囲で検索) >が必要になってしまいました。 については、No8に回答したようにhttp://okwave.jp/qa/q6917268.html での回答とここでの回答は別ボタンにして検索したら どうでしょう。 ただ、「それに付け加えて」のところが非常に 微妙な言い回しなので、 http://okwave.jp/qa/q6917268.htmlで回答したことと どのようにつながるのか定かでないので、ここでの 回答がご希望に沿うのかはわかりませんが。

italiantomato
質問者

お礼

お返事が遅くなり申し訳ありませんでした。 おかげさまで、納得のいくものができあがりました。 説明不足等で混乱を招いてしまいすみませんでしたT-T 大変ありがとうございました^-^*

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.8

No6のコードはボタンを別にして、 Private Sub cmd複合検索_Click()   ・   ・   ・ End Sub のようにしてはどうですか。

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.7

No6では変数の記述を変更しています。 組み合わせはダブらないように気をつけてください。 とくに、売上日が絡む場合は売上日のStrDayはstrDay="" の場合があるので組み合わせ方を誤ると「オブジェクトに 云々」というエラーがでます。これはフィルタにする 文章が間違っているということです。 なお、すべてを入力した場合の検索は入れていませんが 必要ならばすべてを Not IsNull にして、文を And で 結んでください。このあたりはわかりますね。 すべての組み合わせは24くらいだったと思いますが、 フィルターにする文章(この場合はstrですが)が ダブったり間違ったりすると変なことになりますから 気をつけてください。

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.6

以下に途中まで組み込んであります。 あとは以下の説明のところを読んで完成させてください。 '### 売上日と得意先名と商品名の複合検索 ### のところは、得意先名と商品名は Not IsNull にして、 売上日は一方が Not IsNull の場合が二つ、 両方とも Not IsNull の場合が一つ。 両方とも IsNull ならば単に得意先名と商品名の 検索になるのでここには記述しません。 And の使い方は三つの場合は、 文1 & " And " & 文2 & " And " & 文3 のような使い方をします。" And "のようにAndと"の間に 半角の余白があります。 Private Sub Cmd検索_Click() Dim strDay As String Dim strCustomer As String Dim strGoods As String Dim strNomber As String Dim str As String '### 日付 ### strDay = "売上日" If IsNull(Txt売上日自) Then If IsNull(Txt売上日至) Then '検索しない strDay = "" Else '最古(1899/12/30)から日付まで strDay = strDay & " between #" & "1899/12/30" & "# And #" & Txt売上日至 & "#" End If ElseIf Not IsNull(Txt売上日自) Then If IsNull(Txt売上日至) Then '日付から直近まで strDay = strDay & " between #" & Txt売上日自 & "# And #" & Date & "#" Else '期間中 strDay = strDay & " between #" & Txt売上日自 & "# And #" & Txt売上日至 & "#" End If End If '## 得意先 ## strCustomer = " 得意先名 Like '*" & Me.Txt得意先名.Value & "*'" '## 商品名 ## strGoods = " 商品名 Like '*" & Me.Txt商品名.Value & "*'" '## No ## strNomber = " [No] = " & Nz(Me.TxtNo) '####### 検索開始 ###### '#### 単独検索 ### If Not IsNull(Txt売上日自) And IsNull(Txt売上日至) And IsNull(Txt得意先名) And IsNull(Txt商品名) And IsNull(TxtNo) Then str = strDay ElseIf IsNull(Txt売上日自) And Not IsNull(Txt売上日至) And IsNull(Txt得意先名) And IsNull(Txt商品名) And IsNull(TxtNo) Then str = strDay ElseIf IsNull(Txt売上日自) And IsNull(Txt売上日至) And Not IsNull(Txt得意先名) And IsNull(Txt商品名) And IsNull(TxtNo) Then str = strCustomer ElseIf IsNull(Txt売上日自) And IsNull(Txt売上日至) And IsNull(Txt得意先名) And Not IsNull(Txt商品名) And IsNull(TxtNo) Then str = strGoods ElseIf IsNull(Txt売上日自) And IsNull(Txt売上日至) And IsNull(Txt得意先名) And IsNull(Txt商品名) And Not IsNull(TxtNo) Then str = strNomber '### 売上日と得意先名の複合検索### ElseIf Not IsNull(Txt売上日自) And IsNull(Txt売上日至) And Not IsNull(Txt得意先名) And IsNull(Txt商品名) And IsNull(TxtNo) Then str = strDay & " And " & strCustomer ElseIf IsNull(Txt売上日自) And Not IsNull(Txt売上日至) And Not IsNull(Txt得意先名) And IsNull(Txt商品名) And IsNull(TxtNo) Then str = strDay & " And " & strCustomer ElseIf Not IsNull(Txt売上日自) And Not IsNull(Txt売上日至) And IsNull(Txt得意先名) And IsNull(Txt商品名) And IsNull(TxtNo) Then str = strDay & " And " & strCustomer '### 売上日と商品名の複合検索 ### ElseIf Not IsNull(Txt売上日自) And IsNull(Txt売上日至) And IsNull(Txt得意先名) And Not IsNull(Txt商品名) And IsNull(TxtNo) Then str = strDay & " And " & strGoods ElseIf IsNull(Txt売上日自) And Not IsNull(Txt売上日至) And IsNull(Txt得意先名) And Not IsNull(Txt商品名) And IsNull(TxtNo) Then str = strDay & " And " & strGoods ElseIf Not IsNull(Txt売上日自) And Not IsNull(Txt売上日至) And IsNull(Txt得意先名) And Not IsNull(Txt商品名) And IsNull(TxtNo) Then str = strDay & " And " & strGoods '### 得意先名と商品名の複合検索 ### ElseIf IsNull(Txt売上日自) And IsNull(Txt売上日至) And Not IsNull(Txt得意先名) And Not IsNull(Txt商品名) And IsNull(TxtNo) Then str = strCustomer & strGoods '以下は完成させてください '### 売上日と得意先名と商品名の複合検索 ### '### その他複合検索 ### End If Filter = str FilterOn = True End Sub

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.5

No3の続きとして。 まず、どのような使い方をしたときに エラーが表示されたのか教えてもらえますか。 一応、調べたところ、たとえば、商品名を入力せずに 他のものを入力して検索すると、補足のような エラーが出ます。というのもすべての条件を And で結んでいるので全ての条件が入力 されていることが必要になります。ただし、 期間についてはあらかじめ未入力の場合に 対応するようにしていますが。 そうではなく、すべてを入力してもエラーが 出る、ということですか? 付け加えて、この場合はどのような使い方を したいのか、期間だけではないような気がするのですが。 たとえば、得意先名だけ、商品名だけ、Noだけ、期間だけ、 あるいは、得意先名と商品名だけ、得意先名とNoだけ、 得意先名と期間だけ、商品名と期間だけ、 あるいは、すべて、 など、あらゆる組み合わせで検索したい、ということですか?

italiantomato
質問者

補足

情報不足で大変申し訳ありませんでした。 Txt売上日自とTxt売上日至は「yyyy/mm/dd」の日付型での入力です。 >たとえば、得意先名だけ、商品名だけ、Noだけ、期間だけ、 >あるいは、得意先名と商品名だけ、得意先名とNoだけ、 >得意先名と期間だけ、商品名と期間だけ、 >あるいは、すべて、 >など、あらゆる組み合わせで検索したい、ということですか? そういう意図でした。。。 質問の文章に貼ったリンクのコードでは、空欄のテキストボックスがあっても検索ができていたので、 自分で勝手に「できるもの」と思い込んで質問文にのせておりませんでした・・・。 すみませんでした・・・。 全ての項目を入力すればエラーは出ませんが、上記のように色々な組み合わせで検索ができれば・・・と思っております。

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.4

それと、No2のコードはコンパイルすると エラーは出ないですね?

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.3

フォーム上のテキストボックスの確認をします。 Txt得意先名 Txt商品名 Txt売上日自 Txt売上日至 TxtNo の五つのテキストボックスがあるものとしています。 このうち、 Txt売上日自 Txt売上日至 は、質問の通りの使い方をするとして、 残りの三つは、必ず入力するものですか? また、 Txt売上日自 Txt売上日至 は、2011/08/08 のように日付型での入力 ですか?

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.2

以下を確認してみてください。 新たにテキストボックス「TxtNo」があるものとしています。 「No」というフィールド名を使ってもいいですが、 「No.」のようにNoにドットをつけるのは「不正な名前」 と拒否されるはずですが。以下では「No」のように Noのにドットつけません。ドットは特別な意味を持つ 記号です。 Private Sub Cmd検索_Click() Dim MyCriteria As String Dim strfilter As String MyCriteria = "売上日" If IsNull(Txt売上日自) Then If IsNull(Txt売上日至) Then '検索しない MyCriteria = "" Else '最古(1899/12/30)から日付まで MyCriteria = MyCriteria & " between #" & "1899/12/30" & "# And #" & Txt売上日至 & "# And" End If ElseIf Not IsNull(Txt売上日自) Then If IsNull(Txt売上日至) Then '日付から直近まで MyCriteria = MyCriteria & " between #" & Txt売上日自 & "# And #" & Date & "# And" Else '期間中 MyCriteria = MyCriteria & " between #" & Txt売上日自 & "# And #" & Txt売上日至 & "# And" End If End If strfilter = MyCriteria 'Noが数値の場合 strfilter = strfilter & " 得意先名 Like '*" & Me.Txt得意先名.Value & "*' And 商品名 Like '*" & Me.Txt商品名.Value & "*' AND [No] = " & Me.TxtNo 'Noが文字列の場合 'strfilter = strfilter & " 得意先名 Like '*" & Me.Txt得意先名.Value & "*' And 商品名 Like '*" & Me.Txt商品名.Value & "*' AND [No] = '" & Me.TxtNo & "'" Filter = strfilter FilterOn = True Me.Requery End Sub

italiantomato
質問者

補足

ありがとうございます。 さっそくやってみたところ、No以外の検索は全てデバッグが出ます・・・。T-T (実行時エラー2448 このオブジェクトに値を代入することはできません。)

  • m3_maki
  • ベストアンサー率64% (295/459)
回答No.1

こちらはフィルタを使用するモデルケースです。 複数条件の抽出フォームの設計 その1 http://hatenachips.blog34.fc2.com/blog-entry-129.html 最初のこちらは、かなりひどいコードですので、 これに手をいれてもあまり良いものにはなり得ませんね。 http://okwave.jp/qa/q2029954.html なお、No.の検索(完全一致) については 「No.」というフィールド名は 不具合の元なので 「番号」(数値型) と仮定して " AND 番号 =" & Me.txt番号 のように。 参考として、テキスト型なら " AND 番号 = '" & Me.txt番号 & "'" になります。

italiantomato
質問者

お礼

名前の付け方にも注意が必要なのですね^-^* 勉強になります^-^

関連するQ&A

  • ACCESSで複数検索をしたいのですが・・・

    T_1・・・テーブル  No.、得意先名、商品名、売上日、備考 Q_1・・・クエリ  「T_1」を元に作成 「Q_1」からなる「F_1」というフォームのヘッダーに [Txt得意先名]、[Txt商品名]、[Txt売上日]という3つのテキストボックスと、 検索ボタン[Cmd検索]を配置し、1~3つの条件を入力して検索する フォームを作りたいと考えています。 そこで、http://okwave.jp/qa/q2029954.html にあるコードを使い、 下記のコードを書いてみました。 ================= Private Sub Cmd検索_Click() Dim MyCriteria As String MyCriteria = "売上日 ="  If IsNull(Txt売上日) Then   MyCriteria = MyCriteria & True  ElseIf Not IsNull(Txt売上日) Then   MyCriteria = MyCriteria & "#" & Me!Txt売上日 & "#"  Else  End If strfilter = MyCriteria strfilter = strfilter & " And 得意先名 Like '*" & Me.Txt得意先名.Value & "*' And 商品名 Like '*" & Me.Txt商品名.Value & "*'" Filter = strfilter FilterOn = True Me.Requery End Sub ================= ただ、上記のコードでは、[Txt売上日]を空欄で検索した場合、 仮に「T_1」で売上日が未入力だった時にそのデータは検索してくれません。 自分でもいろいろ調べて試したのですが、なかなかうまくいかず・・・。 ご存知の方、教えていただけませんでしょうか? よろしくお願いいたします。

  • accessでの複数条件での検索について

    現在accessで売上管理を作成しています。 T_一覧には売上日付、担当者、品名、金額、入力者、入力日付のデータが格納されています。 F_一覧は、T_一覧を基に、すべてのデータが閲覧できるフォームです。 ヘッダー部分に、売上日付、担当者、入力者、入力日付のテキストボックスを配置し、「検索」コマンドボタンを押下すると、検索したい条件に一致するデータのみが表示されるようにしたいです。 現在は担当者と入力者に検索したい値を入力し、「検索」ボタンを押下すると、条件に合ったデータのみが表示されるのですが、売上日付と入力日付に検索したい日付を入力しても、なにも検索できません。 担当者と入力者はQ_検索をT_一覧より作成し、抽出条件にLikeを使っています。 日付はどのように抽出条件にかけばよいのでしょうか?

  • Accessの日付で不思議なことが

    Access2003で見積書を作るシステムを作りました。日々、見積書発行し月末に各物件の見積一覧表を作ります。個々の見積データにある、見積日付を範囲指定して、データを抽出します。 その方法としてフォーム上に二つのテキストボックスを配置し、それぞれに「自見積日付」、「至見積日付」という名前をつけ、一覧表印刷クエリーの中の見積日付の抽出条件にBetweenで「自見積日付」~「至見積日付」ををいれ抽出します。これをレポートで見積一覧表を印刷します。この方法で日付が2006年12月31日までは問題なく出来ましたが、日付が2007年1月1日以降になると抽出できなくなってしまいました。 もちろん2007年1月1日以降のデータは存在します。 原因がまったく分りません。どなたか分る方はいませんか。よろしくお願いします。(質問の書き方が苦手で分りにくくて申し訳ありません)

  • ACCESSの日付入力について

    私は建設会社に勤務していますが、ACCESSのことで困っています。 現在ACCESS2000を使用していますが、どの現場監督がどの工事をしたかをデータベースにしようとしています。その途中、フォームの中のフォームヘッダー欄で現場監督をコンボ入力したら、詳細欄に担当した工事が一覧で表示できるようにはなりましたが、更に日付(工事期間)を入力したら、期間内の工事が出るように設定にしたいのですが、うまくいきません。 現在の設定状況としては、フォームヘッダーのコンボボックス「form監督検索」で指定すると、選択クエリ「qu_監督検索クエリ」からデータがくるようになっていますが、「工期自」と「工期至」を入力すると、その期間内の工事を拾うようにして、もし未入力の場合だったら、全ての工事、「工事自」だけ未入力だったら最初から「工事至」まで、「工事至」だけ未入力の場合は「工事自」から現在までとしたいのです。 複雑な内容で大変申し訳ありませんがよろしくお願いします。

  • ACCESSのフォーム上で複数検索したい項目がある場合どうすればいいですか?

    (1)部品ID (2)日付 (3)入庫か出庫  以上3つを検索したいのですがどうすればいいでしょうか? (1)の部品IDはリストBOXの一覧から選択し、選択したものをテキストBOXに表示させるという形で作成しました。 (2)の日付はテキストBOXに手入力という形です。 (3)の入庫か出庫はコンボBOXで選択するという形です。 検索ボタンを作成してクエリの更新をかけて表示したいと思うのですが、3つの条件のうちその時により、全ての検索条件を入力しなくても1つでも条件を入力するとその条件が表示させるようにさせたいのです。 あと、何も条件を入力せず、検索ボタンを押すと全てのデータが表示させれるようにもしたいのです。 どのようなコードを記述すればいいでしょうか? よろしくおねがいします

  • phpの日付検索方法

    ざっくりとした書き方になりますが失礼します。 検索条件の項目に日付の検索をしたいと考えています。 開始日付と終了日付をinput typeのtextで用意し入力された日付 の範囲内にあるデータをSQLで抽出したいのですが。 日付自体のフォーマットはどのような形で統一した方が検索しやすいでしょうか? それに合わせてtextでも何か制限みたいなのをかけれたら良いのですが。 現在テーブルのその日付データもtextの入力される日付データもフォーマットが 決まっていないので日付検索が作りやすいフォーマットにしたいと思っています。 また、どちらかの日付だけ入力する場合も考えられると思うので両方入力していないと 使えないBETWEENとかは使わずに ANDの方が良いかなと思っています。 1.使いやすいフォーマット 2.1.に関連したtextエリアでの入力制限方法 3.それらを使った実際の参考例のSQL文 上記3つについて良い方法がございましたらご教授願いますでしょうか?

    • ベストアンサー
    • MySQL
  • Accessレポート出力時の範囲指定

    Accessでレポートを出力する際に出力範囲を画面から入力したいと思ってます。 下記3項目をフォーム(frm出力範囲)から入力しようと考えてます。       住所コード (テキスト形式) : [住所自]   ~ [住所至]        販売店コード(数値型) : [販売店自] ~ [販売店至]        担当者コード(数値型) : [担当者自] ~ [担当者至]  レポートを開く際にWhere条件式に指定すればできるのかとも思いますが (できるかどうかもわかりませんが)どうすればよいかわかりません。 どなたかお教えいただけませんか?

  • ACCESSでの検索

    あいまい検索をしたいです。 【現状】 フォームデザインでテキストボックスを作り、検索ボタンを作成 ↓ 【したいこと】 マクロデザインで、「テキストボックスに文字列を入力すると、文字列を含むデータを抽出」 というまくろを組みたい。 [コード]=[Forms]![total]![コード入力]という、完全一致のものはここで教えていただいて作成できたのですが、もうひとつ、あいまい検索もしたいです。 あいまい検索は、「商品名」です。 宜しくお願いします。

  • access クエリ 検索フォームの作り方

    よろしくお願いします。 やりたいこと: フォーム上で、テキストボックスに入力した値を検索して表示したい。 本やウェブで調べて、なんとか一度はやっと出来たのですが、 誤って何かを変更してしまい、使えなくなってしまいました。 今となってはどの資料を見て作れたのかわからなくなりました。 やったこと: クエリ :クエリA   条件にforms!フォームA!txt0を入力 フォーム:フォームA ヘッダーに非連結のテキストボックスtxt0を作成 txt0の更新後処理:docmd.requeryを入力 しかし、txt0に入力しても検索されません。 フォームのプロパティのレコードソース欄にクエリAを選択するようですが、 選択するクエリ名が表示されないので、クエリ名を入力しましたがダメでした。 どこか間違っているのでしょうか。VBAまでは勉強できないので上記範囲内でお願いします!

  • ACCESS 日付検索がうまくいきません

    下記の形式でテーブルに日付データ(訳ありでテキスト型)が格納されています。 yyyy/mm/dd hh:mm:ss 日付のみ入力し下記のSQLで検索してもFromTimeの日付のみのデータしか検索できません。 SELECT * FROM T_A WHERE Access_Time BETWEEN #" & FromTime & "# AND #" & ToTime & "#" (例) FromTime  ToTime 2007/01/01 2007/01/05 2007/01/01のデータしか検索できない。 時間が邪魔してできないのでしょうか? (無理矢理「*」を組み込んだのですがダメでした・・) どなたか教えてください。お願いします。

専門家に質問してみよう