みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。
脱エクセルVBA初心者向け、請求書を自動で作る際の様々なテクニックについてシリーズ連載でお伝えしています。
全体としては
- 取引先マスタの取引先の分だけ新規ブックを作成しそこに請求書ひな形シートをコピーする
- コピーしたシートの名称を「請求書ひな形」から「請求書」に変更する
- 各社の「請求書」シートに「請求データ」から該当のデータを抜き出して転記する
- 各社の「請求書」シートに「取引先マスタ」から必要な項目を転記する
- 各社の「請求書」シートの不要な行を非表示にするなど表示を調整
- 各社の「請求書」シートをPDF形式で保存する
という流れになりますが、前回までで1,2までができたという形になります。
今回はちょっと飛んで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
このプログラムを実行すると
このように、Book1.xlsxというファイルが生成されて請求書のひな形となる「請求書」シートがコピーされた状態となっているはずです。
将来的には、このファイルは取引先ごとに生成がされることになりますので、取引先名や日付などを使ってファイル名を命名しておくのが理想です。
ではそれを想定した上でこのBook1.xlsxについて
- 「請求書」シートをPDF出力
- ブックを名前をつけて保存して閉じる
という処理を追加していきましょう。
「請求書」シートをPDFで出力をする
PDFで出力する場合は
とします。
今回出力するシートは「請求書」すなわち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出力と各プロパティの設定についての詳細は以下の二つの記事も参考にしてくださいね。
ワークブックを名前を付けて保存して閉じる
PDFで保存したんだからエクセルは保存しなくていいんじゃね?
って思われるかも知れませんが、万が一記載内容にミスがあって修正が必要な場合は、エクセルファイルもとっておいたほうが良いですよね。
ワークブックを名前をつけて保存して閉じる際はCloseメソッドを使って
とします。
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
実行をしてみますと
実行ファイルと同じフォルダ内に指定したファイル名のPDFファイルとエクセルファイルが生成されています。
PDFを開いてみますと
無事に出力されていることがわかります。
まとめ
以上、エクセルVBAでシートをPDFで出力するしつつ、ワークブックを名前を変えて保存して閉じる方法についてお伝えしました。
しかしまだ請求書の中身を何にもしていませんね。
次回はそれぞれの取引先ごとの請求書の中身を転記する処理をすべく、データ範囲の選択と並び替えについて解説をしていきます。
どうぞお楽しみに!
連載目次:【脱エクセルVBA初心者】請求書を自動で作る際のテクニック集
「請求書を自動で作る」というニーズはとても多いですから、その際に便利な機能やテクニックをシリーズにてお伝えしていきます。脱エクセルVBA初心者をターゲットにしています。- 【脱エクセルVBA初心者】新規のワークブックを作成、シートのコピーと名前の変更
- 【脱エクセルVBA初心者】確認メッセージを表示させずにワークシートを削除する方法
- 【脱エクセルVBA初心者】PDFでの出力とファイル名の指定保存そして閉じる
- 【脱エクセルVBA初心者】データが含まれる範囲全体を一発で取得してSortで並び替え
- 【脱エクセルVBA初心者】コピペはRangeが効率的なのでその範囲を見つけるプログラム
- 【脱エクセルVBA初心者】Copyメソッドで範囲まるごとを一発でコピペする
- 【脱エクセルVBA初心者】Vlookupで出てしまうエラーをいい感じに回避する方法
- 【脱エクセルVBA初心者】請求書作成マクロの全体おさらいと総仕上げ