2016-05-18 18 views
7

ほとんどすべてが自動化されたExcelブックがあります。他のワークブックを開き、そこからデータをコピーし、閉じてから、データを何度もループして、印刷して使用するレポートを生成します。ほとんどすべてのVBAを実行し、印刷しようとするたびに、印刷プレビューは、プリンタを見つけるか、または画像に表示されているようにページサイズを読み込んでいません。 Excelを閉じてドキュメントを再度開くと、印刷プレビューが通常の機能に戻ります。 VBAが行う印刷に関連する唯一のことは、印刷領域を変更することです。 VBAを実行する他のドキュメントでこの問題は発生していません。これは単なるバグか、おそらくコード内の何かですか?大量のVBAを実行した後の印刷プレビューの問題

Issue

これは、何らかの方法でロードに失敗する印刷プレビューの原因となるコードです。このセクションをスキップすると、意図したとおりに動作します...私はこのコード関数を何らかの形で必要としています。私は "エラー後藤0で"、 "On Error Resume Nextを" コメントアウトしようとしました

Set wb1 = Workbooks.Open(FileName) 
    Set wb2 = ThisWorkbook 

    For i = LBound(sArray) To UBound(sArray) 'Loops through array, copies available data from last report 
     ShtName = sArray(i, 0) 
     On Error Resume Next 
      wb1.Sheets(ShtName).Activate 
      If Err.Number = 0 Then 
       wb1.Sheets(ShtName).Activate 
       Columns("A:U").Copy 
       wb2.Sheets(ShtName).Activate 
       Columns("BE:BV").Select 
       Selection.PasteSpecial xlPasteValues 
       Application.CutCopyMode = False 
       lastrow = Cells(Rows.Count, "BE").End(xlUp).Row 
       Range("BA2:BC2").Select 
       Selection.AutoFill Destination:=Range(Cells(2, "BA"), Cells(lastrow, "BC")), Type:=xlFillDefault 
      End If 
     On Error GoTo 0 

     DoEvents 

    Next i 

    wb1.Close False 

    Sheet2.Activate 

、 "なら..."、 "場合の終了"、および "DoEvents関数"。印刷プレビューは削除されたもので失敗し、前のシートからコピー&ペーストするだけです。

+2

ソリューションをお探しの場合は、いくつかの追加情報を提供する必要があります。コードは何ですか?コードの印刷領域部分を実行しないとどうなりますか?それはすべてのマシンで起こりますか? Excelのさまざまなバージョンはどうですか? – Raystafarian

+0

あなたは何が起こっているかを見ることができるようにコードを投稿できますか?ワークブックのオープンまたは消失に問題がある可能性があります。あなたはActivePrintやPaperSizeのようなものを 'ActiveWorkbook.Sheets(" Name ")のように設定してみることができます。Pag​​eSetup.PaperSize = xlPaperLegal' – MatthewD

+0

おそらく、VBAを実行したワークブックとワークシートのレベルでNamesコレクションをチェックすることができます。複数のPrint_Area名や奇妙な名前のエントリがある場合は、それがあなたの犯人かもしれません。この問題は、Excelの再起動によって問題が解消され、プロセスで繰り返し実行されるブックからの名前が、印刷プレビューの問題が発生しているメインブックの名前コレクションを汚染していることが示唆されています。 –

答えて

3

印刷プレビューが正しく動作し、ブックを終了するときにExcelがもうクラッシュしない... DoEventsのすべてのインスタンスを削除すると、問題を修正しているようです。

+0

あなたはdoeventsの恐怖を発見しました。私はそれを100%悪と言っているわけではありませんが、ほとんどの場合、それは解決するよりも多くの問題を作り出します。 –

0

プレビュー表示をシート上のデータと再同期できるようなリフレッシュアクションを探していると思います。最後に試してみるとよいでしょう。

ActiveSheet.EnableCalculation = False 
ActiveSheet.EnableCalculation = True 

これでうまくいかない場合は、問題を修正して保存するかどうかを確認してください。最後にApplication.Saveに電話をかけることができます。

+0

月曜日に試してみましょう。私はこの問題が保存前と保存後に発生することを知っています。表示/用紙サイズに問題があっても印刷をクリックすると、文書は印刷されます。 – tjb1

+0

これを各シートに追加しても、残念ながら修正されませんでした。 – tjb1

0

