[[20220609150443]] 『MsgBoxでは正常動作するのに、printPreviewではう』(まひろっく) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『MsgBoxでは正常動作するのに、printPreviewではうまくいかない』(まひろっく)

【やりたいこと】
1行ごとに住所録から封筒印刷をさせたいです。
印刷するデータの出力(Function set_envelope(ByVal i As Integer))は正常動作しています。
MsgBoxでは正常動作するのに、「ws.PrintPreview」ではうまくいかない原因がわからず、プレビューでつまづいています。
処理速度関連の知識が不足している状態かと思います。ご教授いただければ幸いです。

【実行やデバッグをした結果】
ws.PrintPreviewの場合
シートに設置のボタン:2行目分のプレビュー表示まで正常動作。3行目以降はプレビュー表示されずに「完了しました」のポップアップが出現する。
F5:正常動作
F8:「ws.printPreview」行で4行分連続してプレビュー表示されたのち、「完了しました」のポップアップが出現する。

MsgBox "ここでプレビュー"の場合
シートに設置のボタン:正常動作
F5:正常動作
F8:正常動作

ws.PrintPreview→MsgBox "ここでプレビュー"の場合
シートに設置のボタン:2行目分のプレビュー表示まで正常動作。3行目以降はプレビュー・「ここでプレビュー」ともに表示されずに「完了しました」のポップアップが出現する。
F5:正常動作
F8:「ws.printPreview」行で4行分連続してプレビュー・「ここでプレビュー」を表示したのち、「完了しました」のポップアップが出現する。

【試した改善方法】
ws.printPreviewのあとにDoEventsを入れてみたが、先述のデバッグ結果と変化がなかった。


【記述したコード】

Sub print_envelope()

Dim e_row As Integer
Dim i As Integer
Dim p_flag As Byte
Dim ws As Worksheet
Dim rc As VbMsgBoxResult
Dim preview_flag As Boolean

Set ws = Worksheets("印刷面")
e_row = Cells(Rows.Count, 3).End(xlUp).Row

MsgBox "印刷を開始します"
rc = MsgBox("プレビューを使用しますか?", vbYesNo + vbDefaultButton2 + vbQuestion, "プレビューの確認")
If rc = vbYes Then

    preview_flag = True
Else
    preview_flag = False
End If

For i = 4 To e_row

 p_flag = Cells(i, 2).Value
 If p_flag = 1 Then
    Call set_envelope(i)
    If preview_flag = True Then
        'ws.PrintPreview
        MsgBox "ここでプレビュー"
    Else
        'ws.PrintOut
        MsgBox "ここでプリントアウト"
    End If
 End If

Next

MsgBox "完了しました"

End Sub

< 使用 Excel:Excel2019、使用 OS:Windows10 >


ステップ実行出来るのなら、各判定時の判定要素は問題ありませんでしたか?
(tkit) 2022/06/09(木) 16:11

実行やデバッグに使用した選択肢は、次の通りです。

プレビューを使用しますか?→「はい(Y)」
「ここでプレビュー」→「OK」
プレビュー画面→「印刷プレビューを閉じる」

選択したときにも、実行中にもエラーコードは一切表示されません。
また、デバッグで黄色く指示されることもありません。

これがtkit様のおっしゃっている判定要素への回答で大丈夫でしょうか?^^;
(まひろっく) 2022/06/09(木) 16:18


コードが各IF文で判定し、分岐していきますよね?
その際の変数の値は想定通りですか?

確認方法はステップ実行時、マウスポインタをその変数に合わせるか、
ローカルウィンドウで確認してください。

確認方法参考
https://www.tipsfound.com/vba/01010
(tkit) 2022/06/09(木) 16:26


変数の値の話ですね^^;失礼いたしました。
分岐のときの値は想定通りです。
分岐時の値や動作を確認するのに、MsgBoxでのテストをした次第です。。。
(まひろっく) 2022/06/09(木) 16:32

 >「ws.PrintPreview」ではうまくいかない
 うまくいかないとは。
(分からん) 2022/06/09(木) 16:35

分からん様の質問の意図がわかりません。
最初の記述の通りなのですが。

