当サイトはアフィリエイト広告を含んでいます。

【コピペ可】マクロでExcelをPDF保存するVBAコード

VBA

Excelで発注書や請求書、計算表などの書類を作成して、PDF保存する機会は多いかと思います。

そこで本記事では、マクロでExcelをPDF保存できるVBAのサンプルコードを紹介します。今回紹介するコードをコピペすることで、ワンクリックでPDF保存することができます。

他にも保存するときに、

  • PDFファイル名の付け方がバラバラ
  • 保存フォルダが統一されておらず、過去のPDFを探しにくい

といった悩みがでてくることもあります。

このコードをアレンジすることで、ファイル名を機械的に生成、フォルダ作成、フォルダ分けの機能をマクロに組み込むことも可能です。本記事では、そのアレンジ方法についても解説をしていきます。

VBAについて勉強したい方は、自分でアレンジをしていくことで、知識を増やすことができる構成にしてみましたので、ぜひ最後までご覧ください。

シート名でPDF保存するサンプルコード

まずは、シンプルにシート名でPDF保存するサンプルコードです。

このコードをコピーして標準モジュールに貼り付けて使用します。アクティブになっているシートがPDFとして保存されます。PDF保存先は、エクセルが存在しているフォルダ内となります。

Sub PDF保存する()
    
'    PDFファイル名と保存先の指定
    Dim PDFファイル名 As String, PDF保存パス As String
    PDFファイル名 = ActiveSheet.Name & ".pdf"
    PDF保存パス = ActiveWorkbook.Path & "\" & PDFファイル名
    
'    PDFが既存の場合、確認メッセージ
    Dim msg上書き確認 As String
    If Dir(PDF保存パス) <> "" Then
        msg上書き確認 = "同じ名前のPDFがすでに存在しています。上書きしますか?"
        If MsgBox(msg上書き確認, vbYesNo) = vbNo Then
            MsgBox "保存を中止します。"
            Exit Sub
        End If
    End If
    
'    PDF保存
    On Error GoTo PDF保存エラー
    ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=PDF保存パス
    On Error GoTo 0
    
