[[20151223130546]] 『Excel 2013 の PrintPreview で画面が乱れる』(やっぱり初歩) ページの最後に飛ぶ

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

 

『Excel 2013 の PrintPreview で画面が乱れる』(やっぱり初歩)

[[20150324221025]] で解決できなかった件です。

 新規のブックのSheet1のA1セルに適当な簡単な文字列を入れた状態で、プロシージャ作成。
 ★この時の画面設定は『リボンを表示しない』とした場合で、他の条件下では問題無し。

 Sub Test()
   Application.ScreenUpdate = False    '★試行部分で最初は無し
   ActiveSheet.PrintPreview
 End Sub

 として印刷プレビューを実行。そして終了してシートに戻ると画面が乱れる。
 友人の買ったばかりのPCで同様に試しても同じ現象となりました。

 色々手探りで解決方法が無いものか試行しました。
 ★を追加した場合は取敢えず何ともなく画面も乱れません。
 しかし複数ページ有っても印刷プレビュー内は更新されなく同じページのまま。
 ページの余白設定も動かず変わらず。この時には本来ステータスバーの左端に
 ページが表示されるのですがありません。   ★が効いて知るのでしょうか。

 又、右クリックのショートカットへ標準実装のID=209(印刷プレビュー)を追加
 した場合には画面の乱れは発生しませんでした。(ページ区切り破線が出現)
 手作業による印刷プレビュー(Ctrl+P)も同様に乱れなく問題ありません。

 私としては、印刷プレビュー後のシート内に現れるページ区分を示す破線を消去したい。
 PrintPreviewメソッドを使用した場合には、PageBreaks = False が使えるのですが
 ショートカットからはどうして良いか分からず困っています。

 更に私の実際のシートは列数が少ない為、A列(空白列)を変更して横方向を画面中央へ
 全体像を表示して、印刷プレビューの前処理でA列の幅を変更し終了後元に戻してます。

    With ActiveSheet
       ColWidth = Columns(1).ColumnWidth                 'A列の幅を取得
       Columns(1).ColumnWidth = 0.1                      'A列の幅を最小値へ
       .PrintPreview
       Columns(1).ColumnWidth = ColWidth                 'A列の幅を元に戻す
       .DisplayPageBreaks = False
    End With

 上記は問題を含む流れの一部。

 【夫々が抱える問題】
 1)  右ShortCut: DisplayPageBreaks の処理が出来ない。
 2)PrintPreview: ぺージ設定が出来ない。1シートで何枚印刷されるか、又、位置が不明

 理想とする解決策:
 (1)右ShortCutで DisplayPageBreaks の処理が出来れば最高

 同じ内容の質問で3度目ですが宜しくお願いします。

< 使用 Excel:Excel2013、使用 OS:Win10 >


 なるほど、そうなりますね。初めて知りました。
 ところで、画面の状態を Ctrl/F1 だけ(一番上のメニューは表示されている状態)で行うと
 プレビューから戻っても画面は乱れませんね。

 ところで、Ctrl/Shift/F1 で一番上のメニューも非表示にすると、確かに戻った時に乱れるんですが
 戻る前、プレビュー画面では戻るボタンも含めてボタン類がないですよね。
 どのように戻っておられるんですか?
 (こちらでは、プレビュー画面でリボンを復活させて戻しましたが)

(β) 2015/12/23(水) 15:16


  >戻る前、プレビュー画面では戻るボタンも含めてボタン類がないですよね。
     以下の様な事でリボンの表示/非表示をしています。

  With Application.CommandBars                   ' Excel Version による分岐
      If CInt(Application.Version) = 15 Then
         If .GetPressedMso("HideRibbon") = True Then .ExecuteMso "HideRibbon"
      Else      ' ← Ver.2007-2010
         If .GetPressedMso("MinimizeRibbon") = True Then .ExecuteMso "MinimizeRibbon"
      End If
   End With
     :
  With ActiveSheet
     :              '←最初の記述
  End With
     :
  With Application.CommandBars
    以下、リボンを元に戻す記述

 印刷に関する処理は難しいと聞きます。増してやExcelではバグも多いと聞きます。
 それ故にバグであっても自分の要件にあった方法があるのではないかと質問しました。
 くどくて申し訳ありませんが宜しくお願いします。。

