【VBAでPDF出力】連続で編集されるシートを1つのPDFデータで保存する方法

連続で編集されるシートを1つのPDFデータで出力したい!

 

こんな要望にお答えします。

 

そもそも、

連続で編集されるシートを1つのPDFデータで出力する

ってどういうこと?

 

文章だけでは伝わりにくいのでこちらを参考にしてみてください。

上図は「連続印刷マクロ」の概要で、

For~Nextを使って「編集」→「印刷」を繰り返し処理

するという内容です。

 

この「印刷」を「1つのPDFデータで出力する」に置き換えたものが、

連続で編集されるシートを1つのPDFデータで出力する

です。

 

実際のエクセル業務に導入したマクロを使って、どのようなコードが必要なのかをご紹介します。

 

コードの「PrintOut」を「ExportAsFixedFormat」に置き換えればいいだけじゃないの?

と思われるかもしれませんが、そんな単純な話ではありません。

 

Left Caption

疲れ果てた人

ちょっと回りくどくて複雑なVBAになります

 

For~Nextを使って1つのシートを連続編集するマクロを導入することが多い!と言う方は是非参考にしてみてください。

 

広告

連続編集されるシートを1つのPDFデータで出力するVBA

 

設定されているPDF出力VBAの概要がこちら

  1. For~Next(繰り返し処理)で編集を繰り返す
  2. 編集処理後、シートを新規作成し内容をコピペ
  3. For~Next処理後、新規作成した複数のシートをアクティブにして配列を使ってPDF出力
  4. 新規作成した複数のシートを削除する

 

このようなコードにすることで、

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データで出力したい!

という方は上記のコードを参考にしてみてください。

 

Left Caption

疲れ果てた人

いろいろ調べたのですが、私はこの方法しか思い浮かびませんでした。

 

【サンプル】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データで出力される

 

Left Caption

ガッツポーズの人

めちゃくちゃ簡単に使えそうですよね

たったこれだけの操作で、大量の写真の貼付け作業と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メソッドを利用します。

 

構文がこちら

object.ExportAsFixedFormat(Type, FileName, Quality, IncludeDocProperties, IgnorePrintAreas, From, To, OpenAfterPublish, FixedFormatExClassPtr)

 

印刷範囲の調整 → 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出力マクロの導入を検討してみてください。