'    フォルダを開く
    Shell "explorer.exe """ & ActiveWorkbook.Path & """", vbNormalFocus
    
    Exit Sub

PDF保存エラー:
    MsgBox "PDFを保存、もしくは上書きすることができませんでした。"

End Sub

このままでも使用できますが、いくつか注意点です。

  • PDF保存範囲=印刷設定範囲となります
  • PDFを開いている場合に上書きしようとすると、エラーになります
  • 「シート名.pdf」での保存のため、PDF名が重複してしまい上書き保存しかできない

こちらの3つ目が重要で、実務では上書き保存されると困る場面が多々ありますね。PDF保存名が重複のないようにするには、例えば請求書であれば、「請求書No.」等をPDF名に入れる方法が考えられます。

それでは、PDF名をアレンジするコードを次章で紹介します。

PDF名をアレンジする方法

上のサンプルコードの5行目

    PDFファイル名 = ActiveSheet.Name & ".pdf"

でPDFを保存する際のファイル名を指定しています。現状、この文は「アクティブになっているシート名.pdf」という意味になります。

日付を入れる場合

PDFのファイル名に日付を入れることで、いつ作成したかが一目で分かりますね。

日付をファイル名の頭に入れる場合は、5行目を

    PDFファイル名 = Format(Date, "yyyymmdd") & ActiveSheet.Name & ".pdf"

としてください。

Dateはマクロ実行日を表します。Format関数で、これを”yyyymmdd”形式(例えば2025/5/14であれば、20250514)に変換してくれます。

また文字列などは & を使って繋げます。

定型のファイル名にしたい場合

サンプルコードはシート名でしたが、PDF名を「請求書」など定型の文字列にしたい場合もありますよね。その場合は、ActiveSheet.Nameの部分を置換してください。

    PDFファイル名 = Format(Date, "yyyymmdd") & "請求書.pdf" '例として「請求書」

今回は例として「請求書」としました。このようにVBAコード内で文字列を使う場合はダブルコーテーション「」で挟みます。これで「20250514請求書.pdf」という形で保存することができるようになりました。

ただ、これでも日付が同じであれば上書き保存されてしまいますね。

一意のファイル名にしたい場合(シート内のデータを使う)

ファイル名が重複しないようにするために、シート内の値を使ってみましょう。下画像のような請求書フォーマットを例に、重複しない一意のデータをファイル名に入れてみましょう。

このフォーマットであれば、セルB11に請求書No「250001」が入っていますね。これを毎回ファイル名に入るようにします。

    PDFファイル名 = Format(Date, "yyyymmdd") & "請求書" & Range("B11").Value & ".pdf" 

“請求書”“.pdf”の間に、Range(“B11”).Valueを入れました。これでセルB11の値をファイル名に入れることができます。

もちろんセルB11はあくまで例ですので、ファイル名に入れたいセルに合わせて、“B11″の部分を修正してマクロを使ってください。またファイル名に使えない文字や空欄などが、該当のセルに入力されている場合、エラーが起きますのでご注意ください。

【コピペ可】ファイル名をアレンジしてPDF保存するコード

日付、”請求書”、セルの値を使ってPDF保存するコードは下記のようになります。5行目の部分が修正されています。

コピペ可ですが、上述の通り、“B11″の部分は適宜修正してご使用ください

Sub PDF保存する()
    
'    PDFファイル名と保存先の指定("B11"の部分は修正してご使用ください)
    Dim PDFファイル名 As String, PDF保存パス As String
    PDFファイル名 = Format(Date, "yyyymmdd") & "請求書" & Range("B11").Value & ".pdf"
    PDF保存パス = ActiveWorkbook.Path & "\" & PDFファイル名
    
'    PDFが既存の場合、確認メッセージ
    Dim msg上書き確認 As String
    If Dir(PDF保存パス) <> "" Then
        msg上書き確認 = "同じ名前のPDFがすでに存在しています。上書きしますか?"
        If MsgBox(msg上書き確認, vbYesNo) = vbNo Then
            MsgBox "保存を中止します。"
            Exit Sub
        End If
    End If
    
'    PDF保存
    On Error GoTo PDF保存エラー
    ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=PDF保存パス
    On Error GoTo 0
    
'    フォルダを開く
    Shell "explorer.exe """ & ActiveWorkbook.Path & """", vbNormalFocus
    
    Exit Sub

PDF保存エラー:
    MsgBox "PDFを保存、もしくは上書きすることができませんでした。"

End Sub

5行目の”B11″は適宜修正してご使用ください

これを実際に実行してみました。

左の「PDF保存」ボタンをクリックしてマクロを実行すると、右のように「20250519請求書250001.pdf」が保存されました。

フォルダ自動作成とフォルダ振り分け

セルの値(今回は請求書No)を使って、PDFファイル名に一意の値を入れて保存する方法をお伝えしました。このコードでも十分実務としては使えるかと思います。

しかし、このマクロを実行してたくさんのPDFを保存していくと、

このようにエクセルと同じフォルダにPDFが溜まってしまいます…。

そこで本章では、下画像のように、月毎のフォルダ作成と各フォルダへの保存をマクロで自動的に処理するコードを紹介します。

【コピペ可】フォルダを自動作成して各フォルダに保存するコード

まずはサンプルコードを掲載します。月毎のフォルダ振り分けの場合は、下記のコードを標準モジュールにコピーしてお使いください。

しつこいようですが、5行目のRange(“B11”)の部分に注意してください。

Sub PDF保存する()
    
'    PDFファイル名と保存先の指定("B11"の部分は修正してご使用ください)
    Dim PDFファイル名 As String, folderパス As String, PDF保存パス As String
    PDFファイル名 = Format(Date, "yyyymmdd") & "請求書" & Range("B11").Value & ".pdf"
    folderパス = ActiveWorkbook.Path & "\" & Format(Date, "yyyymm")
    Call フォルダがなければ作成(folderパス)
    
    PDF保存パス = folderパス & "\" & PDFファイル名
    
'    PDFが既存の場合、確認メッセージ
    Dim msg上書き確認 As String
    If Dir(PDF保存パス) <> "" Then
        msg上書き確認 = "同じ名前のPDFがすでに存在しています。上書きしますか?"
        If MsgBox(msg上書き確認, vbYesNo) = vbNo Then
            MsgBox "保存を中止します。"
            Exit Sub
        End If
    End If
    
'    PDF保存
    On Error GoTo PDF保存エラー
    ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=PDF保存パス
    On Error GoTo 0
    
'    フォルダを開く
    Shell "explorer.exe """ & folderパス & """", vbNormalFocus
    
    Exit Sub

PDF保存エラー:
    MsgBox "PDFを保存、もしくは上書きすることができませんでした。"

End Sub


Sub フォルダがなければ作成(ByVal フォルダパス As String)
    
'    フォルダが存在しない場合、フォルダ作成
    If Dir(フォルダパス, vbDirectory) = "" Then
        MkDir フォルダパス
    End If
    
End Sub

作成するフォルダ名

このコードでは6行目の部分で、「folderパス」という変数にフォルダパスを保存して指定しています。

    folderパス = ActiveWorkbook.Path & "\" & Format(Date, "yyyymm")

フォルダ名について解説します。下記のコードを“\”で繋げることで、保存するフォルダ階層を分けた形のパスにすることができます。

フォルダを作成するのにも使用するフォルダパスとなりますが、ここで注意点です。

作成できるフォルダはすでに存在しているフォルダ内に限ります。そのため、ActiveWorkbook.Pathの部分を存在していないフォルダに置換するとフォルダ作成ができず、エラーとなります。

ActiveWorkbook.Path

アクティブになっているエクセルブックが保存されているフォルダパスを指します。

Format(Date, “yyyymm”)

マクロ実行日の年月を指します。マクロ実行日が2025/5/19であれば、”202505″となります。

既存のフォルダ内にしかフォルダ作成はできない。

フォルダがなければ作成するマクロコード

「フォルダがなければ作成する」という処理は7行目のCall ~で呼び出しています。

    Call フォルダがなければ作成(folderパス)

ここで呼び出しているマクロは下記の「Sub フォルダがなければ作成」プロシージャです。

Sub フォルダがなければ作成(ByVal フォルダパス As String)
    
'    フォルダが存在しない場合、フォルダ作成
    If Dir(フォルダパス, vbDirectory) = "" Then
        MkDir フォルダパス
    End If
    
End Sub

このプロシージャで、先ほど変数に入れたフォルダがすでに存在しているかどうかを調べ、なければ作成します。

コード解説とPDF作成の注意点まとめ

ここまで紹介したサンプルコードをコピペして、PDF作成を効率化させましょう。

最後にこの章で、どんなコードが書かれているのか気になる方へ向けた解説と注意点をお伝えします。

PDFファイル名と保存先の指定

    Dim PDFファイル名 As String, folderパス As String, PDF保存パス As String
    PDFファイル名 = Format(Date, "yyyymmdd") & "請求書" & Range("B11").Value & ".pdf"
    folderパス = ActiveWorkbook.Path & "\" & Format(Date, "yyyymm")
    Call フォルダがなければ作成(folderパス)
    
    PDF保存パス = folderパス & "\" & PDFファイル名

このブロックでは、PDFファイル名folderパスPDF保存パスという3つの変数にそれぞれ文字列を代入しています。

PDFファイル名

PDFファイル名は、ここでは「日付(yyyymmdd形式)&請求書&B11の値&.pdf」としています。注意点としては、

  • ファイル名で使えない記号などを入れないこと(特にセル内の値を使う場合は注意)
  • 拡張子「.pdf」を忘れないこと
  • PDF名が重複する場合は上書きされること

が挙げられます。

folderパス

folderパスは、PDFを保存するフォルダを指定することができます。ここでは「アクティブになっているブック&”\”&年月(yyyymm形式)」を指定しています。年月フォルダがない場合は、フォルダ作成処理をCallで呼び出します。ここでの注意点は、

  • フォルダ名で使えない記号などを入れないこと
  • “\”(階層ごとにフォルダを繋げる記号)を忘れずに入れること

が挙げられます。

PDFが既存の場合、確認メッセージ

    Dim msg上書き確認 As String
    If Dir(PDF保存パス) <> "" Then
        msg上書き確認 = "同じ名前のPDFがすでに存在しています。上書きしますか?"
        If MsgBox(msg上書き確認, vbYesNo) = vbNo Then
            MsgBox "保存を中止します。"
            Exit Sub
        End If
    End If

PDFを保存する際、すでに存在しているパスと同名の場合、自動的に上書きされてしまいます。これでは不便な場面もありますので、確認メッセージを出して、保存を中止する分岐を用意しています。

PDF保存(エラー処理)

    On Error GoTo PDF保存エラー
    ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=PDF保存パス
    On Error GoTo 0

PDF保存エラー:
    MsgBox "PDFを保存、もしくは上書きすることができませんでした。"

PDF保存はActiveSheet.Exportから始まる1行でできます。

  • アクティブになっているシートをPDF保存する
  • 設定されている印刷範囲でPDF保存する

という点に注意してください。

On Error GoTo PDF保存エラーでは、PDF保存できなかった場合に、メッセージを表示する処理までスキップする文言です。

フォルダを開く

    Shell "explorer.exe """ & folderパス & """", vbNormalFocus

保存したフォルダを開く場合の1行の処理です。指定したフォルダパスを入力してください。

これらに注意しながら、サンプルコードをお使いください。

この記事を書いた人

関西の非IT企業で働く非エンジニア。
入社してからVBAを勉強し始めて、マクロで業務効率化に貢献。
「非エンジニアの方にも分かりやすく」を心がけて、実務で使えるVBAやExcelについて書いていきます。

フォローする
VBAサンプルコード集
シェアする

コメント

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