[リストへもどる]
一括表示

投稿時間:2003/06/12(Thu) 16:08
投稿者名:低速人
Eメール:
URL :
タイトル:
Excel印刷設定の高速化
こんにちは
いつもいろいろと参考にさせて頂いております。
今日は1つ教えて頂きたく投稿します。

VBよりExcelシートをページ設定をしています。
現状、下記のコードで動作しているんですが、とても遅いです。
どうもページ設定を1行ずつ設定いる動きに感じます。
もっと高速に処理する方法はないでしょうか?

Excelマクロにより記録を取って試したりしているのですが、記録時は早いのに
記録したマクロを実行するとやっぱり遅いです。

ご存知の方、どうか教えてください

環境
VB : VB6 sp5
Excel : Excel97
OS : WinNT 4.0 sp5

    Dim objApp   As Excel.Application
    Dim objBook  As Excel.WorkBook
    Dim objSheet As Excel.Worksheet

  Set objApp = CreateObject("Excel.Application")
  Set objBook = objApp.Workbooks.Add
  Set objSheet = objBook.Worksheets(1)
  
    With objSheet.PageSetup
            .PrintTitleRows = ""
            .PrintTitleColumns = ""
            .PrintArea = "$B$2:$CF$44"
            .LeftHeader = ""
            .CenterHeader = ""
            .RightHeader = ""
            .LeftFooter = ""
            .CenterFooter = ""
            .RightFooter = ""
            .LeftMargin = objApp.InchesToPoints(0.22)
            .RightMargin = objApp.InchesToPoints(0.2)
            .TopMargin = objApp.InchesToPoints(0.511811023622047)
            .BottomMargin = objApp.InchesToPoints(0.393700787401575)
            .HeaderMargin = objApp.InchesToPoints(0.196850393700787)
            .FooterMargin = objApp.InchesToPoints(0.196850393700787)
            .PrintHeadings = False
            .PrintGridlines = False
            .PrintComments = xlPrintNoComments
            .CenterHorizontally = True
            .CenterVertically = True
            .Orientation = xlLandscape
            .Draft = False
            .PaperSize = xlPaperA3
            .FirstPageNumber = xlAutomatic
            .Order = xlDownThenOver
            .BlackAndWhite = False
            .Zoom = 100
    End With

投稿時間:2003/06/12(Thu) 16:51
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re: Excel印刷設定の高速化
ひょっとして、Excelが立ち上がっている時間も含まれていませんか?
Excelを表示する部分と印刷する部分を別にして測定して見てください。
正味の印刷にかかっている時間だけを比較したデータを教えて下さい。

因みに、ここのExcel&Word関係の表に罫線を引きシートを印刷するを試して
見て下さい。それも遅く感じますか?
 

投稿時間:2003/06/12(Thu) 17:27
投稿者名:低速人
Eメール:
URL :
タイトル:
Re^2: Excel印刷設定の高速化
ご返答ありがとうございます。

エクセルの起動は含めていません
印刷処理も問題なく、印刷する前に行っているページ設定で多くの処理時間を取られてしまいます。
ページ設定にかかっている時間は、12秒ほどでした。

Excel&Word関係の表に罫線を引きシートを印刷する
は、先に参考にさせて頂きました。
ページ設定を行っている項目数分、早く感じるくらいだったんです。
ページ設定の部分だけで5秒ほどでした。

複数枚のエクセルファイルに対し一括処理を行ないたい為、ダイアログの使用もできません。

プログラム実行中にエクセルを見えるようにしてやってみたんですが
マウスカーソルが砂時計になったり元にもどったりを繰り返しながら動作していました。
その回数は、おおよそページ設定いる項目数と比例していました。

やはりページ設定をする項目が多い以上やむを得ないんでしょうか・・・

投稿時間:2003/06/12(Thu) 18:32
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re^3: Excel印刷設定の高速化
実際に印刷されている部分のコードを教えて下さい。

それと、EXcel上から直接印刷した場合の時間とVBから印刷した場合の時間を教えて
下さい。(Excelが立ち上がって表示するまでの時間は除く)
プリンターの機種等も

それと 1ページだけ印刷した場合はどうなるか?

投稿時間:2003/06/13(Fri) 10:58
投稿者名:低速人
Eメール:
URL :
タイトル:
Re^4: Excel印刷設定の高速化
少々長くなりますが、コードと測定した時間を記します

・VB上からの印刷時間はページ設定から印刷処理まで : 30秒

手動でエクセルから印刷時間
・ページ設定をOKしてからそれが反映されるまで     : 1秒
・印刷処理がかけて終了まで                       : 1秒

VB、エクセル共にスプールされて紙が出てくるまで   : 2秒

使用PC : CPU400MHz
     Mem256MB

プリンタ : XERROX DocuPrint C3530(カラーレーザープリンタです)

印刷に使用しているファイルはエクセル97のシートに セルA1に「あ」と1文字入ってるだけで、シートは1枚しかないものです

以下がコードです

