Excel (一般機能)

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

 
(Windows 10 Pro : Excel 2016)
Excel VBA でPDF作成時の用紙サイズの指定について
投稿日時: 19/12/10 13:29:23
投稿者: kosanlove

Excelのバージョンは Office365です。
 
作成者と連絡の取れないファイルです。
Excel VBA でPDF作成時の用紙サイズの指定について
どなたか解決方法をご教示ください。
よろしくお願いいたします。
 
下記のソースですと、
作成されるPDFがA4(210X237mm)ではなく
330X233.4mmというサイズになってしまいます。
ファイル自体の出力設定は A4 へ90%としています。
  
*******************************
現在のソース
*******************************
Sub 請書と注文書の保存とPDF作成()
Application.ScreenUpdating = False
 
  Dim sheetNames As Variant
  Dim shn As Variant
  Dim WB As Workbook
 
 Worksheets("注文書出力").Visible = True
 Worksheets("注文請書出力").Visible = True
 
'実行するシート名の指定
  sheetNames = Array("注文書出力", "注文請書出力")
 
'新規ブックの準備
  Set WB = Workbooks.Add
   
  For Each shn In sheetNames
 
'新規ブックにコピー
    ThisWorkbook.Worksheets(shn).Unprotect
    ThisWorkbook.Worksheets(shn).Copy After:=WB.Worksheets(WB.Worksheets.Count)
 
'関数を値に変換
    WB.Worksheets(shn).UsedRange.Value = WB.Worksheets(shn).UsedRange.Value
    WB.Worksheets(shn).Range("A1").Select
     
  Next
       
 Application.DisplayAlerts = False
 WB.Worksheets(1).Delete 'デフォルトシート削除
 Application.DisplayAlerts = False
 
'同じフォルダにセルの値をファイル名にして.xlsxで保存
 WB.SaveAs ThisWorkbook.Path & "\" & ActiveSheet.Range("AH1").Value & ".xlsx", XlFileFormat.xlOpenXMLWorkbook
 WB.Close False
 
 
'同じフォルダにセルの値をファイル名にして.pdfで保存
 ThisWorkbook.Sheets(Array("注文書出力", "注文請書出力")).Select
  ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
   ThisWorkbook.Path & "\" & Worksheets("注文書出力").Range("AH1").Value & ".pdf"
 
     
'出力用シートを非表示して終了
 Sheets("初期画面").Activate
 Worksheets("注文請書出力").Visible = False
 Worksheets("注文書出力").Visible = False
  
 Application.DisplayAlerts = False
 Application.Quit
 ActiveWorkbook.Close SaveChanges:=True
 Application.DisplayAlerts = True
 
Application.ScreenUpdating = True
     
End Sub
*******************************
 
 
*******************************
検索をして
どこかへ追記したら良いのではと思うソース
'同じフォルダにセルの値をファイル名にして.pdfで保存
のあたりだとは思うのですが…。
*******************************
 '印刷倍率/用紙サイズ/印刷の向きを設定する
   With ActiveSheet
       .PageSetup.Zoom = 90 '倍率90%
       '印刷の向きを「横向き」
       .PageSetup.Orientation = xlLandscape
        '用紙サイズを「A4」
       .PageSetup.PaperSize = xlPaperA4
  End With

回答
投稿日時: 19/12/10 18:23:43
投稿者: YuuSa

こんばんわ。
 
非表示になっている注文書出力と注文請書出力のシートを一端表示し
ページ設定や改ページプレビュー等で、出力したいように修正し保存するのが、
簡単だと思いますよ。

投稿日時: 19/12/11 08:32:09
投稿者: kosanlove

コメントありがとうございます。
 
非表示になっている注文書出力と注文請書出力のシートを
一端表示しページ設定や改ページプレビュー等を確認いたしまた。
 
全て(印刷対象となるシートは)同じ設定
A4サイズ 横 拡大縮小90%となっています。
 
よろしくお願いいたします。

回答
投稿日時: 19/12/11 11:15:36
投稿者: たかみ

この現象、実は情報が少ないながら、ある条件に合致してしまうと100%発生してしまうという厄介な現象でして。
私の会社でもExcel2010のころに発覚して、社内で大騒ぎになったことがあります。
対処法を以下に書きますので、kosanloveさんのPCでテストしてみてください。
 
 
 
まず大前提として、Excelのブック・シートの設定は関係ありません。
また、VBAのコードにも問題はありません。
 
ただ一つだけ、この現象を起こしてしまう条件は
 
・Excelの倍率を100%以外にしているシートを「ExcelのPDF出力機能」でPDF出力する
・Windowsの「プリンターとスキャナー」というシステム関連の設定で、Adobe PDFを含む、現象の発生するプリンタドライバを「既定のプリンタとして使用する」に設定している

 
この二つの条件が揃っているときに、100%発生します。
 
 
私も、ネット情報を探し回ってようやく見つけたのですが、同じように「縮小しているのに拡大される」という現象に悩まされ、この発生条件にたどりついた方が、MicrosoftとAdobe両社に報告したそうですが、お互いに自社のソフトに問題はないという姿勢だったとのことで、おそらく対応されないでしょうということを書いておられました。
これは、2011年10月当時の情報です。
いまだに現象が起きるということは、今後も修正の手が入る可能性はほぼないと思われますので、ユーザー側が対処するしかありません。
 
 
 
