Access (VBA)

Access VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(指定なし : 指定なし)
複数レポートのフォーマットイベント処理をひとつにまとめる方法
投稿日時: 21/06/18 17:02:44
投稿者: だいふくもち

いつもこちらのコミュニティにはお世話になっております。
現在、請求書を出力するためのシステムをAccessで作成しているのですが、
行き詰まってしまった部分があり、ご経験者様のお知恵をお借りしたく質問させていただきました。
 
最終的な目標は、VBAで書かれたレポートのイベント(Report_Open、レポートヘッダー_Format)を
callステートメントを用いて、他のレポートでも使用することです。
 
その処理が必要になった背景ですが、
データ登録フォームに、最終的にどのように請求書に値が入力されるかを確認するため、
請求書(レポート)の印刷プレビューのコマンドボタンを設けました。
 
これを押すことにより、登録フォームで選択したひな型の種類に応じたレポートを開き、
フォームの値を引数に代入し、その引数をレポート側に渡すことで、
その値に応じてレポート上のコントロールを表示/非表示し、請求日を入力するようにしております。
 
現在、デザインの異なる請求書(レポート)が2種類存在しているのですが、
フォームから渡さなければならない値や処理はすべて同じです。
(レポートにはレコードソースを設定しておらず、登録フォームから直接値を取得するようにしております)
 
しかし、両方のレポートのVBEに同じコードを書いている状態なので、
修正が発生した場合、両方をそれぞれ書き換える必要があります。
そこで、ひとつのレポートでpublic subに処理を書き、もう片方ではcallステートメントで
呼び起こせるようにしようと思うのですが、登録フォームからレポート側に渡した
引数をどのように処理すればできるのかが分かりません…
 
どなたか良い方法をご存じの方がいらっしゃいましたらご教授いただけませんでしょうか?
 
登録フォーム側
*請求書プレビューボタン

With Me.S_登録の請求書作成サブフォーム.Form
    Dim strOpenArgs As String
    strOpenArgs = Nz(![賃貸借期間_開始], 0) & "," & Nz(![契約期間_開始], 0)& "," & Nz(![請求日], 0)
End With

'[レポートの種類]フィールドのレコード値に応じてレポートを開く(通常/税表記なし)
If Me.S_登録の請求書作成サブフォーム.Form![レポート種類] = "宛名のみ(税表記なし)" Then
    DoCmd.OpenReport "R_請求書テンプレート_税表記なし", acViewPreview, , , , strOpenArgs
Else
    DoCmd.OpenReport "R_請求書テンプレート", acViewPreview, , , , strOpenArgs
End If

 
*請求書テンプレート側(レポート側)
Private Sub Report_Open(Cancel As Integer)

'フォームから受け取った合体した値を分解し(0)から順に代入する
Dim v As Variant
v = Split(Nz(Me.OpenArgs), ",")

If v(0) = 0 Then '賃貸借期間
    Me.lbl賃貸借期間.Visible = False
End If
.
.
.

 
Private Sub レポートヘッダー_Format(Cancel As Integer, FormatCount As Integer)

v = Split(Nz(Me.OpenArgs), ",")
'請求日が「10日」もしくは「20日」だった場合
If v(2) = "10日" Or v(2) = "20日" Then '請求日
    If Left(printMonth, 1) = "0" Then
        Me.txt請求日 = printYear & "年" & Right(printMonth, 1) & "月" & v(2)
    Else
        Me.txt請求日 = printYear & "年" & printMonth & "月" & v(2)
    End If
.
.
.

 
どうぞよろしくお願いいたします。
不備や説明不足がございましたら、大変お手数をお掛けしますが教えていただけますと幸いです。

回答
投稿日時: 21/06/18 18:24:24
投稿者: sk

引用:
With Me.S_登録の請求書作成サブフォーム.Form
    Dim strOpenArgs As String
    strOpenArgs = Nz(![賃貸借期間_開始], 0) & "," & Nz(![契約期間_開始], 0)& "," & Nz(![請求日], 0)
End With

引用:
DoCmd.OpenReport "R_請求書テンプレート_税表記なし", acViewPreview, , , , strOpenArgs

[賃貸借期間_開始]、[契約期間_開始]、[請求日]の値をレポートのどこかに表示する、
または何らかの計算に用いることを目的とされているのであれば、無理に OpenArgs を
仲介させなくても充分可能なのではないでしょうか。
 
引用:
If v(0) = 0 Then '賃貸借期間
    Me.lbl賃貸借期間.Visible = False
End If

[lbl賃貸借期間]は v(0) の値(元は[賃貸借期間_開始]の値)を返すための
非連結テキストボックスの見出しとして配置されたラベルでしょうか。
 
引用:
If Left(printMonth, 1) = "0" Then
    Me.txt請求日 = printYear & "年" & Right(printMonth, 1) & "月" & v(2)
Else
    Me.txt請求日 = printYear & "年" & printMonth & "月" & v(2)
End If

printYear と printMonth が変数であるとして、
 
・これらの変数はどのモジュールのどこで宣言されているのか。
 
・これらの変数にはどのイベントにおいてどのような値が代入されているのか。
 
引用:
最終的な目標は、VBAで書かれたレポートのイベント(Report_Open、レポートヘッダー_Format)を
callステートメントを用いて、他のレポートでも使用することです。

引用:
現在、デザインの異なる請求書(レポート)が2種類存在しているのですが、
フォームから渡さなければならない値や処理はすべて同じです。

今のところの印象は、「そもそもレポートの部分に関しては VBA を使わなくても
実現可能な問題であるようなので、まずはもっと楽にデザインできる手法が
ないかどうかを検討した方がよいのではないか」といったところ。 

投稿日時: 21/06/23 09:29:17
投稿者: だいふくもち

>sk様
ご回答いただきありがとうございます!
そして回答が遅くなってしまい申し訳ありません…
sk様のお話を伺って、どうするべきか色々と検討しておりました。
 
ご配慮いただき大変申し訳ないのですが、まずは大元の情報の方を見直し、
アドバイス通りレポート側をもっと簡単にデザインできるようにしてみたいと思います。
VBAを少しずつ使えるようになり、あれもこれもやってみようと意気込んでいた部分もありましたが、
後々のメンテナンス等のことを考えると、やはりシンプルな方が大事だなと気づかされました…
 
この度はアドバイスいただき本当にありがとうございました!