none
excelvbaのプレビューで画面が見えない現象が発生します。 RRS feed

  • 質問

  • 皆様いつもお世話になっております。

    ExcelのVBAでワークシートの印刷プレビューを行った際に

    プレビュー画面がうまく表示されません。

    そのまま印刷するときちんと印刷されますが、何が原因かお分かりになられる方

    ご教授お願いいたします。

    2019年5月30日 3:57

回答

  • minmin312様

    ありがとうございます。

    とりあえずそれで対応したいと思います。ありがとうございました。

    • 回答としてマーク qoo_man 2019年6月28日 2:58
    2019年6月28日 2:58

すべての返信

  • qoo_manさん、こんにちは。

    プレビューを表示する場合、PrintPreviewメソッドとPrintOutメソッドがありますが、どちらをどのように使われているでしょうか?スクリプトを明示していただけるとよろしいかと…。

    と思いましたが、どちらも使って試してみても、なかなかこのような症状を再現できませんでした。
    無理にvbaを組んでこのようなプレビュー画面を作ろうと思えば作れますが、それであればqoo_mainさんが投稿されるわけはないのだから、変ですね。プレビューに関連するシステムファイル(どれかは存じません。)の不具合とかでしょうか。
    2019年5月30日 6:37
  • VBAではなく通常の操作でも表示されないのでしょうか?
    とりあえずプリンターやディスプレイのドライバーが最新で適切なものかを確認されてみてはいかがでしょうか?

    ★良い回答には質問者は回答済みマークを、閲覧者は投票を!

    2019年5月30日 7:17
    モデレータ
  • qoo_manさん、こんにちは。

    プレビューを表示する場合、PrintPreviewメソッドとPrintOutメソッドがありますが、どちらをどのように使われているでしょうか?スクリプトを明示していただけるとよろしいかと…。

    蛇足ですが Application.CommandBars.ExecuteMso "PrintPreviewFullScreen" でも
    同様のことができますね。

    VBAではなく通常の操作でも表示されないのでしょうか?
    とりあえずプリンターやディスプレイのドライバーが最新で適切なものかを確認されてみてはいかがでしょうか?

    trapemiya さんが書かれているようにまずは、通常のコマンド実行でも再現するかどうかを
    テストしてその結果も報告してください。
    通常のコマンド実行でも同様なら VBA の問題ではなく別のところに問題があると思われます。
    ちなみに、デフォルトではリボンにこのコマンドがないのでリボンやクイックアクセスツールバーに
    印刷プレビュー (全画面表示) (PrintPreviewFullScreen) コマンドを追加してください。

    2019年5月30日 11:40
  • qoo_manさん、こんばんは。

    いろいろ試していて、ちょこっと再現できたので報告します。

    ActiveSheet.PrintPreview でも、  ActiveSheet.PrintOut preview:=True でも、  Application.CommandBars.ExecuteMso "PrintPreviewFullScreen" でも同じでした。

    プレビューが表示された際に、プレビューウィンドウの枠をドラッグして大きさを大きくしたり小さくしたり変更すると、大きさが大きくなったり小さくなったりの動作に応じてちらちらと小刻みに再描画がされますが、その合間に、掲載されたような灰色の長方形の画像がちらちらと表示されます。ただし、ちらちらと表示されますが、停止すれば、正しく表示されます。

    推測するに、プレビュー画像の描画プロセスで何らかのエラーが生じているように思われます。

    2019年5月30日 12:35
  • kokemomoyamamomo様

        Set wrksht = Worksheets("□")
        Set wrksht2 = Worksheets("●●●")

    データセット部分

     wrksht2.Range("AR1").Value =wrksht.Range("AR1").Value

        wrksht2.Visible = xlSheetVisible
        wrksht2.PrintPreview        ←これはきちんと出ます。
        wrksht2.Visible = xlSheetHidden

        Set wrksht = Worksheets("□")

        Set wrksht3 = Worksheets("▲")

    データセット部分

     wrksht3.Range("AR1").Value =wrksht.Range("AR1").Value

        wrksht3.Visible = xlSheetVisible
        wrksht3.PrintPreview        ←これが添付画面のようになります。
        wrksht3.Visible = xlSheetHidden

    特に複雑なコマンドでもないので理由が不明です。

    2019年5月31日 2:11
  • infade様

    上記と同じ内容ですが

       Set wrksht = Worksheets("□")
        Set wrksht2 = Worksheets("●●●")

    データセット部分

     wrksht2.Range("AR1").Value =wrksht.Range("AR1").Value

        wrksht2.Visible = xlSheetVisible
        wrksht2.PrintPreview        ←これはきちんと出ます。
        wrksht2.Visible = xlSheetHidden

        Set wrksht = Worksheets("□")

        Set wrksht3 = Worksheets("▲")

    データセット部分

     wrksht3.Range("AR1").Value =wrksht.Range("AR1").Value

        wrksht3.Visible = xlSheetVisible
        wrksht3.PrintPreview        ←これが添付画面のようになります。
        wrksht3.Visible = xlSheetHidden

    特に複雑なコマンドでもないので理由が不明です。

    2019年5月31日 2:11
  • trapemiya様

    通常の操作では全く発生しません。

    どのプリンターにしても、発生するのは2回目の時だけです。

    2019年5月31日 2:13
  • kokemomoyamamomo様

    私も描画の際に発生していると思います。

    2回目だけなので原因がよくわかりません。

    2019年5月31日 2:15
  • qoo_manさん、こんにちは。

    コードのご提供、ありがとうございました。Windows7+Excel2013で実行してみましたが、特段の支障なく、1回目も2回目もプレビューが表示されました。for~nextで10ラウンド実行してみても、問題なくプレビューが表示されました。

    単純に
    Sub Test()
      ActiveSheet.PrintPreview
      ActiveSheet.PrintPreview
    End Sub
    でもこのようになるでしょうか。それとも、提供されたコードならではでしょうか。

    なお、Excel VBA PrintPreview でググろうとしましたら、「Excel VBA PrintPreview 固まる」というキーワードが提示されて、それをいろいろ見てみたら、次のようなページがありました。症状は違いますが、つい2か月ばかり前に最終更新された記事でした。PrintPreviewは結構危ういコマンドなんでしょうかねぇ。ご参考まで。
    https://answers.microsoft.com/ja-jp/msoffice/forum/all/%E5%8D%B0%E5%88%B7%E3%83%97%E3%83%AC%E3%83%93/8293ff4f-7b67-4a1b-8aa7-53b16664d51b

    2019年5月31日 3:03
  • kokemomoyamamomo様

    Printpreviewの扱いは難しいです。

    パラメータが少ないので、他に考えられることが思いつきません。

    2019年5月31日 7:47
  • infade様

    上記と同じ内容ですが

       Set wrksht = Worksheets("□")
        Set wrksht2 = Worksheets("●●●")

    データセット部分

     wrksht2.Range("AR1").Value =wrksht.Range("AR1").Value

        wrksht2.Visible = xlSheetVisible
        wrksht2.PrintPreview        ←これはきちんと出ます。
        wrksht2.Visible = xlSheetHidden

        Set wrksht = Worksheets("□")

        Set wrksht3 = Worksheets("▲")

    データセット部分

     wrksht3.Range("AR1").Value =wrksht.Range("AR1").Value

        wrksht3.Visible = xlSheetVisible
        wrksht3.PrintPreview        ←これが添付画面のようになります。
        wrksht3.Visible = xlSheetHidden

    特に複雑なコマンドでもないので理由が不明です。

    新規のブックに以下のコードで再現しますか?
    Sub test()
        ' ワークシートの変数
        Dim wrksht As Worksheet, wrksht2 As Worksheet, wrksht3 As Worksheet
    
        ' 最初のワークシートを取得
        Set wrksht = Worksheets(1)
        ' ワークシートを 2 つ新規作成して取得
        Set wrksht2 = Worksheets.Add(, Worksheets(Worksheets.Count))
        Set wrksht3 = Worksheets.Add(, Worksheets(Worksheets.Count))
    
        ' 最初のワークシートをアクティブにする
        wrksht.Activate
        ' 新規作成したワークシートを非表示にする
        wrksht2.Visible = xlSheetHidden
        wrksht3.Visible = xlSheetHidden
    
        ' 最初のワークシートの AR1 セルに文字列 "test" を入力
        wrksht.Range("AR1").Value = "test"
    
        ' 2 つ目のワークシートの AR1 セルに最初のワークシートの AR1 セルの内容をコピー
        wrksht2.Range("AR1").Value = wrksht.Range("AR1").Value
    
        ' 2 つ目のワークシートを表示して印刷プレビュー
        wrksht2.Visible = xlSheetVisible
        wrksht2.PrintPreview
        ' 2 つ目のワークシートを非表示に戻す
        wrksht2.Visible = xlSheetHidden
    
        ' 3 つ目のワークシートの AR1 セルに最初のワークシートの AR1 セルの内容をコピー
        wrksht3.Range("AR1").Value = wrksht.Range("AR1").Value
    
        ' 3 つ目のワークシートを表示して印刷プレビュー
        wrksht3.Visible = xlSheetVisible
        wrksht3.PrintPreview
        ' 3 つ目のワークシートを非表示に戻す
        wrksht3.Visible = xlSheetHidden
    End Sub
    
    2019年5月31日 12:38
  • qoo_man様 こんばんは、以前私が経験した例で不具合が解消されるでしょうか
    ユーザーフォームからでしたし、ブックも非表示にしていましたし、コードも違うので期待はできませんが、
    あくまで情報として。。根拠を示せるほどのスキルはありませんが、
    Excel2013からSDIに代わってからPrintPreviewはどうも不安定になることがあるような、、、

        wrksht2.Visible = xlSheetVisible
        wrksht2.PrintPreview        ←これはきちんと出ます。
      wrksht.Activate ’明示的にアクティブにする
        wrksht2.Visible = xlSheetHidden  

    その時は、この方法で回避出来ました。その後、おまじないの様にPrintPreview後に付け加えています。W

    ちなみに、qoo_man様の示されているコードとinfade様の示されているコード共に事象の再現が出来ませんでしたので関係あるかどうか分かりませんが。

    追記:確か、プレビューウインドウからエクセルシートに戻るときに不具合が出て・・だったと
    これは、確か2010で作ったファイルを2013で検証している時の事だったと思い出しました。

    いずれにしても、示されているコードを基に、処理途中でプリンターを変更したり、グラフを作成したり、新規ブックにコピー処理を入れたり、デバックでエラーにならない程度の処理を追加して色々実行して検証しましたが、自宅のPCでは再現できませんでした。 Windows10 Excel Home and Business 2013 15....

    <おまじないの様にPrintPreview後に付け加えています。>検証の結果必要無い事が分かりました。(当然か)

    記憶による、根拠のない情報で申し訳ございません。

    • 編集済み Takumi_Q 2019年6月2日 4:49 再現を実験し追記
    2019年6月1日 16:04
  • qoo_manさん、こんにちは。

    非力な私の見立ては、Printpreviewの2回目のプロセス中、プレビューの画像を描画する窓の表示まではできたけれども肝心の画像が準備できないため止まっている、ということだろうと理解しています。
    以前に記しましたが、システムが正常であれば、プレビューの窓のサイズを変更すると、再描画の動作が機能するようですので、当初投稿の画面が表示された段階で、プレビューの窓のサイズを変更してみて、正しくプレビュー画像が表示されるか、ダメなままか、を試されてみてはいかがでしょうか。

    ダメなままであれば、コントロールパネルからシステムファイルを修復したほうが早いような気がします。ご参考まで。

    2019年6月4日 6:17
  • infade様

    遅くなってしましました。すみません。

    上記のコードを張り付けても問題はないようです。

    ???の状態です。

    2019年6月22日 3:54
  • KokemomoYamamomo

    どのPCで試しても同じ現象が出ます。

    何がおかしいのか見当もつきません。

    2019年6月22日 3:56
  • Takumi_Q

    いろいろと試してみましたが変わりありませんでした。

    連続してプレビューするのをあきらめています。

    2019年6月22日 3:59
  • 私のところでも多発しています。

    Excel2010(32bit)、Excel2013(32bit)、2016(64bit)を主に使っていますが、2013と2016で発生します。

    ズームやページ切替を行ったり、ウインドウの大きさを変えたりすると、きちんと描画されます。

    たぶん、2013/2016のバグじゃないかと思います。

    プレビューコマンドの前に、SendKeysで「ズーム」のショートカットを2回分送ると、一瞬ズームちらつきがあって煩わしいものの、とりあえずは表示されるのではないかと思います。

            With Application
                If Val(.Version) >= 15 Then .SendKeys "zz"
                .Dialogs(xlDialogPrintPreview).Show False
                '.CommandBars.ExecuteMso "PrintPreviewFullScreen" 'これでも可
                'ActiveSheet.PrintPreview 'これでも可
                'ActiveSheet.PrintOut Preview:=True 'これでも可
            End With

    2019年6月22日 6:45
  • minmin312様

    ありがとうございます。

    とりあえずそれで対応したいと思います。ありがとうございました。

    • 回答としてマーク qoo_man 2019年6月28日 2:58
    2019年6月28日 2:58