【VBAでPDF出力】連続で編集されるシートを1つのPDFデータで保存する方法
連続で編集されるシートを1つのPDFデータで出力したい!
こんな要望にお答えします。
そもそも、
連続で編集されるシートを1つのPDFデータで出力する
ってどういうこと?
文章だけでは伝わりにくいのでこちらを参考にしてみてください。
上図は「連続印刷マクロ」の概要で、
For~Nextを使って「編集」→「印刷」を繰り返し処理
するという内容です。
この「印刷」を「1つのPDFデータで出力する」に置き換えたものが、
連続で編集されるシートを1つのPDFデータで出力する
です。
実際のエクセル業務に導入したマクロを使って、どのようなコードが必要なのかをご紹介します。
コードの「PrintOut」を「ExportAsFixedFormat」に置き換えればいいだけじゃないの?
と思われるかもしれませんが、そんな単純な話ではありません。
For~Nextを使って1つのシートを連続編集するマクロを導入することが多い!と言う方は是非参考にしてみてください。
目次
連続編集されるシートを1つのPDFデータで出力するVBA
設定されているPDF出力VBAの概要がこちら
- For~Next(繰り返し処理)で編集を繰り返す
- 編集処理後、シートを新規作成し内容をコピペ
- For~Next処理後、新規作成した複数のシートをアクティブにして配列を使ってPDF出力
- 新規作成した複数のシートを削除する
このようなコードにすることで、
1つのシート内で繰り返し更新される情報を1つのPDFデータで出力
することが可能です。
サンプルコードがこちら
For i = Num1 + 2 To Num2 + 2
If Ash.Cells(i, 11) = "" Then
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
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
これは実際のエクセル業務に導入した、
「写真を貼り付けるVBA」と「PDF出力マクロ」を組み合わせたマクロ
の一部コードを抜粋したものです。
1行目から13行目までがFor~Nextでの繰り返しVBA
14行目から配列を使ったPDF出力VBA
になっています。
For~Nextで1つのシートを繰り返し編集した結果を1つのPDFデータで出力したい!
という方は上記のコードを参考にしてみてください。
【サンプル】PDF出力VBAが設定された写真を貼り付けるマクロ
上記では、「1つのPDFデータで出力するVBA」のコードについて解説していますが、
実際どんな処理ができるの?
と疑問に感じる方がいらっしゃると思います。
なので、「1つのPDFデータで出力するVBA」がどのような処理をするのか具体的にイメージしてもらうために
PDF出力VBAが設定された写真を貼り付けるマクロの使い方と処理結果
をご紹介します。
使い方
1.「設定Sheet」に基本情報を入力
2.「設定Sheet」の番号を入力し「PDF出力」セルをダブルクリック
サンプルでは「番号1~番号3」を入力
使い方は以上です。
処理結果
3.番号1から番号3までのテキストと写真を様式に表示しPDF出力される
4.PDF出力結果
番号1から番号3のデータが1つのPDFデータで出力される
たったこれだけの操作で、大量の写真の貼付け作業とPDF出力を一瞬で処理することが可能です。
関連記事「PDF出力を完全自動化するマクロ」ではサンプルで紹介している写真を貼り付けるマクロが設定されたエクセルファイルをダウンロードしてすぐにお使い頂くことが可能です。
コードを少し改良するだけで写真を貼り付ける様式を変更することができます。
いろんな使い道があるので是非参考にしてみてください。
サンプルコード
下記のサンプルコードはModule1に記入されているコードをそのまま掲載しています。
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
全てのコードを掲載してしまうとめちゃくちゃ長くなってしまうので、 「写真を貼り付けるVBA」や「単ページの場合のPDF出力VBA」などは割愛しています。
【VBA】PDF出力の基本的な考え方
PDF出力VBAは、ExportAsFixedFormatメソッドを利用します。
構文がこちら
印刷範囲の調整 → PDFファイルの保存場所・名前を決定 → PDF出力実行
という流れでコードを入力していきます。
処理結果としてはこんな感じ
「ちょっと難しそうだなぁ。。。」と感じる方は、
ExportAsFixedFormatメソッドの「object」「Type」「FileName」3つの要素だけを設定
して使ってみてください。
3つの要素をどのように設定すればいいのかを具体的に説明します。
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=folder_path & “PDFデータ"
と記入した場合、各要素は以下のよう意味になります。
object・・・対象となるブックやシートを指定
→ActiveSheet
操作中のシートを対象とする
Type・・・出力形式を設定
→xlTypePDF
拡張子がPDF形式のファイルを作成する
FileName・・・保存先とファイル名を入力
→ThisWorkbook.Path & “\"& “PDFデータ"
マクロを設定したブックと同じ場所に「PDFデータ」というファイル名で出力される
難しく感じるポイントは「FileName」をどう定義するのかないでしょうか。
ファイル名にマクロ実行時の日付、時間を含めることでファイル名の被りによるエラーの発生を防ぐことができるのでおすすめです。
業務内容に合わせてPDF出力VBAを設定するには
マメBlogのマクロ開発依頼サービスで、サンプルとして紹介している「連続で編集されるシートを1つのPDFデータで出力するマクロ」を作成させていただきました。
作業をしていて感じたことは、
めちゃくちゃ難しい!!参考書やネットで調べても有益な情報があまり得られなかった
です。
なので、「1つのPDFデータで出力するマクロ」を業務内容に合わせてアレンジするには
この記事で紹介されるコードを自分で改良する
もしくは
マメBlogのマクロ開発依頼サービスを利用する
この2つの方法がおすすめです。
>>> マメBlogのマクロ開発依頼サービスはこちら
マメBlogでは業務内容に合わせたPDF出力マクロを数多く提供させて頂いており、
「作業効率がめめっちゃ上がった!」「もうPDF出力マクロなしでは仕事にならない!!」
などの評価を頂いております。
PDF出力作業に時間を費やしている!という方は是非PDF出力マクロの導入を検討してみてください。
ディスカッション
コメント一覧
まだ、コメントがありません