【脱エクセルVBA初心者】PDFでの出力とファイル名の指定保存そして閉じる


close-door

photo credit: door via photopin (license)

みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。

脱エクセルVBA初心者向け、請求書を自動で作る際の様々なテクニックについてシリーズ連載でお伝えしています。

全体としては

  1. 取引先マスタの取引先の分だけ新規ブックを作成しそこに請求書ひな形シートをコピーする
  2. コピーしたシートの名称を「請求書ひな形」から「請求書」に変更する
  3. 各社の「請求書」シートに「請求データ」から該当のデータを抜き出して転記する
  4. 各社の「請求書」シートに「取引先マスタ」から必要な項目を転記する
  5. 各社の「請求書」シートの不要な行を非表示にするなど表示を調整
  6. 各社の「請求書」シートをPDF形式で保存する

という流れになりますが、前回までで1,2までができたという形になります。

【脱エクセルVBA初心者】確認メッセージを表示させずにワークシートを削除する方法
脱エクセルVBA初心者向け、請求書を自動で作る際の様々なテクニックをお伝えしています。今回は、エクセルVBAで特定のシートを削除する方法と、削除時の確認メッセージをオフにする方法についてお伝えします。

今回はちょっと飛んで6の処理をやっておこうと思います。

エクセルVBAでワークブックを別名で保存しつつ、PDF出力して閉じるという処理を追加していきたいと思います。

スポンサーリンク

前回までのおさらい

前回のプログラムはこちらです。

Sub wsCopyNewBook()

    Dim wsInvoice As Worksheet '「請求書ひな形」シート

    Workbooks.Add '新規ワークブックを作成
    ThisWorkbook.Worksheets("請求書ひな形").Copy before:=ActiveWorkbook.Sheets(1) '新規ワークブックのsheet1の前にひな形をコピー

    Set wsInvoice = ActiveSheet 'コピーしたシートを変数にセット
    wsInvoice.Name = "請求書" 'シート名を変更

    Application.DisplayAlerts = False '確認メッセージをオフにする
    ActiveWorkbook.Worksheets("Sheet1").Delete 'Sheet1を削除する
    Application.DisplayAlerts = True '確認メッセージをオンにする

End Sub

このプログラムを実行すると

VBAでBook1が生成しつつシートがコピーされる

このように、Book1.xlsxというファイルが生成されて請求書のひな形となる「請求書」シートがコピーされた状態となっているはずです。

将来的には、このファイルは取引先ごとに生成がされることになりますので、取引先名や日付などを使ってファイル名を命名しておくのが理想です。

ではそれを想定した上でこのBook1.xlsxについて

  • 「請求書」シートをPDF出力
  • ブックを名前をつけて保存して閉じる

という処理を追加していきましょう。

「請求書」シートをPDFで出力をする

PDFで出力する場合は

WorkSheetオブジェクト.ExportAsFixedFormat Type:=xlTypePDF, fileName:=ファイル名

とします。

今回出力するシートは「請求書」すなわちwsInvoiceになりますので

wsInvoice.ExportAsFixedFormat Type:=xlTypePDF, Filename:=strFile & ".pdf" '選択したシートをPDF出力

となります。

strFileですが今と同じフォルダパス+仮のファイル名として「201606請求書_株式会社ホゲホゲ御中」とでもしておきましょう。

PDFの出力の設定についてはwsInvoice.PageSetupオブジェクトの様々なプロパティで設定をしていきます。

今回は以下のように設定をしました。

With wsInvoice.PageSetup

    .Zoom = False       '倍率をクリア
    .FitToPagesWide = 1 '横方向に1ページに収める
    .FitToPagesTall = 1 '縦方向に1ページに収める
    .CenterHorizontally = True                          '水平方向に中央配置
    .TopMargin = Application.CentimetersToPoints(1)     '上マージンを1cm
    .BottomMargin = Application.CentimetersToPoints(1)  '下マージンを1cm

End With

PDF出力と各プロパティの設定についての詳細は以下の二つの記事も参考にしてくださいね。

初心者でも簡単!エクセルVBAでPDFを出力する最もシンプルなプログラム
エクセルVBAではPDF形式での出力もできます。今回は、初心者向けエクセルVBAでPDFを出力する最も簡単なプログラムと、PDF出力の際にシート1ページに収めて出力する方法についてお伝えしていきます。
エクセルVBAで印刷時のページ中央配置と余白を設定する
エクセルVBAでPageSetupオブジェクトを使って印刷設定をページ中央配置にする方法、また上下左右のマージンを設定する方法についてお伝えします。また印刷プレビューの表示方法も紹介します。

ワークブックを名前を付けて保存して閉じる

PDFで保存したんだからエクセルは保存しなくていいんじゃね?