(やっぱり初歩) 2015/12/23(水) 18:47


 たとえば画面の状態が Application.DisplayFullScreen = True で表示される全画面の状態だという前提なら。

 Sub testP()
    Application.DisplayFullScreen = False
    ActiveSheet.PrintPreview
    Application.DisplayFullScreen = True
 End Sub

 一瞬、プレビュー画面に行く前に、ちらっとリボンが見えるかもしれませんが、プレビューから戻った時には
 画面が崩れない全画面で表示されると思います。

 これでは不都合ですか?

(β) 2015/12/23(水) 20:46


今日はお酒が入り試せません。明日確認して報告します。
(やっぱり初歩) 2015/12/23(水) 21:10

有難うございます。教示して頂いた事で解決とはなりました。少しでもチラつきが少なくなる様に付け加えました。

 Sub testP()
    Application.DisplayFullScreen = False
    ActiveSheet.PrintPreview
    Application.ScreenUpdating = False     'チラつき防止
    Application.DisplayFullScreen = True
    ActiveSheet.DisplayPageBreaks = False   '頁区切り破線解除
 End Sub

 只、前回お伝えした或るシートではA列の非表示/表示作業を PrintPreview の前後に加えると以前と同じ状態と
 なってしまします。想像では機械的にこの部分を飛ばす為、結果的にExcel内ではエラー個所となる様では…
 その特定シート自体を変更してA列から始めればか完全解決となるのですが…
 私の趣味でA列(空白列)作成の上それを調整して見栄えを良くしたブックが多数あります。

 この事からA列の非表示/表示作業は必要となってくるのです。どうしたらよいでしょうか
           ~~~~~~~~~~~~~~~~~~~~~
 又、ショートカットに追加した印刷プレビューの選択から実行する方法で上記作業出来るでしょうか
 (頁区切り破線解除も加えた作業。これ等は不可能でと思っていますが)

 Private Sub Workbook_Open()
    With Application.CommandBars("cell")
      .Controls.Add ID:=109                    '印刷プレビュー
      .Controls.Add ID:=247                    'ページ設定
   End With
 End Sub

 私は試したことが無い BeforePrint で事前作業が出来ても AfterPrint がありません。 
 私でも理解して使えるような方法があればチラつきは苦にしません。宜しくお願いします。
(やっぱり初歩) 2015/12/24(木) 09:00


 この現象はバグだと思いますし、いずれはパッチがあてられるとは思いますが、現状で、操作によるプレビューを行えば
 どうしても、画面が崩れるのは、いたしかたないのでしょうね。

 たとえば、今、右クリックに 印刷プレビューダイアログを追加していますが、これを
 印刷プレビューを行う「マクロ」(提示した TestP のようなもの)を登録し、操作者が選択すると
 ダイアログ直接ではなく、そのマクロが動いてプレビュー画面を表示するようにしてはいかがでしょう。

 右クリックにマクロを登録する方法、ご存じでしょうが、参考までに、たとえば以下のようなページ。

http://www.atmarkit.co.jp/ait/articles/1408/25/news030.html

(β) 2015/12/24(木) 10:57


有難う御座いました。

 自前の右クリックを作っても、実際のアクションの所で PrintPreviewメソッド を書く事になり意味のないものなる。
 其の為、この事は考えませんでした。ショートカットは標準の”Cell”に追加して試しただけでした。

 > 印刷プレビューを行う「マクロ」(提示した TestP のようなもの)を登録し、操作者が選択すると
 > ダイアログ直接ではなく、そのマクロが動いてプレビュー画面を表示するようにしてはいかがでしょう。
 この事はどんな意味あいでしょうか?。又、作成手順だけでも良いですのでそのイメージをご指導ください。

 私のイメージでは、ステップ実行すると着実に実行されても連続動作をさせると飛ばされる、
 若しくはエラーとなるアクションになるような気がします。

