やりたい事は、
やりたい事
範囲選択したデータをレコードソースとしてフォームに表示させたい
しかし、VBAで、Between関数やら、テキストボックスの値などを設定したコードを動かすとなかなかメンドクサイ事があり備忘録に残しておくことにしました。
簡単なサンプルで実験
簡単なサンプルで実験をしてみました。
「果物リスト」と言うテーブルを作成して、適当にデータを打ち込みしました。
その後、フォームウイザードからフォームに起こして、範囲抽出する非連結のテキストボックスを設置しました。
Betweenを使ってレコードソースにするVBA
やりたい事として、IDを範囲選択してフォームのレコードセットにする事です。
IDは、id_startとid_endという非連結のテキストボックスを設置して範囲選択されるようにしました。
id_endの範囲数値を入力したら、抽出されるようにVBAを設定しました。
Private Sub id_end_AfterUpdate() Me.RecordSource = "SELECT * FROM 果物リスト WHERE ID Between " & Me.id_start & " and " & Me.id_end End Sub Private Sub コマンド11_Click() Me.RecordSource = "SELECT * FROM 果物リスト" id_start = Null id_end = Null End Sub
いつもながら、SQLの場合は、カンマやダブルコーテーションと言ったものを設置しなければエラーになる可能性があります。
今回は、範囲選択が数値型
だったので、上のコードのようになりました。
これが、日付などの期間の範囲だとちょっと複雑になり、#などを使わなければならないのでメンドクサイ
また、文字列も場合もちょっと記述が変わるので注意が必要であり、文字列の場合はBetweenというよりも、Likeなどを使った曖昧検索になるかと思います。
※日付と文字列は他のブログ記事にて解説することにします。
乗り越えられない範囲選択の場合
実験用サンプルなら、乗り越えらえない範囲選択での抽出なんていうケースは無いかと思われますが、自分の場合は、摩訶不思議な状態に遭遇しました。
どうしても、
ココに注意
フォームにデータが表示されないのです!
何度もコードを見直しデバッグをしましたが、乗り越えられませんでした。
&やカンマやダブルコーテーションなどの組み合わせも何度もやりましたが力尽きました。
そんな時は、クエリをレコードソースにすれば乗り越えられます。
Private Sub id_end_AfterUpdate() Me.RecordSource = "果物リスト クエリ" End Sub
なんかスマートじゃありませんが、クエリをひとつ作成すれば乗り越えられますので、なんどもチャレンジしても乗り越えられない時は、この方法を試してもいいかもしれません。
本当にAccessは癖スゴです。(´;ω;`)ウゥゥ