って思われるかも知れませんが、万が一記載内容にミスがあって修正が必要な場合は、エクセルファイルもとっておいたほうが良いですよね。

ワークブックを名前をつけて保存して閉じる際はCloseメソッドを使って

Workbookオブジェクト.Close SaveChanges:=True, Filename:=ファイル名

とします。

SaveChangesのオプションが名前を変更するかどうかのフラグを指定します。Trueであれば名前をつけて変更するよ、ということです。

Filenameはファイル名ですね。拡張子以外はPDFと同じで良いと思います。

今回の場合、この部分は

ActiveWorkbook.Close savechanges:=True, Filename:=strFile & ".xlsx" 'アクティブブックを名前を付けて保存して閉じる

実行をしてPDFを出力してエクセルを名前をつけて保存してみる

以上をまとめると、このようなプログラムができます。

Sub wsCopyNewBook()

    Dim wsInvoice As Worksheet '「請求書ひな形」シート

    Workbooks.Add '新規ワークブックを作成
    ThisWorkbook.Worksheets("請求書ひな形").Copy before:=ActiveWorkbook.Sheets(1) '新規ワークブックのsheet1の前にひな形をコピー

    Set wsInvoice = ActiveSheet 'コピーしたシートを変数にセット
    wsInvoice.Name = "請求書" 'シート名を変更

    Application.DisplayAlerts = False '確認メッセージをオフにする
    ActiveWorkbook.Worksheets("Sheet1").Delete 'Sheet1を削除する
    Application.DisplayAlerts = True '確認メッセージをオンにする

    Dim strFile As String '保存先フォルダパス&ファイル名(拡張子抜き)
    strFile = ThisWorkbook.Path & "\201606請求書_株式会社ホゲホゲ御中"

    '*****PDF出力設定*****
    With wsInvoice.PageSetup

        .Zoom = False       '倍率をクリア
        .FitToPagesWide = 1 '横方向に1ページに収める
        .FitToPagesTall = 1 '縦方向に1ページに収める
        .CenterHorizontally = True                          '水平方向に中央配置
        .TopMargin = Application.CentimetersToPoints(1)     '上マージンを1cm
        .BottomMargin = Application.CentimetersToPoints(1)  '下マージンを1cm

    End With

    wsInvoice.ExportAsFixedFormat Type:=xlTypePDF, Filename:=strFile & ".pdf" '選択したシートをPDF出力
    ActiveWorkbook.Close savechanges:=True, Filename:=strFile & ".xlsx" 'アクティブブックを名前を付けて保存して閉じる

End Sub

実行をしてみますと

エクセルVBAでPDFとエクセルファイルが生成される

実行ファイルと同じフォルダ内に指定したファイル名のPDFファイルとエクセルファイルが生成されています。

PDFを開いてみますと
エクセルVBAで出力されたPDFファイル
無事に出力されていることがわかります。

まとめ

以上、エクセルVBAでシートをPDFで出力するしつつ、ワークブックを名前を変えて保存して閉じる方法についてお伝えしました。

しかしまだ請求書の中身を何にもしていませんね。

次回はそれぞれの取引先ごとの請求書の中身を転記する処理をすべく、データ範囲の選択と並び替えについて解説をしていきます。

【脱エクセルVBA初心者】データが含まれる範囲全体を一発で取得してSortで並び替え
脱エクセルVBA初心者向けのテクニックとして、CurrentRegionプロパティでデータ範囲を塊で取得して、それをSortメソッドで並び替えをする方法についてお伝えしていきます。

どうぞお楽しみに!

連載目次:【脱エクセルVBA初心者】請求書を自動で作る際のテクニック集

「請求書を自動で作る」というニーズはとても多いですから、その際に便利な機能やテクニックをシリーズにてお伝えしていきます。脱エクセルVBA初心者をターゲットにしています。
  1. 【脱エクセルVBA初心者】新規のワークブックを作成、シートのコピーと名前の変更
  2. 【脱エクセルVBA初心者】確認メッセージを表示させずにワークシートを削除する方法
  3. 【脱エクセルVBA初心者】PDFでの出力とファイル名の指定保存そして閉じる
  4. 【脱エクセルVBA初心者】データが含まれる範囲全体を一発で取得してSortで並び替え
  5. 【脱エクセルVBA初心者】コピペはRangeが効率的なのでその範囲を見つけるプログラム
  6. 【脱エクセルVBA初心者】Copyメソッドで範囲まるごとを一発でコピペする
  7. 【脱エクセルVBA初心者】Vlookupで出てしまうエラーをいい感じに回避する方法
  8. 【脱エクセルVBA初心者】請求書作成マクロの全体おさらいと総仕上げ

タイトルとURLをコピーしました