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

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

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

Q&A

解決済

1回答

1591閲覧

Access vba ADOでのフィルター条件の記載

ukana

総合スコア7

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

0グッド

0クリップ

投稿2022/05/11 04:57

フィルター部分にてエラーが発生し
自身で調べた範囲では実現したい条件の抽出を
どのように記載すれば良いかが分かりませんでした。
お知恵を貸して頂きたいです。

rs1(元データは条件抽出したクエリ)の
IDフィールド-1のレコードを
rs2(元データは検索したいテーブル)から
フィルター抽出したいです。

rs2.Filter = "rs2!ID=rs1!ID-1"
このFilter構文で実行時エラー3001が
発生します。
記載内容が間違っているのか
そもそもフィルターの条件には
別のレコードセットの内容は
使えないのでしょうか。
1からVBAを書くのが初めてのレベルで
基礎的な質問かと思いますが分かりません。
抽出条件が別のクエリ、レコードセットにある場合、
どのようにフィルターの条件を表現するのか
教えて頂きたいです。

vba

1 2Private Sub コマンド0_Click() 3Dim rs1 As New ADODB.Recordset 4Dim rs2 As New ADODB.Recordset 5 6With rs1 7 .Open "fl1", CurrentProject.Connection 8 Do Until .EOF 9 .MoveNext 10 Loop 11 .Close 12End With 13 14rs2.Open "dtrim", CurrentProject.Connection 15 16rs2.Filter = "rs2!ID=rs1!ID-1" 17 18Do Until rs2.EOF 19 Debug.Print rs2!d_buban 20 rs2.MoveNext 21Loop 22 23rs2.Close 24 25End Sub

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

IDフィールドは数値型だとして、構文的には下記になります。

vba

1'rs2.Filter = "rs2!ID=rs1!ID-1" 2rs2.Filter = "ID=" & rs1!ID - 1

ただ、rs1 はその前で Close しているから、どちらにしてもエラーにはなります。

たぶん、やりたいことは下記ではなかろうか。

vba

1Private Sub コマンド0_Click() 2 Dim rs1 As New ADODB.Recordset 3 Dim rs2 As New ADODB.Recordset 4 5 rs2.Open "dtrim", CurrentProject.Connection 6 7 With rs1 8 .Open "fl1", CurrentProject.Connection 9 Do Until .EOF 10 rs2.Filter = "ID=" & rs1!ID - 1 11 Do Until rs2.EOF 12 Debug.Print rs2!d_buban 13 rs2.MoveNext 14 Loop 15 .MoveNext 16 Loop 17 .Close 18 End With 19 rs2.Close 20 21End Sub

別案

下記で同様の結果になります。こちらの方がシンプルかつ高速です。

vba

1Private Sub コマンド1_Click() 2 Dim rs As New ADODB.Recordset 3 4 rs.Open "SELECT d_buban FROM dtrim INNER JOIN fl1 ON dtrim.ID=fl1.ID-1;", CurrentProject.Connection 5 6 Do Until rs.EOF 7 Debug.Print rs!d_buban 8 rs.MoveNext 9 Loop 10 rs.Close 11 12End Sub

投稿2022/05/11 05:11

編集2022/05/11 05:40
hatena19

総合スコア33715

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ukana

2022/05/11 05:33

回答ありがとうございます。 .closeを消し rs2.Closeのあとに rs1.Closeに修正し 条件変更してみました。 エラー3021の BOFとEOFのいずれかがTrueになっているか 現在のレコードが削除されています。 要求された動作には現在のレコードが必要です。 とでました。 EOFがからむエラーということで変えてはみたのですが おっしゃるとおりcloseの位置が正しくないのでしょうか?
hatena19

2022/05/11 05:38

rs1でMoveNextして、EOFになっているので、その後で、 rs1!ID とIDを参照しても、当然エラーになりますね。 コードの意味を理解しましょう。 私の回答のコードを参考にして、意味を考えてみてください。
ukana

2022/05/11 05:43

返信のタイミングを誤りました。 申し訳ないです。 先ほど動作させてみたところ まさに得たい結果が出ました。 行き詰まっていたので本当に助かりました。 自身で理解できるよう、頂いたコードの意味を考えて 続きのプログラムを書いて行きたいと思います。 本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問