質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.91%

Access VBA 日付型を含めた抽出

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 179

ttakka

score 2

前提・実現したいこと

入力した日付と氏名でフィルターをかけ、サブフォームに結果を表示したい。

発生している問題・エラーメッセージ

・構文エラー
・演算子がありません
・エラーは出ないがうまく抽出されない
日付・文字列の型、またその扱いがうまくできずフィルター文がうまくかけません。

テーブルに
日付型で[2020/07/10 9:00:00]
が存在している状態です。

該当のソースコード

Dim WhereString As String

    If Me.txt氏名 <> "" Then
        WhereString = WhereString & " AND 氏名 like '*" & Me.txt氏名 & "*'"
    End If

    If Me.txt日付 <> "" Then
        WhereString = WhereString & [分からない部分]
    End If

    Me.Filter = Mid(WhereString, 6)
    Me.FilterOn = (WhereString <> "")

    Me.txt氏名.SetFocus

試したこと

日付型に[#]、文字列に["]等は理解しているのですが、結果的にどうそれらで挟めばよいかわからない状態です。

入力データを日付に変換する、またその逆も試そうとしたのですがクォーテーションや#等が複合し場合の記述の仕方がわからず結局詰まってしまっている状態です。

一度
WhereString = WhereString & " AND 日付 like '*" & Me.txt日付 & "*'"
のようにFormat・CDateで変換は行わずに文字列として試した時、[2020/07]だと抽出され、[2020/07/10]だと抽出されない事がありこれも原因がわからず詰まっています。

補足情報(FW/ツールのバージョンなど)

Access2016

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

0

テーブルに
日付型で[2020/07/10 9:00:00]
が存在している状態です。

[2020/07]だと抽出され、[2020/07/10]だと抽出されない事があり

2020/07 というような入力もありうるのでしょうか。その場合は、どのような抽出条件がご希望でしょうか。

2020/07/01 0:00:00 から 2020/07/31 23:59:59 でしょうか。


とりあえず、「2020/07/10」というように日まで入力するという前提で回答します。

    Dim WhereString As String

    If Me.txt氏名 <> "" Then
        WhereString = " AND 氏名 like '*" & Me.txt氏名 & "*'"
    End If

    If IsDate(Me.txt日付) Then
        WhereString = WhereString & " AND 日付 >= #" & Me.txt日付 & _
                                   "# AND 日付 < #" & DateAdd("d",1,Me.txt日付) & "#"
    Else
        MsgBox "正しい日付を入力してください。"
        Me.txt日付.SetFocus
        Exit Sub
    End If

    Me.Filter = Mid(WhereString, 6)
    Me.FilterOn = (WhereString <> "")

    Me.txt氏名.SetFocus

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/07/10 17:03

    根本的な原因は日付の入ったテーブルがフィールドリストに入っておらず参照ができないようでした、大変申し訳ありません・・・。

    しかし色々なやり方を教えて頂きとても助かりました、勤怠管理のようなものを作成しているので範囲で指定するものなど参考にさせていただいています、ありがとうございました!

    キャンセル

0

Me.txt日付の値は文字列ですから、日付型/時刻項目に対しての条件とする場合には、日付型に変換する必要があります。
#で括ると日付/時刻型として認識されます。

If Me.txt日付 <> "" Then
'    WhereString = WhereString & [分からない部分]
    WhereString = WhereString & " and 日付 >= #" & Me.txt日付 & "#" & " and 日付 < #" & Me.txt日付 & "# + 1"
End If


若干性能は落ちると思いますが、文字型で揃えると以下になります。

If Me.txt日付 <> "" Then
    WhereString = WhereString & " and Format(日付,'yyyy/mm/dd') = '" & Me.txt日付 & "'"
End If

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/07/10 15:47

    回答ありがとうございます!
    やはりエラーは出ないのですが[2020/07/10 9:00:00]や、Now関数を使って入力した日付データもうまく抽出できませんでした。

    Format関数を使い
    WhereString = WhereString & " and 日付 <> " & Format(Me.txt日付, "yyyy/mm/dd")
    エラー出ず、抽出されず

    一度変数に入れ
    Dim s
    Dim sd
    s = Now()
    sd = CDate(s)
    WhereString = WhereString & " and 日付 <> #" & sd & "#"
    エラー出ず、抽出されず

    フォームウィザードでサブフォームを作成した後に、テキストボックスでそれぞれ氏名と日付で値を指定できるよう作成しました。
    氏名のみだと抽出できるので型や記述の仕方に原因があると思っていたのですが、もしかして他に原因があるのでしょうか。

    キャンセル

  • 2020/07/10 15:52 編集

    formatするならテーブルの項目の方です。
    何れにしても画面の項目そのままを記述すると、単なる文字列としてwhere条件が作成されますので、型を合わせる事が必要です。

    クエリーの条件部分をコピーして置き換えてみればはっきりすると思います。

    キャンセル

  • 2020/07/10 15:58 編集

    テーブルのデータは時刻まで入っているので、画面の項目に時刻が含まれていないようですので、文字として比較するなら、テーブルのデータから時刻部分をカットする必要がありますし、データはそのままで画面の項目を条件とするなら日付の範囲での指定が必要になります。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.91%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る