17時でいったん落ちます。。。返答明日以降になります。
(まひろっく) 2022/06/09(木) 16:41


 こういう時に気になるのって「別のプリンタドライバでも同じか?」ですかね。

 ↓ささやかな抵抗^^;

    Private Declare PtrSafe Sub Sleep Lib "KERNEL32.dll" (ByVal dwMilliseconds As Long)
    Sub test()
        Dim i As Long
        For i = 1 To 10
            Sheet1.PrintPreview

            Application.PrintCommunication = False
            Application.PrintCommunication = True
            DoEvents
            DoEvents
            Sleep 500

        Next
    End Sub

(白茶) 2022/06/09(木) 16:51


 >分からん様の質問の意図がわかりません。
 貴方がそう言っているではないか。
 どのようにうまくいかないかということ。
(分からん) 2022/06/09(木) 17:12

どこかで、
Application.ScreenUpdating = False
Application.ScreenUpdating = True
していますか?

フリーズやら、挙動異常があるようですよ。

(tkit) 2022/06/10(金) 08:49


白茶様
記載いただいたSubプロシージャを「挿入」→「標準モジュール」で追加・実行すればよいでしょうか?

分からん様

どのようにうまくいかないか プレビュー表示が各行ごとに表示されません。
ws.PrintPreviewが勝手に省略(?)されてしまいます。

tkit様

どこかで、 Application.ScreenUpdating = False Application.ScreenUpdating = True していますか? してません。。。
何をするための記述か、どこですればいいかもわからないので調べてみます。
(まひろっく) 2022/06/10(金) 08:55

基本的にPrintPreviewは印刷対象(セルの値等)が無いとスルーします。
そこは大丈夫でしょうか?

また、何らかの要因でPrintPreviewがスルーされるのはいいとして、
MsgBoxもスルーされるのは考えにくいです。
ロジック的にスルーされたと考えます。
怪しいポイントはCellsに対してWorkSheetを指定していないことです。
想定と違うシートのセルを参照していることも考えられます。

MsgBox "ここでプレビュー" の下に
Debug.Print i を記述し、イミディエイトウィンドウで確認しながら、
想定と同様か確認してみてください。

(tkit) 2022/06/10(金) 09:26


tkit様
MsgBoxはスルーされていません。
PrintPreviewのみが問題となっております。

1行目2行目では問題なくプレビュー画面が表示されるのですが、
ロジックが変わらない3行目4行目が表示されない原因がわかりません。

Application.ScreenUpdatingも確認できていないのでもう少々お待ちください。
別作業しながらの牛歩で申し訳ありません。
(まひろっく) 2022/06/10(金) 09:32


tkit様

For文の中に「Application.ScreenUpdating」を入れてみたところ、
プレビュー画面の表示は4回出るようになりました!

しかし、1回目の表示以外は印刷面が濃い灰色1色となってしまっていて、
プレビューの意味をなしていません(涙
1回目の表示では住所や宛名がきちんと表示されるのですが。。。

入れる場所がおかしかったのでしょうか・・・?
もう少し試してみます。


【変更したFor文の内容】

For i = 4 To e_row

 p_flag = Cells(i, 2).Value
 Application.ScreenUpdating = False

 If p_flag = 1 Then
    Call set_envelope(i)
    If preview_flag = True Then
        ws.PrintPreview
        'MsgBox "ここでプレビュー"
    Else
        'ws.PrintOut
        MsgBox "ここでプリントアウト"
    End If
 End If

 Application.ScreenUpdating = True

Next
(まひろっく) 2022/06/10(金) 09:52


「Application.ScreenUpdating」の場所をガチャガチャ移動させてたら突然解決しました!
tkit様をはじめとしますご協力いただいた皆様ありがとうございました!

解決した段階のFor文置いておきます。
誰かのなにかのたしになれば・・・。


【正常に動いているFor文の内容】

For i = 4 To e_row

 p_flag = Cells(i, 2).Value
 Application.ScreenUpdating = False

 If p_flag = 1 Then
    Call set_envelope(i)
    If preview_flag = True Then

        Application.ScreenUpdating = True
        ws.PrintPreview
    Else
        Application.ScreenUpdating = True
        'ws.PrintOut
        MsgBox "ここでプリントアウト"
    End If
 End If

Next
(まひろっく) 2022/06/10(金) 10:34


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.