Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(指定なし : 指定なし)
詳細設定してPDF作成
投稿日時: 21/08/02 20:59:22
投稿者: tako552101

win8.1、ver2010、win10、ver2019です。
 
丁度A4を横に2等分した位の横長の台紙(110*285mm)があって、すでに罫線で囲まれた枠が数十個配置され印刷済みです。元は別なアプリで印刷していましたがExcelで対応できるか実験中です。
 
ここに別シートで入力した値を計算式ではめ込んで、連続印刷しようと試みているのですが、枠の中に正確に入れて印刷すると、プリンタによって位置がかなりズレることがわかりました。
 
ファイルはいろんな方が使うので環境に左右されるのはダメだと思い、PDFで一旦出力し、これを任意のプリンタで印刷すると、各々を直接印刷するより正確に印字されることがわかりました(2機種のみですが)
 
当方にはacrobatがインスールされていてこれで細かい設定は可能なのですが、Excelの標準機能の「PDF作成」で対応できないものかと考えました。環境に依存せずVBAで例えば余白や用紙サイズなどを細かく指定することは可能でしょうか。
 
現状は余白が上4.5、左4.6、他は0、用紙サイズは110*285mmです。
 
よろしくお願いします。
 

回答
投稿日時: 21/08/03 08:39:24
投稿者: simple

>環境に依存せずVBAで例えば余白や用紙サイズなどを細かく指定することは可能でしょうか。
名前を付けてPDFで保存する処理のことを指していると思いますが、
それはページレイアウトの設定に依存すると思います。
ただご承知のとおり、Excelに精細な印刷機能を期待するのは難しいと思います。
>プリンタによって位置がかなりズレることがわかりました。
これと同じ理由で、指定どおりの結果になるか保証されないものと思います。
 
Acrobatを利用する方法がとれるのであれば、そちらのほうがよろしいかと思います。
いずれにせよ、試行錯誤は必要でしょうね。

回答
投稿日時: 21/08/03 14:40:30
投稿者: QooApp

