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

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

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

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

Access

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

Q&A

解決済

1回答

297閲覧

QueryDefのparameters記述を省略したい

退会済みユーザー

退会済みユーザー

総合スコア0

VBA

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

Access

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

0グッド

0クリップ

投稿2023/05/22 05:26

実現したいこと

同じparametersの記述が複数回あるので、1つにまとめて読みやすくしたい

前提

クリック時イベントで、いくつかのパラメータクエリをExcelにエクスポートし、表に整形するフォームを作成しています。

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

エクスポートする5つのクエリのうち4つがパラメータクエリで、4つとも抽出条件が同じです。set qdfする度に同じ.parametersを記述しているので可読性・メンテナンス性に欠けると感じました。

該当のソースコード

Private Sub 出力_Click() Dim dbs As Database Dim qdf As QueryDef Dim rst As Recordset Dim xls As Object Const xlUp = -4162 Const xlToLeft = -4159 Const xlCellTypeBlanks = 4 Set dbs = CurrentDb Set xls = CreateObject("Excel.Application") With xls .ScreenUpdating = False .Workbooks.Open "フルパス¥実績.xlsx" Set rst = dbs.OpenRecordset("Q選択クエリ")    中略 Set qdf = dbs.QueryDefs("Qパラメータクエリ1") With qdf .parameters("[Forms]![F6_1出力]![集計開始年月]") = [Forms]![F6_1出力]![集計開始年月] .parameters("[Forms]![F6_1出力]![集計終了年月]") = [Forms]![F6_1出力]![集計終了年月] Set rst = .OpenRecordset End With    中略 Set qdf = dbs.QueryDefs("Qパラメータクエリ2") With qdf .parameters("[Forms]![F6_1出力]![集計開始年月]") = [Forms]![F6_1出力]![集計開始年月] .parameters("[Forms]![F6_1出力]![集計終了年月]") = [Forms]![F6_1出力]![集計終了年月] Set rst = .OpenRecordset End With    中略 Set qdf = dbs.QueryDefs("Qパラメータクエリ3") With qdf .parameters("[Forms]![F6_1出力]![集計開始年月]") = [Forms]![F6_1出力]![集計開始年月] .parameters("[Forms]![F6_1出力]![集計終了年月]") = [Forms]![F6_1出力]![集計終了年月] Set rst = .OpenRecordset End With    中略 Set qdf = dbs.QueryDefs("Qパラメータクエリ4") With qdf .parameters("[Forms]![F6_1出力]![集計開始年月]") = [Forms]![F6_1出力]![集計開始年月] .parameters("[Forms]![F6_1出力]![集計終了年月]") = [Forms]![F6_1出力]![集計終了年月] Set rst = .OpenRecordset End With    中略 .ScreenUpdating = True .Visible = True End With Set xls = Nothing End Sub

試したこと

Function parameters() With qdf .parameters("[Forms]![F6_1出力]![集計開始年月]") = [Forms]![F6_1出力]![集計開始年月] .parameters("[Forms]![F6_1出力]![集計終了年月]") = [Forms]![F6_1出力]![集計終了年月] Set rst = .OpenRecordset End With Private Sub 出力_Click() 中略 Set qdf = dbs.QueryDefs("Qパラメータクエリ1") Call parameters 中略 Set qdf = dbs.QueryDefs("Qパラメータクエリ2") Call parameters 中略 Set qdf = dbs.QueryDefs("Qパラメータクエリ3") Call parameters 中略 Set qdf = dbs.QueryDefs("Qパラメータクエリ4") Call parameters 中略 End Sub

コード内で記述が重複している部分をFunctionで括れないかと思いこのように記述してみましたが、「変数が定義されていません」と構文エラーが発生しました。
そもそもFunctionで括るという考え自体が間違っているのか、記述を圧縮する方法はあるのか等ご意見を頂きたいです、よろしくお願い致します。

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

MicrosoftAccess2019

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

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

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

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

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

guest

回答1

0

ベストアンサー

参照渡し(ByRef)でQueryDefとOpenRecordsetを引数にしてSubプロシージャに渡せばいいでしょう。
(オブジェクトは基本参照渡しになるのでByRefはなくてもいいと思いますが)

vba

1Sub SetParameters(ByRef qdf As QueryDef, ByRef rst As Recordset) 2 With qdf 3 .parameters("[Forms]![F6_1出力]![集計開始年月]") = [Forms]![F6_1出力]![集計開始年月] 4 .parameters("[Forms]![F6_1出力]![集計終了年月]") = [Forms]![F6_1出力]![集計終了年月] 5 Set rst = .OpenRecordset 6 End With 7End Sub 8 9Private Sub 出力_Click() 10 11 Dim dbs As Database 12 Dim qdf As QueryDef 13 Dim rst As Recordset 14 Dim xls As Object 15 16 Const xlUp = -4162 17 Const xlToLeft = -4159 18 Const xlCellTypeBlanks = 4 19 20 Set dbs = CurrentDb 21 Set xls = CreateObject("Excel.Application") 22 With xls 23 .ScreenUpdating = False 24 .Workbooks.Open "フルパス\実績.xlsx" 25 26 Set rst = dbs.OpenRecordset("Q選択クエリ") 27 28 '中略 29 30 Set qdf = dbs.QueryDefs("Qパラメータクエリ1") 31 SetParameters qdf, rst 32 33 '中略 34 35 Set qdf = dbs.QueryDefs("Qパラメータクエリ2") 36 SetParameters qdf, rst 37 38 '中略 39 40 Set qdf = dbs.QueryDefs("Qパラメータクエリ3") 41 SetParameters qdf, rst 42 43 '中略 44 45 Set qdf = dbs.QueryDefs("Qパラメータクエリ4") 46 SetParameters qdf, rst 47 48 '中略 49 50 .ScreenUpdating = True 51 .Visible = True 52 End With 53 Set xls = Nothing 54 55End Sub

投稿2023/05/22 06:37

hatena19

総合スコア33715

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

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

退会済みユーザー

退会済みユーザー

2023/05/22 07:31

無事に記述の圧縮できました! 仕組みも勉強してみます ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問