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

日付によるデータ抽出について

環境: ACCESS2000
状況: メインフォーム(テキスト期間A、テキスト期間B、テキスト品番、検索ボタン)
   サブフォーム(データシート)
   管理テーブル( 品番  /  レンタル日  /  返却日)
   ※管理テーブルは他テーブルのコピー用

やりたい事: 簡潔にいうと期間と品番による抽出。
      但し、テキスト期間Bが空白の場合、テキスト期間A以降のデータ抽出。
         テキスト期間Aが空白の場合、テキスト期間B以前のデータ抽出。
      さらに、テキスト品番が空白の場合、期間のみでの抽出。
      逆にテキスト期間A・Bが空白の場合、テキスト品番で抽出。(品番の履歴抽出)

1度コードを作ってはみたものの、エラーばかりでひどかったので
0から教えて頂けると有難いです。

お手数お掛けしますが、何卒宜しくお願い致します。

A 回答 (3件)

入力されたものだけで、展開する記述例)



「レンタル日」は日付/時刻型、「品番」はテキスト型と仮定します。


Private Sub 検索ボタン_Click()
  Dim sWhere As String
  Const sAndOr = " AND "

  sWhere = ""
  If (Not IsNull(Me.テキスト期間A)) Then
    sWhere = sWhere & sAndOr & "[レンタル日] >= #" & Me.テキスト期間A & "#"
  End If
  If (Not IsNull(Me.テキスト期間B)) Then
    sWhere = sWhere & sAndOr & "[レンタル日] <= #" & Me.テキスト期間B & "#"
  End If
  If (Not IsNull(Me.テキスト品番)) Then
    sWhere = sWhere & sAndOr & "[品番] = '" & Me.テキスト品番 & "'"
  End If

  With Me '★
    If (Len(sWhere) > 0) Then
      .Filter = Mid(sWhere, Len(sAndOr) + 1)
      .FilterOn = True
    Else
      .FilterOn = False
      .Filter = ""
    End If
  End With
End Sub



★部分 With Me は自フォーム指定になるので、
自分に組み込んだサブフォームコントロール名を「FSUB」と仮定すると、
With Me.FSUB.Form の記述にすると、サブフォームへの設定になります。

条件を記述する場合、文字列先頭に必ず sAndOr を付加します。
条件ありの場合は、先頭の sAndOr を除いた分を条件設定します。

初めの記述で
sWhere = sWhere &・・・
にしているのは、
条件判別/記述順番を入れ変えたり、条件を追加したりした際の変更を少なく、
程度のものです。



補足に書かれていたエラーは、おそらく以下で解消できるかと

"#" And "[品番] = '" & Me!品番 & "'"

"# And [品番] = '" & Me!品番 & "'"
    • good
    • 0
この回答へのお礼

30246kikuさんありがとうございます。

コードまで書いて頂き、さらに説明があったので
わかりやすかったです。
まだ完全に理解してはいないので、調べながら勉強していこうと思います。

また、補足にあったコードはご指摘通りにしたところ動作確認取れました。
Andの使い方とでも言えばいいのかわかりませんが、
その理解が間違っていたようですね。勉強になりました。

本当に助かりました。ありがとうございます。

お礼日時:2010/05/08 10:37

追加。


最後に、

Me!サブフォーム.Form.Filter = 抽出条件
Me!サブフォーム.Form.FilterOn = True
Me!サブフォーム.Form.Requery

db.Close
Set db = Nothing
End Sub

としてください。
    • good
    • 0

見落としがありました。


前の板が閉まりかけていたのでこちらで。

>抽出条件 = "[レンタル日] >= '" & Me!テキスト期間B & "'"



抽出条件 = "[レンタル日] >= # " & Me!テキスト期間B & "#"

のように変更してみてください。他の箇所も同様に。
多分キャンセルはこれで解消されると思いますが。
抽出条件はそのままで試してみてください。
    • good
    • 0
この回答へのお礼

piroin654さんいつも親切にありがとうございます。

ご指摘の通り「#」で囲んだら動作確認できました。
これは、Fomat()と同じ役割なのですね。

ネットで「#」を調べたらわかりました。
型を指定してあげないと判断が困難になっているために
今までは反応しなかったみたいですね。

ありがとうございます。

また、1つ教えて頂きたいのですが、
単に私のコードの組み方が悪いだけですが、どう改善したら良いものか
わからないので・・・。

複数条件のコード
抽出条件 = "[レンタル日] Between #" & Me!テキスト期間A & "# And #" & Me!テキスト期間B & "#" And "[品番] = '" & Me!品番 & "'"

実行時エラー13 型が一致しません。

お手数をお掛けしますが、宜しくお願い致します。

お礼日時:2010/05/08 09:08

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