引用:
ファイルはいろんな方が使うので環境に左右されるのはダメだと思い、PDFで一旦出力し、これを任意のプリンタで印刷すると、各々を直接印刷するより正確に印字されることがわかりました(2機種のみですが

 
印刷会社に勤めてますが、仰るように原則としてどの機種でも絶対に固定座標で印刷可能!とはなりません。
印刷機の機種によって最大印刷範囲が決まっており、用紙を超えるサイズも印刷範囲にみなせる機種であれば比較的同程度の位置に印刷できます。
 
逆に小型の印刷機(卓上系など)はマイナス余白(用紙を超えるサイズの印刷)ができないケースもあります。
エクセルもPDFもどんなアプリの印刷設定も同じですが、印刷機の機種に依存する可能余白範囲が最終的な印刷範囲を左右します。
 
逆に言えば全機種で問題なく印刷できるくらい余白を大きめにとることで解決できる可能性もあります。
※この場合、印刷内容を比較的中央に寄せて作成し、印刷位置で上下左右中央に設定することで、中央座標から余白を計算する形になる為、余白幅を実値で指定することが不要になり、比較的安定して印刷できます。
 
しかし、実際に印刷してみて上下左右にずれが気になる場合は印刷オフセット設定で調整せざるを得ません。
うちの会社にある億単位の最新機種大量印刷機であっても印刷データを変更するごとに毎回位置・色味・版ずれを確認し、調整します。実際ずれます。
 
また、同じ印刷機であっても印刷するごとにずれる場合は基材内部の構造が破損している可能性があります。
歯車の歯が折れていて挿入ドラムが正常に稼働しないなど様々な物理的問題でできないこともあります。
 
可能な限り安定した印刷機に集約して印刷するか、メンバーに印刷のレイアウトについて周知徹底するのもここではアリだと思います。

投稿日時: 21/08/03 15:58:31
投稿者: tako552101

皆さんありがとうございます。
 
おっしゃるようにプリンタによって1〜2mmのずれは出てしまい合せるのはとても無理ですが、PDFで出力したものはどのプリンタでも一応枠の中におさまるので、この方法をとりたいと思っています。
 
Acrobatを持っていない人も対象なので、Excelの標準機能でPDF化。2010で言うところの「保存と送信」→「PDF/XPSの作成」です。
しかしやみくもにこの処理を行うと用紙サイズがA4?のままなので用紙サイズをプリントプロパティで作成した「カード110×258」に設定する必要がありますが「PDF/XPSの作成」ではこれを行えないため一度印刷→「Mcrosoft XPS Document Writer」で指定した後に行うと一段階クリアですが、ここで躓いてます。
 
「カード110×258」を用紙サイズで指定できないのです。おわかりなるかたいらっしゃいましたらアドバイスお願いします。

回答
投稿日時: 21/08/03 16:56:45
投稿者: Suzu

tako552101 さんの引用:
「カード110×258」を用紙サイズで指定できないのです。おわかりなるかたいらっしゃいましたらアドバイスお願いします。

 
用紙のサイズ設定は、印刷する プリンタ によって設定されています。
印刷する プリンタ に、そのサイズが登録されているので、その紙で印刷できるのです。
 
カスタムサイズの用紙サイズはプリンタに登録する事で使用可能になります。
OSの機能でも、EXCELの機能でもありません。
 (プリンタのドライバにて設定可能かもしれませんが・・)
 
Windows 7でプリンタードライバーに用意されていない用紙サイズを設定する方法
https://faq.nec-lavie.jp/qasearch/1007/app/servlet/relatedqa?QID=013616
 
 
今回の、Mcrosoft XPS Document Writer には、用紙設定の機能がありません。
ですので、できないでしょう。
 
 
EXCELではなく、WORD にて カードサイズのテンプレートを作成し
そこに、差し込み印刷ではどうでしょうか?

投稿日時: 21/08/04 05:33:35
投稿者: tako552101

プリントサーバープロパティで新しい用紙サイズの作成は可能ですので、各担当者には初期設定でこの処理はしてもらうつもりでいました。マクロを記録するとページ設定で以下のような値が返ってきます。※不要だろうと思う部分は削除しています。
 
  ActiveSheet.PageSetup.PrintArea = "$B$2:$AY$35"
    Application.PrintCommunication = False
    With ActiveSheet.PageSetup
        .LeftMargin = Application.InchesToPoints(0.181102362204724)
        .RightMargin = Application.InchesToPoints(0)
        .TopMargin = Application.InchesToPoints(0.177165354330709)
        .BottomMargin = Application.InchesToPoints(0)
        .HeaderMargin = Application.InchesToPoints(0)
        .FooterMargin = Application.InchesToPoints(0)
        .PrintQuality = 600
        .PaperSize = 189
        .Zoom = 100
    End With
    Application.PrintCommunication = True
 
「.PaperSize = 189」の部分が新たに作成した用紙サイズですが、使用PCで返り値が異なりますのでこの値を取得したいわけですが、古いサイトにこの値を取得できるコードを発見したものの使い方が分かりません。
 
Excel VBAでプリンターの用紙サイズの一覧を取得して自動的に指定する
http://locosoft.cocolog-nifty.com/blog/2012/03/excel-vba-820b.html
 
WinAPIのようですが使い方わかる方がいらっしゃいましたらご指導お願いします。
 

引用:
EXCELではなく、WORD にて カードサイズのテンプレートを作成し
 そこに、差し込み印刷ではどうでしょうか?

 
最初の案として当然差し込み印刷も考えたのですが、差し込み印刷は処理が簡単ではありませんし、Excelに比べて配置がかなり面倒で、また、複数のアプリを使わせることが懸念材料でした。それに同じoffice製品でWordなら印刷ピッチが正確になるとは考えにくいので、まずはExcelでとテストしています。
 
でもWordならユーザー定義サイズ指定できるんですね。
        .PageWidth = MillimetersToPoints(258)
        .PageHeight = MillimetersToPoints(110)
 
もう少し悩んでみます。
 
 

回答
投稿日時: 21/08/04 10:12:54
投稿者: Suzu

引用:
「.PaperSize = 189」の部分が新たに作成した用紙サイズですが、使用PCで返り値が異なりますのでこの値を取得したいわけですが、古いサイトにこの値を取得できるコードを発見したものの使い方が分かりません。

 
それを、取得できてどうします?
 
VBA云々以前に、「手動」で目的を達する事ができますでしょうか?
 
先にも言いましたが、用紙設定は、プリンター毎に設定されています。
 
それを、ドライバーを経由しプリンターに問い合わせ、
  OSが取得して PC上の、プリンターの用紙一覧に表示しています。
 
その用紙一覧は、プリンターが変われば、保持できないものもあります。
今回は、目的の 用紙サイズ を 印刷先のプリンターに用意する事はできるでしょう。
 
でも、それを、PDF出力や、XPS で使用できるかは別。
  今回の様なユーザー定義の特殊サイズはできない可能性の方が高いです。
 
 
それなのに、それを取得してどうします? 意味がないと思います。
 
 
 
引用:
差し込み印刷は処理が簡単ではありませんし、Excelに比べて配置がかなり面倒で、また、複数のアプリを使わせることが懸念材料でした。それに同じoffice製品でWordなら印刷ピッチが正確になるとは考えにくいので、まずはExcelでとテストしています。

 
VBA で EXCEL以外の機能を使う事も十分面倒と思います。
面倒を 嫌がるのであれば、言うことは何もありません。
 
印刷ピッチ?
ユーザー設定のページサイズ にしてしまえば、終わりですよね。
 
その中に、罫線 または、テキストボックスを配置 そこに、フィールドを設定
サイズも mmで設定できますし、配置はラクと思います。

投稿日時: 21/08/06 08:36:07
投稿者: tako552101

Suzuさんありがとうございます。
 
最初の質問でも説明した通り、先に罫線や共通部分が印刷(オフセット)された台紙(110*258)があって、その枠の中に合わせて文字のみを印字することが目的です。
 
とっかかりExcelではじめてうまくいかなかったらWord、だめなら別ソフトも考慮するつもりでいましたが、ExcelでPDFを作成できれば、プリンタに依存することなく印刷できそうだという結果が出ましたので、まずはそこを突き詰めたいとのことからの投稿です。
 
面倒という言葉が語弊があったかもしれませんが、一番簡潔な方法で、正確な結果を出したいのは皆さん同じでしょう。
 

引用:
それを、取得できてどうします?
VBA云々以前に、「手動」で目的を達する事ができますでしょうか?

 
できるはずです。
まずはプリントサーバープロパティの「新しい用紙を作成する」で台紙のサイズを登録します。
次に「Mcrosoft XPS Document Writer」で上記で登録した用紙サイズを指定します。このプリンタにするのはおそらくどのWindowsPCにもインストールされているからです。また、このプリンタで印刷するわけではなくPDFにする前準備です。
 
この後に「PDF作成」。このPDFファイルならプリンタに依存しないである程度正しい位置に印刷できそう(OKI、Canon、Epsonで実験)なので自動化したいな、と。
 
番号が取得できれば「.PaperSize = XXX」でページ設定が出来そうです。
 
引用:
印刷ピッチ?
ユーザー設定のページサイズ にしてしまえば、終わりですよね。

 
試しにこの台紙を画像化したデータをWordに貼付けて、同じ台紙にOKI、Epsonの2機種で印刷テストしてみました。OKIは右、下に約1mmのズレが出て、Epsonは下のみに0.5mmズレ、さらにちょっと拡大されて印刷されました。いずれもExcelでPDFにしたデータよりも精度はは低いように感じました。
 
しかし、ページ設定が個々のプリンタで設定できるのは魅力なのでこちらもテストしてみたいと思います。
 
Windows 7でプリンタードライバーに用意されていない用紙サイズを設定する方法
https://faq.nec-lavie.jp/qasearch/1007/app/servlet/relatedqa?QID=013616
 
これ、わかる方いらっしゃいましたらご指導お願いします。

投稿日時: 21/08/06 09:05:01
投稿者: tako552101

スミマセン間違えました。
 
Excel VBAでプリンターの用紙サイズの一覧を取得して自動的に指定する
http://locosoft.cocolog-nifty.com/blog/2012/03/excel-vba-820b.html
   
 WinAPIのようですが使い方わかる方がいらっしゃいましたらご指導お願いします。

回答
投稿日時: 21/08/06 10:22:45
投稿者: Suzu

すみません。だいぶ外した回答をおこなっていました。
 
Windows の 設定 からの プリンター の
  Microsoft Print to PDF
 Microsoft XPS Documnent Writer
 
 の用紙設定を確認し、用紙の ユーザー定義ができないので
 

引用:
今回の、Mcrosoft XPS Document Writer には、用紙設定の機能がありません。
ですので、できないでしょう。

 
としていました。
 
 
引用:
まずはプリントサーバープロパティの「新しい用紙を作成する」で台紙のサイズを登録します。
次に「Mcrosoft XPS Document Writer」で上記で登録した用紙サイズを指定します。このプリンタにするのはおそらくどのWindowsPCにもインストールされているからです。また、このプリンタで印刷するわけではなくPDFにする前準備です。

 
こちらは、実プリンターの用紙設定を行い、
Excel のページ設定 にて、 その用紙設定を行った上で
Excel の印刷 から、プリンターを、 Print to PDF や、XPS Documnent Writer に変えると言うことで
その用紙サイズが使えると言うことですね。
 
と言うことは、
 そのPDF は、設定した プリントサーバーの 印刷先 の印刷能力を考慮した PDF の作成になっているのかな。。
それでも、誤差の範囲と言うことであれば使えそうですね。
 
 
APIは不得意なので。。。コメントはできませんが
ユーザーに 用紙設定をしてもらうのであれば。。
PDF を経由させる必要はありますか?
連続印刷に耐えうるテンプレートを機種毎に作成、PCにより微調整 で良さそうに思えます。
 
 
WORD に画像を配置してとの事ですが、それはサイズの微調整が入る可能性が高いと思います。
 
 
・・・外しているのかな。。
どっちにしろ、微調整を含めた試行錯誤 が必要な事ですので、がんばってください。

投稿日時: 21/08/08 09:30:38
投稿者: tako552101

当方にあるプリンタ(OKI、Epson)で直接このExcelファイルをプリントしますと、各々でズレ方がかなり異なります。列の幅も拡大縮小?されてしまい余白だけの調整では間に合いません。試しにPDF化したものを各々でプリントしたらほぼピッタリで十分使えそうです。
 
ファイルを渡す方々は同じプリンタではないですし、他県に散らばっているので正直細かい設定ができないと想像できるので、PDF作成までをボタン1つでできるのならこの1クッションは我慢してもらう判断からの投稿です。
 
もうちょっと開けます。よろしくお願いします。

投稿日時: 21/08/09 22:49:36
投稿者: tako552101

閉じます。