Microsoft Access 掲示板

レポートを開くプロシージャについて

5 コメント
98 views
4 フォロー

いつも大変お世話になっています。今回はプロシージャについてです。
売上実績期間(年月・日付)を設定するフォームがあり、それに色々なカテゴリー別のレポートを開くボタンを複数配置してます。それのコードは下記です。
        Dim cuDt1 As Variant, cuDt2 As Variant, urDt1 As Variant, urDt2 As Variant
        Dim stArgs1 As Variant, stArgs2 As Variant, rptName As String

        cuDt1 = Me.[cb売上年月Fr] & "/01"
        cuDt2 = CDate(Me.[cb売上年月To] & "/01")
        cuDt2 = DateSerial(Year(cuDt2), Month(cuDt2) + 1, 0)
        urDt1 = Me.[cb売上日付Fr]
        urDt2 = Me.[cb売上日付To]

        stArgs1 = "※指定期間: " & cuDt1 & "~" & cuDt2
        stArgs2 = "★指定期間: " & urDt1 & "~" & urDt2

        rptName = "●●●"

        If IsNull(urDt2) Then
           DoCmd.OpenReport rptName, acViewPreview, OpenArgs:=stArgs1
        ElseIf Not IsNull(urDt2) Then
           DoCmd.OpenReport rptName, acViewPreview, OpenArgs:=stArgs2
        End If
●●● は各レポート名
各ボタンにこれを記述してますが、プロシージャにしてそれをCallで呼び出す事が出来るのではと思ってますが、どの様にしたらいいのか分からないのです。値やりとりするプロシージャが今ひとつ理解できていないのもので。レポート名をプロシージャにどうやって渡す事が出来るのでしょうか? 宜しくお願いします。

beginner
作成: 2025/01/29 (水) 08:58:55
通報 ...
1

各ボタンのコードがレポートのみの異なるだけであとは同じなので、一つのプロシージャにまとめたいということでしょうか。

レポート名は引数で渡せばいいでしょう。「引数ってなに?」というレベルなら下記あたりを参照してください。

第29話「引数と戻り値ってなに?」1/4:引数とは…?|VBAとの出会い編|VBAエキスパートコラム

フォームモジュール

Sub PreviewReport(rptName As String)
    Dim cuDt1 As Variant, cuDt2 As Variant, urDt1 As Variant, urDt2 As Variant
    Dim stArgs1 As Variant, stArgs2 As Variant

    cuDt1 = Me.[cb売上年月Fr] & "/01"
    cuDt2 = CDate(Me.[cb売上年月To] & "/01")
    cuDt2 = DateSerial(Year(cuDt2), Month(cuDt2) + 1, 0)
    urDt1 = Me.[cb売上日付Fr]
    urDt2 = Me.[cb売上日付To]

    stArgs1 = "※指定期間: " & cuDt1 & "~" & cuDt2
    stArgs2 = "★指定期間: " & urDt1 & "~" & urDt2

    If IsNull(urDt2) Then
        DoCmd.OpenReport rptName, acViewPreview, OpenArgs:=stArgs1
    ElseIf Not IsNull(urDt2) Then
        DoCmd.OpenReport rptName, acViewPreview, OpenArgs:=stArgs2
    End If
End Sub

Private Sub コマンド1_Click()
    Call PreviewReport("●●●")
End Sub

ご自身のコードと見比べればどこが変更されてるか一目だとおもいます。

2

引数の使い方が理解できたなら、
イベントプロシージャでCallで呼び出すのではなく、
フォームのデザインビューでイベントプロシージャに関数を設定して呼び出す方法も習得しておくといいでしょう。

Function PreviewReport(rptName As String)
    Dim cuDt1 As Variant, cuDt2 As Variant, urDt1 As Variant, urDt2 As Variant
    Dim stArgs1 As Variant, stArgs2 As Variant

    cuDt1 = Me.[cb売上年月Fr] & "/01"
    cuDt2 = CDate(Me.[cb売上年月To] & "/01")
    cuDt2 = DateSerial(Year(cuDt2), Month(cuDt2) + 1, 0)
    urDt1 = Me.[cb売上日付Fr]
    urDt2 = Me.[cb売上日付To]

    stArgs1 = "※指定期間: " & cuDt1 & "~" & cuDt2
    stArgs2 = "★指定期間: " & urDt1 & "~" & urDt2

    If IsNull(urDt2) Then
        DoCmd.OpenReport rptName, acViewPreview, OpenArgs:=stArgs1
    ElseIf Not IsNull(urDt2) Then
        DoCmd.OpenReport rptName, acViewPreview, OpenArgs:=stArgs2
    End If
End Function

SubをFunctionに変更しただけです。
フォームのデザインビューで「クリック時」プロパティに下記のように設定します。

=PreviewReport("●●●")

ボタン毎にイベントプロシージャを記述する必要がなく、Functionを作成しておけばフォームのデザインビューの設定で済みます。
私のはこの方法を多用してます。

3
beginner 2025/01/30 (木) 08:30:07 61dd6@7c1a3

hatenaさん ありがとうございます。これで1つにまとめる事が出来ました。
引数の事も大体理解できました。関数の()内と同じなのですね。Functionも使いこなす事が出来たら便利ですね。別で関数にしたい事があり、これはまたいずれ投稿したいと思ってます。
この関連で別内容なのですがレポート開くイベントにOpenArgsをレポートの非連結のテキストボックスに代入しようとすると代入出来ないエラーとなります。ラベルには代入できます(表示だけなのでそれでもOKですが)。それは何故なのでしょうか?
ラベル代入は下記コードです(これならエラーでません)。
  Dim kikan As String
    kikan = Nz(Me.OpenArgs, "")
    Me.[label_kikan].Caption = kikan

4
hatena 2025/01/30 (木) 11:00:30 修正

レポートの「開く時」イベントでは、デザインビューで設定できるプロパティのみ代入できます。
Valueプロパティには代入できません。

対策としては、ControlSourceプロパティに式として代入する。

Private Sub Report_Open(Cancel As Integer)
    Dim kikan As String
    kikan = Nz(Me.OpenArgs, "")
    Me.[text_kikan].ControlSource = "='" & kikan & "'"
End Sub

=や引用符を付加する必要があります。

「読み込み時」イベントならValueプロパティに代入できます。こちらのほうがシンプルですね。

Private Sub Report_Load()
    Dim kikan As String
    kikan = Nz(Me.OpenArgs, "")
    Me.[text_kikan].Value = kikan
End Sub

VBAを使わなくても、デザインビューでテキストボックスのコントロールソースでOpenArgsを参照することもできます。

=Nz([OpenArgs],"")

Report.OpenArgs プロパティ (Access) | Microsoft Learn

5
beginner 2025/01/30 (木) 12:58:38 61dd6@7c1a3

hatenaさん ありがとうございます。
「開く時」「読み込み時」はCancel以外で出来る事が違うとは知りませんでした。大変勉強になります。
今回もお世話になり大変有り難うございました。