Private Sub cmdPrint_Click()
    Dim objApp                       As Excel.Application
    Dim objBook                      As Excel.Workbook
    Dim objSheet                     As Excel.Worksheet
    
    Dim i As Integer
    
    Set objApp = CreateObject("Excel.Application")
    objApp.Visible = False
    objApp.DisplayAlerts = False
    
    For i = 0 To filXls.ListCount - 1
    
        Set objBook = objApp.Workbooks.Open(filXls.Path & "\" & filXls.List(i))
        Set objSheet = objBook.Worksheets("sheet1")
    
        Beep    '時間測定 ここから↓
        With objSheet.PageSetup
            .PrintTitleRows = ""
            .PrintTitleColumns = ""
            .PrintArea = "$B$2:$CF$44"
            .LeftHeader = ""
            .CenterHeader = ""
            .RightHeader = ""
            .LeftFooter = ""
            .CenterFooter = ""
            .RightFooter = ""
            .LeftMargin = objApp.InchesToPoints(0.22)
            .RightMargin = objApp.InchesToPoints(0.2)
            .TopMargin = objApp.InchesToPoints(0.511811023622047)
            .BottomMargin = objApp.InchesToPoints(0.393700787401575)
            .HeaderMargin = objApp.InchesToPoints(0.196850393700787)
            .FooterMargin = objApp.InchesToPoints(0.196850393700787)
            .PrintHeadings = False
            .PrintGridlines = False
            .PrintComments = xlPrintNoComments
            .CenterHorizontally = True
            .CenterVertically = True
            .Orientation = xlLandscape
            .Draft = False
            .PaperSize = xlPaperA4
            .FirstPageNumber = xlAutomatic
            .Order = xlDownThenOver
            .BlackAndWhite = False
            .Zoom = 100
        End With
        
        objBook.PrintOut Copies:="1", Collate:=True
        Beep: Beep    '時間測定 ここまで↑
    
    
        objBook.Close SaveChanges:=False
        Set objSheet = Nothing
        Set objBook = Nothing

    Next
    
    objApp.Quit
    Set objApp = Nothing
    
End Sub

投稿時間:2003/06/13(Fri) 12:07
投稿者名:魔界の仮面弁士
Eメール:
URL :
タイトル:
Re: Excel印刷設定の高速化
PageSetupオブジェクトの各プロパティへのアクセスは、かなり低速です。

コードではなく、実際の操作が高速になるのは、各プロパティをひとつずつ設定するのではなく、
『ページ設定』ダイアログによって、複数のプロパティを一括して設定する事ができるためです。


そして、各プロパティの設定に要する時間は、プリンタドライバに強く依存します。

例えば当方の環境場合、PageSetupの各プロパティを設定するまでに、
キヤノン製の某レーザプリンタでは、1.2秒で済んだプログラムが、
NEC製の某インクジェットプリンタでは、10秒もかかったという経験があります。
(後者では、プロパティを1つ更新するたびに、0.9秒ほどの時間がかかっていました)

そのため、苦肉の策として、お客様に事情を説明して、
『[ページ設定]ダイアログが表示されますので、OKを押して下さいね』
という運用で逃げた(泣)ことがあります。

With WS.PageSetup
  If 処理時間の短いプリンタを使っている場合 Then
    .PrintTitleRows = "$1:$8"
    .LeftMargin = 0
    .RightMargin = 0
    .TopMargin = 0
    .BottomMargin = 0
    .HeaderMargin = 0
    .FooterMargin = 0
    .Orientation = XlLandscape
    .PaperSize = XlPaperA4
    .Zoom = false
    .FitToPagesWide = 1
    .FitToPagesTall = False
  Else
    XL.Dialogs(xlDialogPageSetup).Show "", "", 0, 0, 0, 0, False, False, True, False, XlLandscape, XlPaperA4, Array(1, "")
  End If
End With

投稿時間:2003/06/13(Fri) 14:38
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re^2: Excel印刷設定の高速化
テストしみましたら、魔界の仮面弁士さんの解説の通りですね。
不必要なプロパティの設定をコメントアウトすると少しは早くなりますが?。

後は、既存のファイルを印刷されておられるようなので、ページ設定はExcelのファイル上で
設定しておいてVBから印刷する場合は何もしない。
新規にファイルを作成する場合は前もって、ページ設定だけをしたファイルを使う。
なら、早くはなりますが!。

投稿時間:2003/06/13(Fri) 14:51
投稿者名:低速人
Eメール:
URL :
タイトル:
ありがとうございます
花ちゃんさん、ありがとうございます。

ご助言通り、新規ファイルの場合のみダイアログを表示するように改良してみます。
ほんとにいろいろと参考になりました。

長々とお付き合い頂きありがとうございました。

投稿時間:2003/06/13(Fri) 14:46
投稿者名:低速人
Eメール:
URL :
タイトル:
ありがとうございました
魔界の仮面弁士さん、ご回答ありがとうございます。

> コードではなく、実際の操作が高速になるのは、各プロパティをひとつずつ設定するのではなく、
> 『ページ設定』ダイアログによって、複数のプロパティを一括して設定する事ができるためです。

やはりそういうことだったんですか・・・
複数のプロパティを同時に変更する方法はダイアログにするしかないんですね

> そのため、苦肉の策として、お客様に事情を説明して、
> 『[ページ設定]ダイアログが表示されますので、OKを押して下さいね』
> という運用で逃げた(泣)ことがあります。

私もまったく同じ状態にいますので、同様の対策で逃げます(涙)
事情がわかっただけ気が楽になりました。

さっそく言い訳の文書でも作成してみます。
ありがとうございました