[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『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 >
プレビューを使用しますか?→「はい(Y)」
「ここでプレビュー」→「OK」
プレビュー画面→「印刷プレビューを閉じる」
選択したときにも、実行中にもエラーコードは一切表示されません。
また、デバッグで黄色く指示されることもありません。
これがtkit様のおっしゃっている判定要素への回答で大丈夫でしょうか?^^;
(まひろっく) 2022/06/09(木) 16:18
確認方法はステップ実行時、マウスポインタをその変数に合わせるか、
ローカルウィンドウで確認してください。
確認方法参考
https://www.tipsfound.com/vba/01010
(tkit) 2022/06/09(木) 16:26
>「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
フリーズやら、挙動異常があるようですよ。
(tkit) 2022/06/10(金) 08:49
分からん様
どのようにうまくいかないか プレビュー表示が各行ごとに表示されません。
ws.PrintPreviewが勝手に省略(?)されてしまいます。
tkit様
どこかで、 Application.ScreenUpdating = False Application.ScreenUpdating = True していますか? してません。。。
何をするための記述か、どこですればいいかもわからないので調べてみます。
(まひろっく) 2022/06/10(金) 08:55
また、何らかの要因でPrintPreviewがスルーされるのはいいとして、
MsgBoxもスルーされるのは考えにくいです。
ロジック的にスルーされたと考えます。
怪しいポイントはCellsに対してWorkSheetを指定していないことです。
想定と違うシートのセルを参照していることも考えられます。
MsgBox "ここでプレビュー" の下に
Debug.Print i を記述し、イミディエイトウィンドウで確認しながら、
想定と同様か確認してみてください。
(tkit) 2022/06/10(金) 09:26
1行目2行目では問題なくプレビュー画面が表示されるのですが、
ロジックが変わらない3行目4行目が表示されない原因がわかりません。
Application.ScreenUpdatingも確認できていないのでもう少々お待ちください。
別作業しながらの牛歩で申し訳ありません。
(まひろっく) 2022/06/10(金) 09:32
For文の中に「Application.ScreenUpdating」を入れてみたところ、
プレビュー画面の表示は4回出るようになりました!
しかし、1回目の表示以外は印刷面が濃い灰色1色となってしまっていて、
プレビューの意味をなしていません(涙
1回目の表示では住所や宛名がきちんと表示されるのですが。。。
入れる場所がおかしかったのでしょうか・・・?
もう少し試してみます。
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
解決した段階の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.