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

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

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

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

Access

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

Q&A

解決済

1回答

11364閲覧

AccessVBAでパラメータクエリから取得したRecordsetをデータシートに表示する方法

JanTh1989

総合スコア87

VBA

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

Access

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

0グッド

0クリップ

投稿2019/07/12 04:09

AccessVBAで、サブフォーム(データシート)を開くときに、パラメータクエリにパラメータ設定で全データ取得したRecordsetを、データシートに表示しようとして、以下のコードで実行してみましたが、データが表示されませんでした。

サンプルコード

VBA

1Private Sub Form_Load() 2 Dim dbs As Database 3 Dim qd As QueryDef 4 Dim rs As Recordset 5 6 Set dbs = CurrentDb 7 Set qd = dbs.QueryDefs("Q_ViewData") 8 9 With qd 10 .Parameters("[名前]") = "" 11 12 Set rs = .OpenRecordset 13 End With 14 15 Set Me.Recordset = rs 16 17 rs.Close 18 Set rs = Nothing 19 20End Sub

クエリ構造:Q_ViewData

フィールド:ID,名前,性別,年齢 テーブル:m_alldata,m_alldata,s_subdata,m_subdata 並べ替え:昇順 表示:全チェック 抽出条件:,"[名前]"または"[名前] is Null",,

「Set Me.Recordset = rs」時点では、rsにはレコードが入っています。
また、「rs.Close」をブレイクで止めてみたところ、データシートに行自体は作成(値は入っていませんが)されていましたが、その後行は消えて空になりました。

※サブフォームについては、レコードソースを設定していません。
サブフォームのデータは、メインフォームで「パラメータ入力⇒検索ボタンクリック」といった流れで、検索結果データに表示更新します。
レコードソースでパラメータクエリを設定すると、パラメータ入力を示唆されたため、紐づけをしませんでした。

以下の可能性を考えていますが、実際のところどうなのかが判断できていない状況です。
・サブフォーム内でフィールドが設定されていないため。
・Loadイベント後に何かしらのイベントで消されているため。

要変更、処理不足などございましたら、ご教授お願い致します。

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

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

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

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

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

guest

回答1

0

ベストアンサー

「Set Me.Recordset = rs」時点では、rsにはレコードが入っています。
また、「rs.Close」をブレイクで止めてみたところ、データシートに行自体は作成(値は入っていませんが)されていましたが、その後行は消えて空になりました。

フォームに関連付けられたレコードセットを閉じてしまえば、フォームに表示されないのは、当然ですよね。
rs.Close しなくても、rs変数はプロシージャレベルの変数ですので、プロシージャを抜ければ自動で閉じてしまうので、やはり表示されません。

vba

1 Dim dbs As Database 2 Dim rs As Recordset

の変数宣言は、フォームモジュールの先頭(宣言部)へ移動させてください。
(モジュールレベルの変数になりますの、フォームか開いている間は有効)
そして、rs.Close は、フォームの閉じるときのイベントに移動させてください。


ただし、

レコードソースでパラメータクエリを設定すると、パラメータ入力を示唆されたため、紐づけをしませんでした。

を解決するための方法としてはよい方法とは思えません。この方法はいろいろと制限かありますので。

フォームのレコードソースには、テーブル(または抽出条件を設定していないクエリ)を設定しておいて、
抽出はフォームのFilterプロパティで設定する方か自由度が高いです。

投稿2019/07/12 04:44

編集2019/07/12 05:24
hatena19

総合スコア34064

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

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

JanTh1989

2019/07/12 05:35

回答ありがとうございました。 フィールド変数に変えてみたところ、思っていた結果にはなりました。 (列は予めデザインビューで作らないといけなさそうですが・・・) >フォームのレコードソースには、テーブル(または抽出条件を設定していないクエリ)を設定しておいて、 >抽出はフォームのFilterプロパティで設定する方か自由度が高いです。 仰る通りだとは思います。 ただ、質問では挙げていませんでしたが、検索機能以外にも、更新、追加機能の実装も予定しています。 この更新、追加は、データシート内の変更時点では、更新、追加は行わず、登録ボタンをクリックしたら変更箇所を反映という動きが望ましいそうなのです。 そのため、入力はできるが、更新はしない、という構図になる必要が出てきた兼ね合いもあり、データシートは非連結にしなければならないのでは、という考えとなりました。 元々の質問内容からはズレてしまい恐縮なのですが、入力はしないがDBに反映はしない、といった動きをレコードソース設定のFilterプロパティ管理なデータシートで行うことは可能なのでしょうか。
JanTh1989

2019/07/12 05:54 編集

以下のような方法を再検討しましたがいかがでしょうか? ①フォームのレコードソースは非パラメータのクエリ設定で、抽出はフィルタ管理 ②更新・追加は随時して、対象レコードを内部で保管と、フィールド変数の変更フラグ立て ③登録ボタンクリックでフィールド変数フラグクリア ④フォーム閉じイベントで変更フラグが立っていたら、保管している対象レコードに戻す こういったものなら実現性が出てくるだろうか、と思っているのですが、いかがでしょうか。
hatena19

2019/07/12 07:28

連結フォームでは、1レコード単位でしか、更新管理はできません。 1レコード更新して、レコード移動したら、その時点で更新はテーブルに反映されてしまう。 そういう仕様です。(Recorset にレコードセットを設定しても連結には変わりありません。) サブフォームはデータシートビューとのことなので、やりたいことは、サブフォームに表示されている全レコードに対して、更新ボタンをクリックしたときに、初めてテーブルに反映させたいのだと推測しますが、あってますか。 だとしたら、下記のような運用が一般的です。 ワークテーブルを用意して、フォームはワークテーブルと連結します。 追加クエリで更新対象のレコードをワークテーブルに追加します。 フォームで更新して、更新ボタンを押したときに、更新クエリで元のテーブルを更新します。
JanTh1989

2019/07/12 09:16

>サブフォームはデータシートビューとのことなので、やりたいことは、サブフォームに表示されている全レコードに対して、更新ボタンをクリックしたときに、初めてテーブルに反映させたいのだと推測しますが、あってますか。 ⇒その認識であっています。 まさにその動きをしたいと思っています。 >ワークテーブルを用意して、フォームはワークテーブルと連結します。 >追加クエリで更新対象のレコードをワークテーブルに追加します。 >フォームで更新して、更新ボタンを押したときに、更新クエリで元のテーブルを更新します。 ⇒追加クエリについては、勉強不足でした。 そういった方法もあるのですね。 運用が一般的、とのことですので、その方法で検討してみます。
JanTh1989

2019/07/18 07:48

別業務などもあり、時間がかかってしまいましたが、挙げられたワークテーブル作成の方法で対応ができました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問