PDF出力を完全自動化するマクロ【複数のページを1つのPDFファイルで出力可能】
エクセルで作成した資料を自動的にPDF出力するマクロをご紹介します。
PDF出力マクロを導入すると以下のような問題を解決することができます。
印刷範囲、印刷ページ数の設定に時間がかかる
複数のページを1つのPDFデータで出力したい
PDFファイル名の入力を自動化したい
編集したエクセルを必ずPDFで保存する!こんな 処理を毎日繰り返し行っている方には絶対にチェックしてもらいたい内容になっています。
PDF出力マクロがどのような処理をするのかイメージが湧きやすいように、「実際に仕事で導入したpdf出力マクロ」をサンプルとして解説を行っていきます。
記事の最後では「PDF出力マクロが設定されたエクセルファイル」をダウンロードすることが可能です。
すぐにでもPDF出力マクロを使ってみたい!という方は参考にしてみてください。
仕事に導入したPDF出力マクロとは
私の職場では 以下のような業務を自動化したいという思いからPDF出力マクロを導入しました 。
一覧表の情報から写真データを自動的に貼り付ける
貼り付けた写真データの枚数によって印刷範囲を調整する
編集した写真表を一つのPDFファイルで出力する
PDF出力マクロを導入すれば上記のような処理を完全自動化することが可能です。
具体的にイメージして頂くために、サンプルとして作成したPDF出力マクロの使い方、処理内容をご紹介します。
PDF出力マクロ(サンプル)の使い方と処理内容
①設定シートの一覧表をに基本情報を記入
②設定シートの「番号」を入力
③PDF出力したい番号を入力、「PDF出力」をダブルクリック
「PDF出力」セルをダブルクリックするとPDF出力マクロが実行されます。
処理結果がこちら
「写真番号1~写真番号3.pdf」というファイルが自動作成されていて、
ファイルを開いてみると、写真番号1から写真番号3までのデータ全てが1つのPDFファイルで出力されています。
使い方としては、
一覧表に基本情報を入力し、番号を選択するだけ!!
たったこれだけ作業で写真付き資料を一瞬で作成可能となります。
このマクロの大きなメリットは、過去に作成した書類をすぐに出力できる!ということです。
エクセルファイルの名前を業務ごとに変えて保存していて、ファイル数がどんどん増えてしまう!という問題を解決することができます。
PDF出力マクロに使われている2種類のマクロ
仕事に導入したPDF出力マクロには、
大きく分けて「写真データを自動的に貼り付けるマクロ」と「条件によって印刷範囲を自動調整しPDF出力するマクロ」
の2種類が設定されています。
単体でもめちゃくちゃエクセル業務の効率化に繋がりますが、2つ組み合わせて導入することで効果は倍増。
いろんなエクセル業務に応用される2種類のマクロをそれぞれ詳しくご紹介します。
写真を自動的に貼り付けるマクロ
写真データを貼り付けるマクロにはShapeを使用します。
Shapeで写真を貼り付けるには「写真データが保存されている場所」と「写真データのファイル名」の情報が必要です。
サンプルとして紹介しているPDF出力マクロでは、
設定シートの6列目が「写真データが保存されている場所」、7列目から14列目が「写真データのファイル名」
の情報となります。
PDF出力マクロのコードの中で「写真データを貼り付けるマクロ」に該当する部分がこちら
syasin = Ash.Cells(i, 6) & "\" & Ash.Cells(i, 7) & ".JPG"
Set zukei = Bsh.Shapes.AddPicture(Filename:=syasin, LinkToFile:=False, SaveWithDocument:=True, Left:=0, Top:=0, Width:=0, Height:=0)
貼り付けた写真データの表示位置、大きさを調整する部分がこちら
With zukei
.ScaleHeight 1, msoTrue
.ScaleWidth 1, msoTrue
.LockAspectRatio = msoTrue
'''''''''''''''''''''ここの数値を変更することで写真の大きさ、配置を変更できる''''''''''''''''''''''''''
.Height = Bsh.Range(Bsh.Cells(10, 4), Bsh.Cells(22, 15)).Height
rx = (Bsh.Range(Bsh.Cells(10, 4), Bsh.Cells(22, 15)).Width - .Width) / 2
.Left = Bsh.Range(Bsh.Cells(10, 4), Bsh.Cells(22, 15)).Left + rx
.Top = Bsh.Range(Bsh.Cells(10, 4), Bsh.Cells(22, 15)).Top
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
End With
指定するセル範囲を編集することで、
貼り付ける写真データの表示位置、大きさを簡単に変更することが可能
です。
今回は、「写真データが保存されている場所」と「写真データの名前」の情報からマクロを構成していますが、
「写真データが保存されている場所」のみの情報から写真データが保存されているフォルダ内全ての写真を自動的に貼り付ける!
というマクロも設定可能です。
下記の記事では、指定するフォルダ内の全ての写真データを自動的に貼り付けるマクロについて詳しくご紹介しています。
>>>フォルダ内の写真データを貼り付けるマクロの解説はこちら
写真データの貼り付け作業を自動化したい!という方は是非参考にしてみてください。
複数ページを1つのPDFファイルで出力するマクロ
複数ページを1つのPDFファイルで出力するマクロには、ExportAsFixedFormatメソッドを使用します。
基本構造
WorkSheetオブジェクト.ExportAsFixedFormat Type:=xlTypePDF, fileName:=ファイル名
「WorkSheetオブジェクト」や「ファイル名」には変数を使って定義することがほとんどです。
シートを選択 → 印刷範囲を選択 → ExportAsFixedFormatでPDF出力
というコードでPDF出力マクロを作成することができます。
サンプルのPDF出力マクロのコードの中で「複数ページを1つのPDFファイルで出力するマクロ」に該当 する部分がこちら
'「設定表」シートの145行目に写真データ情報がある場合、A4ヨコ2枚分の印刷範囲を設定
'「写真表」シートを右端にコピペする(2シート分作成し1ページ目と2ページ目の印刷範囲を分ける)
Bsh.Cells(2, 24) = i - 2
Worksheets(2).Copy after:=Sheets(Worksheets.Count)
Worksheets(Worksheets.Count).PageSetup.PrintArea = Bsh.Range(Bsh.Cells(1, 1), Bsh.Cells(38, 34)).Address
Worksheets(2).Copy after:=Sheets(Worksheets.Count)
Worksheets(Worksheets.Count).PageSetup.PrintArea = Bsh.Range(Bsh.Cells(39, 1), Bsh.Cells(76, 34)).Address
End If
Next
'配列を使ってコピペした全てのシートをアクティブにする
sheet_counts2 = Sheets.Count
ReDim sheet_container(sheet_counts1 + 1 To sheet_counts2)
For i = sheet_counts1 + 1 To sheet_counts2
sheet_container(i) = Sheets(i).Name
Next i
Sheets(sheet_container).Select
'PDF出力
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=folder_path & "写真番号" & Num1 & "~ 写真番号" & Num2 & ".pdf", Quality:=xlQualityStandard, OpenAfterPublish:=False
Application.DisplayAlerts = False
'コピペしたシート削除する
Worksheets(sheet_container).Delete
Application.DisplayAlerts = True
複数のページを1つのPDFファイルで出力するには、
配列Arrayでシートを選択してExportAsFixedFormatでPDF出力する
というコードにする必要があります。
コードの流れとしては、
印刷範囲を決める → シートをコピペする → 追加したシートを配列Arrayで選択 → ExportAsFixedFormatでPDF出力 → 追加したシートの削除
と言うイメージです。
なぜコピペしたシートをPDF出力後にわざわざ削除するのか?
と疑問に感じる方が多いと思いますが1つのPDFファイルで出力するにはこの回りくどい方法しかない!と思っています。
For~NextやFor~Eachを使って、
印刷範囲を選択 → PDF出力 → 印刷範囲を選択 → PDF出力 → ・・・
このコードでも複数のページをPDF出力することは可能ですが、PDFファイルが複数作成されてしまいます。
処理結果としてはこんな感じ
PDFファイルが複数出力されても問題ない!という方は、For~NextやFor~Eachを使ったマクロの方が簡単なのでおすすめです。
PDF出力マクロといっても、印刷範囲の指定やシートの指定方法によっていろんなコードの書き方があるので自分なりの方法を模索してみてください。
PDF出力マクロの導入方法
PDF出力マクロの導入手順を一つずつご紹介していきます。
様式の設定
マクロを設定していく前に様式の設定を行う必要があります。
業務内容によって様式を変更しても構わないのですが、コードも変更する必要があるので注意が必要です。
設定シートの作成
写真表シートの作成
VBAの設定
1.コードを編集するVBA画面を開く
2.標準モジュールを作成
3.Module1にコードを記入
PDF出力マクロのサンプルコード
1.PDF出力マクロのサンプルコード
Sub PDF保存()
Dim Ash As Worksheet
Set Ash = Sheets("設定")
Dim Bsh As Worksheet
Set Bsh = Sheets("写真表")
Dim folder_path As String
folder_path = ThisWorkbook.Path & "\"
Dim Num1 As Long
Dim sheet_container() As Variant
'写真番号を変数に格納
Num1 = Bsh.Cells(8, 38)
sheet_counts1 = Worksheets.Count
' フォルダの存在確認 --- 必要な場合のみ記述 ---
If Dir(folder_path, vbDirectory) = "" Then
MsgBox "指定のフォルダは存在しません。", vbExclamation, cnsTitle
Exit Sub
End If
'X6セルに記入された数字を変数に格納
i = Num1 + 2
'「設定」シートの11列目が空白の場合、A4ヨコ1枚分の印刷範囲を設定
If Ash.Cells(i, 11) = "" Then
Bsh.Cells(2, 24) = Num1
'「写真表」シートを右端にコピペする
Sheets(2).Copy after:=Sheets(Worksheets.Count)
'コピペしたシートで印刷範囲を設定する
Sheets(Sheets.Count).PageSetup.PrintArea = Bsh.Range(Bsh.Cells(1, 1), Bsh.Cells(38, 34)).Address
sheet_counts2 = Sheets.Count
'コピペしたシートをアクティブにする
Sheets(sheet_counts2).Select
'PDF出力
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=folder_path & "写真番号" & Bsh.Cells(2, 24) & ".pdf", Quality:=xlQualityStandard, OpenAfterPublish:=False
Application.DisplayAlerts = False
'コピペしたシート削除する
Sheets(sheet_counts2).Delete
Application.DisplayAlerts = True
Else
'「設定表」シートの145行目に写真データ情報がある場合、A4ヨコ2枚分の印刷範囲を設定
'「写真表」シートを右端にコピペする(2シート分作成し1ページ目と2ページ目の印刷範囲を分ける)
Bsh.Cells(2, 24) = Num1
Worksheets(2).Copy after:=Sheets(Worksheets.Count)
Worksheets(Worksheets.Count).PageSetup.PrintArea = Bsh.Range(Bsh.Cells(1, 1), Bsh.Cells(38, 34)).Address
Worksheets(2).Copy after:=Sheets(Worksheets.Count)
Worksheets(Worksheets.Count).PageSetup.PrintArea = Bsh.Range(Bsh.Cells(39, 1), Bsh.Cells(76, 34)).Address
sheet_counts2 = Sheets.Count
'配列を使ってコピペした全てのシートをアクティブにする
ReDim sheet_container(sheet_counts1 + 1 To sheet_counts2)
For i = sheet_counts1 + 1 To sheet_counts2
sheet_container(i) = Sheets(i).Name
Next i
Sheets(sheet_container).Select
'PDF出力
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=folder_path & "写真番号" & Bsh.Cells(2, 24) & ".pdf", Quality:=xlQualityStandard, OpenAfterPublish:=False
Application.DisplayAlerts = False
'コピペしたシート削除する
Worksheets(sheet_container).Delete
Application.DisplayAlerts = True
End If
End Sub
Sub PDF保存2()
Dim Ash As Worksheet
Set Ash = Sheets("設定")
Dim Bsh As Worksheet
Set Bsh = Sheets("写真表")
Dim folder_path As String
folder_path = ThisWorkbook.Path & "\"
Dim Num1, Num2 As Long
Dim sheet_counts2 As Long
Dim sheet_container() As Variant
'X3セル、Z3セルに記入された数字を変数に格納
Num1 = Bsh.Cells(4, 38)
Num2 = Bsh.Cells(4, 41)
sheet_counts1 = Worksheets.Count
' フォルダの存在確認 --- 必要な場合のみ記述 ---
If Dir(folder_path, vbDirectory) = "" Then
MsgBox "指定のフォルダは存在しません。", vbExclamation, cnsTitle
Exit Sub
End If
'X3セルの数字からZ3セルの数字までを繰り返し処理する
For i = Num1 + 2 To Num2 + 2
'「設定表」シートの145行目が空白の場合、A4ヨコ1枚分の印刷範囲を設定
If Ash.Cells(i, 11) = "" Then
'「写真表」シートのD6セルにX3セルからZ3セルまでの数字を繰り返し記入
Bsh.Cells(2, 24) = i - 2
Sheets(2).Copy after:=Sheets(Worksheets.Count)
Sheets(Sheets.Count).PageSetup.PrintArea = Bsh.Range(Bsh.Cells(1, 1), Bsh.Cells(38, 34)).Address
Else
'「設定表」シートの145行目に写真データ情報がある場合、A4ヨコ2枚分の印刷範囲を設定
'「写真表」シートを右端にコピペする(2シート分作成し1ページ目と2ページ目の印刷範囲を分ける)
Bsh.Cells(2, 24) = i - 2
Worksheets(2).Copy after:=Sheets(Worksheets.Count)
Worksheets(Worksheets.Count).PageSetup.PrintArea = Bsh.Range(Bsh.Cells(1, 1), Bsh.Cells(38, 34)).Address
Worksheets(2).Copy after:=Sheets(Worksheets.Count)
Worksheets(Worksheets.Count).PageSetup.PrintArea = Bsh.Range(Bsh.Cells(39, 1), Bsh.Cells(76, 34)).Address
End If
Next
'配列を使ってコピペした全てのシートをアクティブにする
sheet_counts2 = Sheets.Count
ReDim sheet_container(sheet_counts1 + 1 To sheet_counts2)
For i = sheet_counts1 + 1 To sheet_counts2
sheet_container(i) = Sheets(i).Name
Next i
Sheets(sheet_container).Select
'PDF出力
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=folder_path & "写真番号" & Num1 & "~ 写真番号" & Num2 & ".pdf", Quality:=xlQualityStandard, OpenAfterPublish:=False
Application.DisplayAlerts = False
'コピペしたシート削除する
Worksheets(sheet_container).Delete
Application.DisplayAlerts = True
End Sub
このコードをModule1にコピペしてください。
2.PDF出力マクロを実行するためのサンプルコード
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
If (Target.Row = 4) And (Target.Column = 45) Then
Call PDF保存2
Else
End If
If (Target.Row = 8) And (Target.Column = 45) Then
Call PDF保存
Else
End If
End Sub
このコードをSheet(写真表)にコピペしてください。
これでPDF出力マクロの導入が完了です。
必要な場所に紹介しているサンプルコードをコピペするだけでPDF出力マクロを導入することができるので、是非挑戦してみてください。
PDF出力マクロが設定されたエクセルファイルのダウンロード
サンプルとして紹介しているPDF出力マクロをダウンロードしてお使い頂くことができます。
設定されいるコードを業務内容に合わせた内容にアレンジして使いたい
サンプルのエクセルファイルに設定されている写真表の様式に合わせて仕事を進める
このような対応が可能な方は是非PDF出力マクロが設定されたエクセルファイルをダウンロードしてエクセル業務の効率化に役立ててみてください。
ただし、上記のような対応ができない!コードをアレンジする自信がない!という方はダウンロードではなく別の方法がおすすめです。
別の方法とは、「PDF出力マクロをあなたが行っている業務内容にアレンジしてもらうマクロ開発の依頼をする」という方法です。
下記のサイトでは、この記事で紹介しているPDF出力マクロを開発した私に直接、コードのアレンジを依頼できるマクロ開発依頼サービスを行っています。
PDF出力マクロのアレンジ依頼はこちら
「こんな処理を追加したい」「こんな様式にマクロを設定したい」など臨機応変に対応させて頂いております。
PDF出力マクロを導入してエクセル業務の効率をアップさせたいけどコードをアレンジできるか自身がない!という方はお気軽にお問合せください。
話が逸れてしまいましたが、さっそく下記でPDF出力マクロをダウンロードすることができます。
気になる方は是非ダウンロードしてお使いください。
ここから先は
¥ 600
この記事が気に入ったらサポートをしてみませんか?