Access (VBA)

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

 
(Windows 10 Home : Access 2016)
レポートビューにデータを反映させて開く
投稿日時: 19/03/15 09:10:39
投稿者: masunona

フォームに入力した内容をレポートに反映させ,
ボタンクリクすると,レポートビューで開いて内容を確認のうえ印刷,
というVBAを作りたいです。
 
DoCmd.OpenReport "form", acViewReport, "", "", acNormal
 
If vbOK = MsgBox("内容がよろしければ印刷します", vbOKCancel) Then---★
            '***レポートをプリントアウト***
            DoCmd.RunCommand acCmdPrint
 
        Else
            MsgBox "印刷処理を中止しました", vbCritical
 
            '***レポートを閉じ入力画面に戻る***
            DoCmd.Close acReport, "form", acSaveYes
            End If
 
End Sub
 
これだと,最後に印刷を終えたタイミングにならないと,
レポートビューにデータが反映されません。
 
レポートの「開く時」イベントに「★」以下を入れてみても,
やはりレポートが開いてデータが反映される前に
「内容がよろしければ印刷します」のメッセージボックスが出てしまいます。
 
どのように修正したらいいでしょうか。
 

回答
投稿日時: 19/03/15 10:27:44
投稿者: sk

引用:
フォームに入力した内容をレポートに反映させ,
ボタンクリクすると,レポートビューで開いて内容を確認のうえ印刷

そのフォームとレポートのレコードソースは
同じテーブル/クエリである、ということでしょうか。
 
引用:
これだと,最後に印刷を終えたタイミングにならないと,
レポートビューにデータが反映されません。

フォームのカレントレコードがまだ編集中(保存されていない)だからでは。
 
引用:
DoCmd.OpenReport "form", acViewReport, "", "", acNormal

DoCmd.RunCommand acCmdSaveRecord
DoCmd.OpenReport "form", acViewReport, "", "", acNormal

投稿日時: 19/03/18 15:27:59
投稿者: masunona

sk さま
 
お返事いただきありがとうございます。
 
フォームAに氏名,住所等のフィールドがあり,

「開く」ボタンをクリックすると

フォームBの各テキストボックスに氏名や住所等が初期値として反映され,
(Forms!フォームB.テキスト1.DefaultValue = "[氏名]" 等)
その他空欄のテキストボックスに都度文字を手入力等する

「印刷」ボタンをクリックすると,
フォームBの入力内容が反映されるレポートが開く
 
という仕組みです。
 
教えていただいたようにコードを追記したら
「コマンドまたはアクション'レコードの保存'は無効です。」
と出てしまいました。
 
修正方法等教えていただけないでしょうか?
 
よろしくお願い致します。

回答
投稿日時: 19/03/18 16:06:55
投稿者: sk

引用:
フォームAに氏名,住所等のフィールドがあり,

引用:
フォームBの各テキストボックスに氏名や住所等が初期値として反映され

引用:
フォームBの入力内容が反映されるレポートが開く

それらのフォームとレポートのレコードソースは
同じテーブル/クエリである、ということでしょうか。
 
引用:
フォームBの各テキストボックスに氏名や住所等が初期値として反映され,
(Forms!フォームB.テキスト1.DefaultValue = "[氏名]" 等)
その他空欄のテキストボックスに都度文字を手入力等する

それとも、[フォームB]は非連結フォームなのでしょうか。
 
引用:
「印刷」ボタンをクリックすると,
フォームBの入力内容が反映されるレポートが開く

[印刷]ボタンは[フォームA]と[フォームB]のどちらに
配置されているのでしょうか。
 
引用:
DoCmd.RunCommand acCmdSaveRecord

引用:
教えていただいたようにコードを追記したら
「コマンドまたはアクション'レコードの保存'は無効です。」
と出てしまいました。

例えば、「フォームのレコードソースが編集不可のクエリである」
「[レコードセット]プロパティが「スナップショット」に設定されている」など、
レコードを編集できないタイプの連結フォームに対して
実行しているからではないでしょうか。

投稿日時: 19/03/18 16:45:00
投稿者: masunona

sk さま
 
説明不足で申し訳ありません。
フォームBは非連結フォームです。
 
「印刷」ボタンはフォームBに配置しています。
 
フォームBのレコードセットは「ダイナセット」です。
 
レポートにもレコードソースは無く,
配置しているテキストボックスに,すべて
「=Forms!フォームB![氏名]」
等としてデータを反映させています。
 
レポートを印刷プレビューで開くと,開いた時点でデータが反映されているのですが,
できればレポートビューで開きたいです。
 
「印刷」ボタンを押したあと,
印刷後でないとデータが反映されないのですが,
印刷自体は,データが反映された状態で出来ます。
 
またお気づきの点ありましたら教えてください。
よろしくお願い致します。
 

回答
投稿日時: 19/03/18 20:38:19
投稿者: sk

引用:
フォームBは非連結フォームです。

引用:
「印刷」ボタンはフォームBに配置しています。

引用:
レポートにもレコードソースは無く
配置しているテキストボックスに,すべて
=Forms!フォームB![氏名]
等としてデータを反映させています。

この仕組みの場合、[フォームA]側の処理は
直接関わってきませんよね。
 
引用:
If vbOK = MsgBox("内容がよろしければ印刷します", vbOKCancel) Then

引用:
これだと,最後に印刷を終えたタイミングにならないと,
レポートビューにデータが反映されません

その MsgBox 関数を呼び出さなければ
正常に表示されるはず。
 
恐らく、レポート[form]上に配置されている
各演算テキストボックスの演算処理と描画処理が
完了する前に MsgBox 関数を呼び出しているから
でしょうね。
( VBA のコードが中断されるのと同じように、
メッセージボックスの表示中はそれらの処理も
中断されている)
 
引用:
レポートの「開く時」イベントに「★」以下を入れてみても,
やはりレポートが開いてデータが反映される前に
「内容がよろしければ印刷します」のメッセージボックスが出てしまいます。

そのイベントで実行しても、結局は同じことになるでしょう。
 
非連結レポートや演算テキストボックスを使用するのではなく、
連結レポートと連結テキストボックスを使用されることを
お奨めします。

投稿日時: 19/03/19 09:51:33
投稿者: masunona

sk さま
 
>MsgBox 関数を呼び出さなければ正常に表示される
 
おっしゃるとおりです。
 
>各演算テキストボックスの演算処理と描画処理が
>完了する前に MsgBox 関数を呼び出している
 
こういったことがまったくわからずに作業していました。
 
いまの構造だと不可能であることがわかりました。
>連結レポートと連結テキストボックスを使用
など,根本から作り直しを考えます。
 
丁寧に教えていただきありがとうございました!