ではどうするかといいますと。
kosanloveさんのPCにインストールされているプリンタドライバを、順番に「既定のプリンタとして使用する」に設定し直して、現象の起きないものを見つけ出してください。
 
私の会社ではプリンタ類は3社のものが使用されていますが、その中で起きるものと起きないものがありました。
メーカー名をこの場に書くのは控えます。
ですので、大変ですけれど、ご自身でテストして現象が起きないものを探し出してください。
 
一応、現象が起きないドライバは、初期インストールされているOS附属の「FAX」だったような記憶があります。
 
 
ただテストの結果、全滅ということであれば、「ExcelのPDF出力機能」でPDF出力するというやり方はあきらめて、「印刷」で「Adobe PDF」ドライバを指定して、出力するしかありません。
 
 
試してみてください。
 
 
ちなみになぜ「縮小しているのに拡大するのか」というと、縮小であれば「用紙サイズ×0.9(指定している倍率)」となるはずなのですが、この現象の時だけ、なぜか「用紙サイズ÷0.9(指定している倍率)」になってしまっているからです。

回答
投稿日時: 19/12/11 11:43:21
投稿者: たかみ

引用:
・Excelの倍率を100%以外にしているシートを「ExcelのPDF出力機能」でPDF出力する

 
分かりにくい書き方だったので、訂正します。
印刷の倍率です。

回答
投稿日時: 19/12/11 15:30:36
投稿者: WinArrow
投稿者のウェブサイトに移動

横から、失礼します。
 
ExcelのPDF出力ではなく、
CubePDFというソフト(フリー)で印刷するのはいかがでしょうか?
VBAは、普通の.PrintOutで印刷しますが、
印刷プロパティで、CuBePDFを選択するだけです。

投稿日時: 19/12/11 16:02:35
投稿者: kosanlove

皆様、コメントありがとうございます。
朝一の確認後、色々試した結果、以下の内容で解決できたようです。
 
■原因(想像)■
印刷設定で 通常使うプリンターに設定(A) で
各端末の通常使うプリンターに設定(A)が異なる
通常使うプリンターに設定(A)が同一でも 印刷設定が同一でないなどが要因と思われます。
 
■対策(対応)■
ファイルを開くと同時に
Windows10の機能として搭載されている「Microsoft Print to PDF(仮想プリンター)」を
強制的に指定する方法とします。
■ThisWorkbookに下記を追記
=======================================================
Private Sub Workbook_Open()
 
   Application.ActivePrinter = "Microsoft Print to PDF on Ne99:"
 
End Sub
=======================================================
 
「Microsoft Print to PDF(仮想プリンター)」であればすべての端末で指定可能
 
ただし、端末によってはポートに違いがあり
レジストリを操作が不安な端末所有者向けに各端末で次の2点を実施依頼
 
■手順1■レジストリの変更
「Microsoft Print to PDF(仮想プリンター)」のポート"99"に変更する
ポートを設計統一の値として "99"に書換える【Microsoft Print to PDF_99.reg】を作成配布
 
下記をtxtで作成後、拡張子を.regとした
=======================================================
Windows Registry Editor Version 5.00
 
[HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Devices]
"Microsoft Print to PDF"="winspool,Ne99:"
=======================================================
 
各端末で【Microsoft Print to PDF_99.reg】をデスクトップへコピー
デスクトップ上の 【Microsoft Print to PDF_99.reg】 ダブルクリック
続行しますか? 【はい】 追加されましたで 【OK】
デスクトップ上の 【Microsoft Print to PDF_99.reg】 削除
 
■手順2■プリンタポート確認
上記手順で「Microsoft Print to PDF(仮想プリンター)」のポート"99"に変更済み確認
【プリンタポート確認.xlsm】を作成配布
デスクトップ上の 【プリンタポート確認.xlsm】 ダブルクリック
現在使用しているプリンターは、Microsoft Print to PDF on Ne99: です。
と表示されるのを確認
 
下記をVBAで作成
 
■ThisWorkbookとして
=======================================================
Private Sub Workbook_Open()
 
   Application.ActivePrinter = "Microsoft Print to PDF on Ne99:"
 
End Sub
=======================================================
 
■Module1 として
=======================================================
Sub ShowCurrentPrinterName()
'現在使用しているプリンタ名をメッセージボックスで表示
 Rem ***********************************************************
    MsgBox "現在使用しているプリンターは、" & _
    Application.ActivePrinter _
    & " です。", Title:="現在使用しているプリンターの表示"
End Sub
=======================================================
 
 
以上、現状では解決策だと考えています。
 
皆様、コメントありがとうございました。
 
YuuSa さま
 YuuSaさまのご指摘があってこそ、印刷設定が問題解決に関係しているのでは?
 VBA自体の編集ではなくも別の視点として問題をとらえることが解決の糸口となりました。
 ありがとうございました。
 
たかみ さま
 たかみさまも 過去に苦戦されたのですね…。
 長文のコメント有難く拝読しました。
 随分以前からの問題なのですね…タイミング的には拝読が夕方になり、
 プリンタドライバの問題では?と目途をつけてレジストリの統一や
 別端末への設定を済ませてしました後でしたがお時間さいて頂きありがとうございました。
 プリンタドライバにたどり着いていなかったとしたら、とても有益な情報です。
 
 "現象の起きないものを見つけ出す" 今回はWindows10の機能が良いのではと進めました。
 
WinArrow さま
 印刷プロパティで、CuBePDFを選択する方法
 ソフト(フリー)というのが社内セキュリティ的にハードルがあるので…。