(やっぱり初歩) 2015/12/24(木) 11:49


 >>ステップ実行すると着実に実行されても連続動作をさせると飛ばされる

 なるほど。そうなりますねぇ。
 やっかいですね。

 どなたかからグッドアドバイスがあればいいですねぇ。

 PS)私自身が、これをなんとかするということになれば、いずれグッドな解決策が見つかるまでは
   右クリックメニューは使わず、全画面を【リボンだけ非表示】つまり、Ctrl/F1 の状態にし
   印刷プレビューは最上段のクィックアクセスツールバーのプレビューボタンを使うか
   メニューのファイルから印刷をクリックして、当座をしのぎます。

(β) 2015/12/24(木) 13:55


 右クリックに設定したマクロを2段構えの起動にすると、一応機能するようです。

 ThisWorkbookモジュール

 Private Sub Workbook_Open()
    Application.CommandBars("Cell").Reset
    With Application.CommandBars("Cell").Controls.Add
        .Caption = "印刷プレビュー"
        .OnAction = "THisWorkbook.TestPreview"
    End With
    Application.DisplayFullScreen = True
 End Sub

 Sub TestPreview()
    Application.OnTime Now(), "ThisWorkbook.TestP"
 End Sub

 Sub testP()
    Application.DisplayFullScreen = False
    ActiveSheet.PrintPreview
    Application.DisplayFullScreen = True
 End Sub

(β) 2015/12/24(木) 21:35


 早速自分のPCで動かしました。正常な動作をしました。(若干変更をしました)
 然し、コメントを外すと色んな形で画面の乱れが発生しました。
       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 DisplayPageBreaks は実行されます。(PrintPreviewの後だから当然と言えば当然)

 最初にご教示頂いたコードを見て、『時間差攻撃しているみたい』と思いました。
 もし、これで正常な動きを得られるならば ★列幅変更A の部分も更に一段加えれば良いかなと想像。
 3段活用で私の要望事項全部が叶えられるならば試すしかありません。

 Sub TestPreview()
 Dim ColWidth As Single

    With ActiveSheet
      '★列幅変更A
 '      If .Name = "入力" Then
 '         .Unprotect
 '         ColWidth = Columns(1).ColumnWidth                     'A列の幅を取得
 '         Columns(1).ColumnWidth = 0.1                          'A列の幅を最小値へ
 '      End If

       Application.OnTime Now(), "印刷Preview"

     '★列幅変更B      
 '      If .Name = "入力" Then
 '         .Unprotect
 '         Columns(1).ColumnWidth = ColWidth                     'A列の幅を元に戻す
 '         .Protect
 '      End If
    End With
 End Sub

 Public Sub 印刷Preview()

    With ActiveSheet
       Application.DisplayFullScreen = False
        .PrintPreview
       .DisplayPageBreaks = False
        Application.DisplayFullScreen = True
    End With
 End Sub

 今日の深夜にWin10のアップグレードが有って私のPCは未だにゴロゴロ動いていて安定していません。
 テストには時間が掛かりそうです。

(やっぱり初歩) 2015/12/25(金) 08:39


 TestPreview内は、提示したような OnTime のみとし、そこにある列幅関連処理を 印刷Preview に移すとどうなりますか?

(β) 2015/12/25(金) 08:56


 私の発想はダメでした。PCは未だゴロゴロ動き時間が掛かっています。安定していません。

 > TestPreview内は、提示したような OnTime のみとし、そこにある列幅関連処理を 印刷Preview に移すとどうなりますか?

 これからテストします。