"[ファイル] - [印刷]を選択すると、印刷プレビューが自動的に表示されます。また、ページレイアウトビュー(ステータスバーの右側にあるアイコン)を使用することもできます。 VBAを使用する必要がある次の文は、アクティブシートの印刷プレビューを表示します。ActiveSheet.PrintPreview「ジョン・ウォーケンバックでVBAでのMicrosoft Excel 2013電源プログラミングより引用

、ページ956から957。

私は、新しいシートを作成し、25の自動アクションを実行し、印刷プレビューを表示し、MsgBoxで[OK]をクリックすると印刷プレビューを閉じる比較的複雑なマクロを記録することで上記の問題をテストしました。私はこれを1000回繰り返すプログラムを繰り返した。私はPrintPreviewに問題はなかった。

+0

印刷プレビューVBAを追加します。今では通常印刷されるシートはリストから生成されるので、コピーされたテンプレートを使用します。リストから平均1〜12枚のシートを作成し、古いブックからデータをコピーし、約3,000行をループして作成したシートを作成し、約40,000行をループしてシートに情報を追加します。それはおそらく、機能のクリープが終了した今、書き直しの恩恵を受けるだろうが、私は自分自身のために時間があるとは思わない... – tjb1

+0

合意@ tjb1、その時間はまれなリソースです。私があなたの状況で行うことは、書き直しを試みるのではなく、デスクトップに保存された元のコードのテスト可能なコピー(ネットワークサーバーなど)から始めることです。次に、時間があるように簡単な変更を試みます。たとえば、VBAコードの「ActiveSheet.PrintPreview」は、グリッチを修正するのに十分であるかもしれない古いメモリを必要としない印刷プレビューに依存しています。 – Andy

0

暗闇の中でその種のショットが、あなたのコードを少しきれいにしようとしました。それが何らかの影響を与えるかどうかを確認してください。

Sub Test() 

Dim wb1 As Workbook, wb2 As Workbook 
Dim ws1 As Worksheet, ws2 As Worksheet 
Dim isWS As Boolean 

On Error GoTo sub_err 

Set wb1 = Workbooks.Open(Filename) 
Set wb2 = ThisWorkbook 

For i = LBound(sArray) To UBound(sArray) 'Loops through array, copies available data from last report 
    ShtName = sArray(i, 0) 
    isWS = True 
    Set ws1 = wb1.Sheets(ShtName) 

    If isWS Then 
     Set ws2 = wb2.Sheets(ShtName) 

     ws1.Columns("A:U").Copy 
     ws2.Columns("BE:BV").PasteSpecial xlPasteValues 
     Application.CutCopyMode = False 
     lastrow = ws2.Cells(ws2.Rows.Count, "BE").End(xlUp).Row 
     ws2.Range("BA2:BC2").AutoFill Destination:=ws2.Range(ws2.Cells(2, "BA"), ws2.Cells(lastrow, "BC")), Type:=xlFillDefault 
    End If 
    DoEvents 
Next i 

wb1.Close False 

ws2.Activate 

sub_exit: 
Exit Sub 

sub_err: 
If Err.Number = 9 Then 
    isWS = False 
    Resume Next 
Else 
    MsgBox "Error: " & Err.Number & vbNewLine & Err.Description 
    Resume sub_exit 
End If 

End Sub 

私は大きなものは、あなたがまだあなたのエラーが表示されますWB1内のシートおよび他のすべてのエラー(なしエラー9エラー)を見つからない場合は、この方法はそれだけで次の再開、あなたのエラー処理をオフに分割されましたメッセージ。

また、Range()、Cells()、Columns()が正しいシートを参照していることを確認しました(Excelが混乱しているだけです)、アクティブシートが正しいシートであると仮定しましたが、正しいシートで正しいことをしていることを確認するために、コード内でこれを確認してください。

コピーコードはisWS = trueの場合にのみ実行され、エラー9コードがスローされない限り、常にtrueになります。私が知らなかったのは、wb2が常にShtNameに等しいシート名を持っていたのですが、それがあなたの中に入っているからだと思います。err.number = 0

これは、私はあなたの結果を他の方法で聞くことに興味があります。

+0

私はコードからすべてのDoEventsを取り除いて修正することができました。私は彼らが悪い点にあったのか、それとも問題が何だったのかは分かりません。私はコードのその部分でかなり遊んでいましたが、エラー処理をすべて削除しても問題は残っていました。 – tjb1