読者です 読者をやめる 読者になる 読者になる

ExcelをPDFに変換するとずれる

excel vba

入門者のExcel VBA―初めての人にベストな学び方 (ブルーバックス)

はじめに

業務でExcel VBAを使ってPDFを出力しているんですが、今回Excelをバージョンアップ(2007⇒2013)することになりました。

 

VBAの互換性の問題を修正して、いざ動作確認!

すると、PDFの印字位置や改ページが思いっきりずれてる!

 

さらにレイアウト崩れを修正すると、今度はPDF出力が異常に遅い!

 

Excelをバージョンアップすると、人間だけでなくシステムですら戸惑うみたいなので、くれぐれも注意しましょう、というのが今回のお話。

 

結論

ActivePrinter(通常使うプリンター)にMicrosoft XPS Document Writerを指定する

※但し、性能が大幅低下することがあるので注意!

 

 

経緯

Excel VBAを使ったExcel⇒PDF変換は、特にAdobe製品なども必要なく、Excel単体に簡単に実現できます。

 

ちなみにVBAでの実装例はこんな感じ。(オプションで印刷品質なども指定できます)

ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:="c:\xxx.pdf"

【Excel VBA サンプル集】PDFに変換して保存する - ExcelVBA@Workshop

 

ただ、Office製品は異なるバージョン間での互換性があまり高くなく、今回もExcel 2007のVBAソースをそのままExcel 2013に移植しても動きませんでした。

 

で、VBAソースを修正したんですが、今度はPDFのレイアウト崩れが発生しました。

ちなみに同じデータの印刷ではレイアウトの問題は生じなかったので、印刷とPDF出力では若干事情が異なるようです。


レイアウト崩れが発生後、色々と試してみたところ、どうやらPDF出力時のレイアウトはActivePrinter(通常使うプリンター)に依存している模様。

 

なお、ActivePrinterは以下のようにVBAソース内で指定することもできます。

Application.ActivePrinter = [指定したいプリンタ名]

 

調べてみると、どうやらMicrosoft XPS Document WriterがPDF変換時の再現性が高いらしい。

MICROSOFT XPS DOCUMENT WRITER を使えば、高品質のPDFが作成できる。: PDF写本工房

 

そこで、デフォルトで入っているMicrosoft XPS Document Writerを指定したところ、見事レイアウト崩れが解消!

これにて一件落着!めでたしめでたし。

 

まとめ

一件落着と思いきや、性能を測ってみると大幅に低下していることが発覚!

以前に比べて軽く2~3倍、酷いものでは10倍近く時間がかかっている。

 

さすがにこのまま放置できないので調べてみると、他にもMicrosoft XPS Document Writerの利用による性能低下の事例がありました。

Printing sheets with "MS XPS Doc Writer" is slow

 

OSパッチで解消との情報もありましたが、XPS周りには若干不具合がありそうなので注意した方が良さそうですね。

作成したXPSドキュメントの印刷が異常に遅い | あいしん スタッフぶろぐ

 

というわけで、残念ながら私はMicrosoft XPS Document Writerの利用を断念せざるを得ませんでした。

ただ、Microsoft XPS Document Writer以外にもレイアウト崩れを生じないプリンターを見つけられれば、問題を解消することができます。

(私は利用中のプリンターを片っ端から試してみて見つけました)

 

少量のPDF出力であったり、特に性能面の要求が厳しくないのであれば、再現性の高さからMicrosoft XPS Document Writerの選択もアリだと思います。