(やっぱり初歩) 2015/12/25(金) 09:33


 印刷Preview に移しても同じ現象となりました。

 PrintPreviewの前で処理を行うと問題が起きるようです。以前の発想での出来事でしたが
 プレビュー処理: A列を除く印刷範囲指定 ⇒ PrintPreview ⇒ 印刷範囲解除
 といった手順を踏んだ時もやはり同じ現象でした。

 4月頃の出来事で、その後適当にやっていたらあたかも治っているかの様な動作となったので最近まで
 この事を忘れていました。ScreenUpDating = Flse が効いて喜んでいたのです。
 しかし現実は不完全な処理と分かり今回の投稿となったのです。

 やはり相当無理がある様で、何か違う発想を考えたいと思います。
(やっぱり初歩) 2015/12/25(金) 10:07

 12/25 以降 右ショートカットを "Cell" と別に作成し両者をシートに応じて動かすようにしました。
 でも、この方法も不具合続出でした。以下が問題点とそのコードです。

 【問題点】
 1)標準 "Cell" ではシートに戻るとページ区切り破線が出る。
     → 何処へPageBreaks=False を入れて良いのか、又は、入れられないのか分からず

 2)独自ショートカットでは、印刷リボン内の操作をすると画面が乱れる。
   只、右上のXボタン(終了)では問題なく動作。破線も消える。

 Public Sub 印刷Set()
   Dim ActAr, CapAr, i As Byte
   Dim cBar As CommandBar, mBar As CommandBar
   Dim mBarCtl As CommandBarControl

   On Error Resume Next
   Application.CommandBars("mPop").Delete
   On Error GoTo 0

   Set cBar = xApp.CommandBars("Cell")
   With cBar
      .Controls.Add ID:=109
      .Controls.Add ID:=247     'ページ設定(.Add Type:=msoControlButton, ID:=247)
   End With

   ActAr = Array(, "A列最小", "印刷Preview", "キャンセル")
   CapAr = Array(, "印刷用に表示変更", "印刷プレビュー", "表示を戻す")
   Set mBar = Application.CommandBars.Add("mPop", msoBarPopup, , True)
   Set mBarCtl = mBar.Controls.Add(Type:=msoControlPopup)

   With mBarCtl
      .Caption = "印刷プレビュー"
      For i = 1 To 3
         With .Controls.Add
            .Caption = CapAr(i)
            .OnAction = ActAr(i)
         End With
      Next
   End With
   cBar.Enabled = True

 End Sub

 Public Sub A列最小()
   With Sheets("入力")
      .Unprotect
      ColWidth = Columns(1).ColumnWidth            'A列の幅を取得
      Columns(1).ColumnWidth = 0.1                 'A列の幅を最小値へ
      .Protect
   End With
 End Sub

 Public Sub 印刷Preview()
   Const Msg As String = "最初に印刷用に列幅変更コマンドを行って下さい。" _
      & wCr & "★【操作方法】このメニューの最上段【印刷用に表示変更】" _
      & "を先に実行した後に、もう一度【印刷プレビュー】を実行。"

   With Sheets("入力")
      If Columns(1).ColumnWidth > 0.1 Then         '変更されてなければ Exit
         DoEvents
         MsgBox Msg, vbCritical, "NG"
         Exit Sub
      End If

      .PrintPreview
      .DisplayPageBreaks = False

      .Unprotect
      Columns(1).ColumnWidth = ColWidth            'A列の幅を戻す
      .Protect
   End With
 End Sub

 印刷プレビューへのフロー変更はこの位しか考えられませんでした。
 現状から頭の中で考える理想像は、PrintPreviewメソッドを使用しないで全て標準実装の ID=209 で動作させる。
 更にぺージ区切り破線を消去する事が出来れば良いのです。独自ショートカットと組み合わせて。
 この様な事が可能でしょうか。Application.Run xxx などの使用を含めてでも…
(やっぱり初歩) 2015/12/28(月) 10:58

コメント返信:

[ 一覧(最新更新順) ]


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