<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>PDF出力 &#8211; biz-tactics</title>
	<atom:link href="https://mashukabu.com/tag/pdf%E5%87%BA%E5%8A%9B/feed/" rel="self" type="application/rss+xml" />
	<link>https://mashukabu.com</link>
	<description></description>
	<lastBuildDate>Fri, 12 Jun 2026 21:59:58 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>

<image>
	<url>https://mashukabu.com/wp-content/uploads/2022/04/cropped-site-icon-32x32.png</url>
	<title>PDF出力 &#8211; biz-tactics</title>
	<link>https://mashukabu.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>VBAでシートをPDF出力・自動保存する方法｜ExportAsFixedFormatで請求書・報告書を自動化</title>
		<link>https://mashukabu.com/vba-export-pdf/</link>
					<comments>https://mashukabu.com/vba-export-pdf/#respond</comments>
		
		<dc:creator><![CDATA[まっしゅ]]></dc:creator>
		<pubDate>Fri, 12 Jun 2026 21:59:58 +0000</pubDate>
				<category><![CDATA[VBA・マクロ]]></category>
		<category><![CDATA[Excel自動化]]></category>
		<category><![CDATA[ExportAsFixedFormat]]></category>
		<category><![CDATA[PDF出力]]></category>
		<category><![CDATA[VBA]]></category>
		<category><![CDATA[マクロ]]></category>
		<category><![CDATA[月次報告]]></category>
		<category><![CDATA[請求書]]></category>
		<guid isPermaLink="false">https://mashukabu.com/?p=8003</guid>

					<description><![CDATA[VBAでExcelシートをPDF出力・自動保存する方法を解説。ExportAsFixedFormatの使い方、保存先フォルダ指定、ファイル名への日付自動付与、複数シート一括PDF化、印刷範囲の指定まで実用サンプル付きで紹介します。]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">毎月、請求書や月次報告書を1枚ずつPDFに保存していませんか。「ファイル」→「エクスポート」→「PDFの作成」→保存先選択→ファイル名入力。1枚なら数十秒ですが、取引先10社・部署5部門となると、これだけで30分が消えていきます。</p>



<p class="wp-block-paragraph">この作業はVBAの <code>ExportAsFixedFormat</code> メソッドで丸ごと自動化できます。ボタン1つで保存先フォルダの作成、日付入りファイル名の生成、印刷範囲の制御まで自動でこなせます。</p>



<p class="wp-block-paragraph">この記事では、<code>ExportAsFixedFormat</code> の基本構文から実用サンプルまでを順に解説します。具体的には、保存先フォルダの自動作成、ファイル名への日付付与、複数シート一括PDF化、印刷範囲の指定です。請求書や月次報告書の自動保存テンプレートも掲載しているので、明日からそのまま現場で使えます。</p>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-1" checked><label class="toc-title" for="toc-checkbox-1">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">VBAでPDF出力するExportAsFixedFormatとは？</a><ol><li><a href="#toc2" tabindex="0">ExportAsFixedFormatでできること</a></li><li><a href="#toc3" tabindex="0">手動PDF保存との違い</a></li></ol></li><li><a href="#toc4" tabindex="0">ExportAsFixedFormatの基本構文</a><ol><li><a href="#toc5" tabindex="0">構文の基本形</a></li><li><a href="#toc6" tabindex="0">主要な引数一覧</a></li><li><a href="#toc7" tabindex="0">VBE（Visual Basic Editor）の起動とコードの準備</a></li></ol></li><li><a href="#toc8" tabindex="0">VBAで単一シートをPDF出力する基本コード</a><ol><li><a href="#toc9" tabindex="0">シート名で出力対象を指定する</a></li></ol></li><li><a href="#toc10" tabindex="0">ファイル名に日付を自動付与する</a><ol><li><a href="#toc11" tabindex="0">Format関数で日付を文字列に変換する</a></li><li><a href="#toc12" tabindex="0">日付フォーマットの主な書式</a></li></ol></li><li><a href="#toc13" tabindex="0">保存先フォルダを自動作成する</a><ol><li><a href="#toc14" tabindex="0">MkDir関数でフォルダを作成する</a></li><li><a href="#toc15" tabindex="0">階層フォルダを一気に作成するMkDirRecursive</a></li></ol></li><li><a href="#toc16" tabindex="0">複数シートを一括PDF出力する</a><ol><li><a href="#toc17" tabindex="0">For Eachで全シートを個別PDF化する</a></li><li><a href="#toc18" tabindex="0">特定シートだけを1つのPDFにまとめる</a></li><li><a href="#toc19" tabindex="0">シート名でフィルタしてPDF化する</a></li></ol></li><li><a href="#toc20" tabindex="0">印刷範囲を指定してPDF化する</a><ol><li><a href="#toc21" tabindex="0">PrintAreaで印刷範囲を設定する</a></li><li><a href="#toc22" tabindex="0">動的に印刷範囲を決める（最終行まで）</a></li><li><a href="#toc23" tabindex="0">印刷範囲を無視してシート全体をPDF化する</a></li></ol></li><li><a href="#toc24" tabindex="0">実用サンプル: 請求書を取引先別にPDF自動保存</a><ol><li><a href="#toc25" tabindex="0">想定シナリオ</a></li><li><a href="#toc26" tabindex="0">完成コード</a></li></ol></li><li><a href="#toc27" tabindex="0">よくあるエラーと対処法</a><ol><li><a href="#toc28" tabindex="0">実行時エラー&#8217;1004&#8242;: ドキュメントが保存されませんでした</a></li><li><a href="#toc29" tabindex="0">PDFが空白・1ページ目しか出ない</a></li><li><a href="#toc30" tabindex="0">文字が小さすぎてPDFが読めない</a></li><li><a href="#toc31" tabindex="0">実行時エラー&#8217;9&#8242;: インデックスが有効範囲にありません</a></li><li><a href="#toc32" tabindex="0">PDFの画質を変えたい</a></li></ol></li><li><a href="#toc33" tabindex="0">ExportAsFixedFormatと他の保存方法の使い分け</a></li><li><a href="#toc34" tabindex="0">まとめ</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">VBAでPDF出力するExportAsFixedFormatとは？</span></h2>



<p class="wp-block-paragraph"><code>ExportAsFixedFormat</code> は、ExcelのワークシートやブックをPDFまたはXPS形式で書き出すVBAメソッドです。Excel 2007以降のすべてのバージョンで標準搭載されており、追加のアドインやライブラリは不要です。</p>



<p class="wp-block-paragraph">「ファイル」→「エクスポート」→「PDFの作成」と同じ動作を、コードから自動実行できると考えてください。手動操作とまったく同じレイアウト・印刷品質でPDFを生成できます。</p>



<h3 class="wp-block-heading"><span id="toc2">ExportAsFixedFormatでできること</span></h3>



<p class="wp-block-paragraph">このメソッド1つで、PDF保存に関するほとんどの操作を自動化できます。</p>



<ul class="wp-block-list"><li>単一シートをPDF化して任意フォルダへ保存</li><li>ブック全体（複数シート）を1つのPDFにまとめて保存</li><li>印刷範囲（PrintArea）で指定した部分だけをPDF化</li><li>ファイル名にシート名・日付・取引先名などを自動で組み込む</li><li>保存先フォルダを動的に作成（年月別・部署別など）</li><li>パスワード設定、ページ範囲指定、画質指定</li></ul>



<p class="wp-block-paragraph">手動でPDF保存する場合と違って、保存先・ファイル名・対象範囲がコードに固定化されます。そのため、毎回同じ品質でアウトプットでき、担当者が変わってもファイル名の表記ゆれが発生しません。</p>



<h3 class="wp-block-heading"><span id="toc3">手動PDF保存との違い</span></h3>



<p class="wp-block-paragraph">手動とVBAでは、所要時間と再現性が決定的に違います。</p>



<figure class="wp-block-table"><table><thead><tr><th>項目</th><th>手動操作</th><th>VBA（ExportAsFixedFormat）</th></tr></thead><tbody><tr><td>1ファイル保存時間</td><td>30秒〜1分</td><td>0.5秒未満</td></tr><tr><td>10ファイル保存時間</td><td>5〜10分</td><td>約3秒</td></tr><tr><td>ファイル名の統一性</td><td>担当者依存で揺れる</td><td>コードで完全統一</td></tr><tr><td>保存先フォルダ作成</td><td>手動でmkdir</td><td>コードで自動作成</td></tr><tr><td>印刷範囲指定</td><td>毎回設定</td><td>コードで固定</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">10ファイル以上のPDF出力を月次で行う作業なら、初回1時間の自動化で年間60時間以上が浮きます。</p>



<h2 class="wp-block-heading"><span id="toc4">ExportAsFixedFormatの基本構文</span></h2>



<p class="wp-block-paragraph"><code>ExportAsFixedFormat</code> メソッドは、ワークシートやブックなど、PDF化したいオブジェクトに対して呼び出します。</p>



<h3 class="wp-block-heading"><span id="toc5">構文の基本形</span></h3>



<p class="wp-block-paragraph">最もシンプルな書き方は次のとおりです。</p>



<pre class="wp-block-code"><code>Worksheets(&quot;Sheet1&quot;).ExportAsFixedFormat _
    Type:=xlTypePDF, _
    Filename:=&quot;C:PDFsample.pdf&quot;</code></pre>



<p class="wp-block-paragraph"><code>Type:=xlTypePDF</code> でPDF形式を指定し、<code>Filename</code> で保存先のフルパスを渡します。たったこれだけで、Sheet1がPDFとして指定パスに保存されます。</p>



<h3 class="wp-block-heading"><span id="toc6">主要な引数一覧</span></h3>



<p class="wp-block-paragraph"><code>ExportAsFixedFormat</code> メソッドにはオプション引数が複数あります。実務でよく使うのは次の6つです。</p>



<figure class="wp-block-table"><table><thead><tr><th>引数名</th><th>役割</th><th>主な値</th></tr></thead><tbody><tr><td>Type</td><td>出力形式</td><td>xlTypePDF / xlTypeXPS</td></tr><tr><td>Filename</td><td>保存先フルパス</td><td>&#8220;C:PDFsample.pdf&#8221;</td></tr><tr><td>Quality</td><td>画質</td><td>xlQualityStandard / xlQualityMinimum</td></tr><tr><td>IncludeDocProperties</td><td>プロパティ埋込</td><td>True / False</td></tr><tr><td>IgnorePrintAreas</td><td>印刷範囲を無視</td><td>True / False（既定False）</td></tr><tr><td>OpenAfterPublish</td><td>保存後にPDFを開く</td><td>True / False（既定False）</td></tr></tbody></table></figure>



<p class="wp-block-paragraph"><code>IgnorePrintAreas</code> は重要です。既定値の <code>False</code> だと印刷範囲（PrintArea）の設定が反映されます。<code>True</code> を指定するとシート全体がPDF化されます。</p>



<h3 class="wp-block-heading"><span id="toc7">VBE（Visual Basic Editor）の起動とコードの準備</span></h3>



<p class="wp-block-paragraph">VBAコードを実行するには、まずVBEを開いて標準モジュールにコードを貼り付けます。</p>



<ol class="wp-block-list"><li>Excelを開いた状態で <code>Alt + F11</code> キーを押す（VBEが起動）</li><li>リボン経由の場合は「開発」タブ→「Visual Basic」をクリック</li><li>「開発」タブが表示されていない場合は、「ファイル」→「オプション」→「リボンのユーザー設定」で「開発」にチェック</li><li>VBE画面で「挿入」→「標準モジュール」をクリック</li><li>開いたコードウィンドウに本記事のサンプルを貼り付けて <code>F5</code> で実行</li></ol>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p><strong>NOTE</strong></p><p>ファイルは「Excel マクロ有効ブック（.xlsm）」または「Excel バイナリブック（.xlsb）」で保存してください。通常の <code>.xlsx</code> ではマクロが保存されません。</p></blockquote>



<h2 class="wp-block-heading"><span id="toc8">VBAで単一シートをPDF出力する基本コード</span></h2>



<p class="wp-block-paragraph">まずは1枚のシートをPDF化する最小構成のコードから始めます。</p>



<pre class="wp-block-code"><code>Sub Sample_ExportSinglePDF()
    '--- 保存先パスを指定 ---
    Dim sPath As String
    sPath = &quot;C:PDFreport.pdf&quot;

    '--- アクティブシートをPDF出力 ---
    ActiveSheet.ExportAsFixedFormat _
        Type:=xlTypePDF, _
        Filename:=sPath, _
        Quality:=xlQualityStandard, _
        OpenAfterPublish:=False

    MsgBox &quot;PDF出力完了: &quot; &amp; sPath
End Sub</code></pre>



<p class="wp-block-paragraph">このコードを実行すると、現在表示中のシートが <code>C:PDFreport.pdf</code> として保存されます。<code>OpenAfterPublish:=False</code> にしておけば、PDFが自動で開くことがなく、バッチ処理向きの動作になります。</p>



<h3 class="wp-block-heading"><span id="toc9">シート名で出力対象を指定する</span></h3>



<p class="wp-block-paragraph">特定のシートだけをPDF化したい場合は、<code>ActiveSheet</code> の代わりに <code>Worksheets("シート名")</code> で対象を明示します。</p>



<pre class="wp-block-code"><code>Sub Sample_ExportNamedSheet()
    '--- シート名で出力対象を指定 ---
    Dim sBefore As String
    Dim sAfter As String
    sBefore = &quot;請求書ひな形&quot;
    sAfter = &quot;C:PDF請求書.pdf&quot;

    Worksheets(sBefore).ExportAsFixedFormat _
        Type:=xlTypePDF, _
        Filename:=sAfter

    MsgBox &quot;出力: &quot; &amp; sBefore &amp; &quot; → &quot; &amp; sAfter
End Sub</code></pre>



<p class="wp-block-paragraph"><code>Worksheets("請求書ひな形")</code> のようにシートを明示すると、どのシートがアクティブでも常に同じシートをPDF化できます。複数シートを処理するブックでは、必ずこの形式で対象を指定してください。</p>



<h2 class="wp-block-heading"><span id="toc10">ファイル名に日付を自動付与する</span></h2>



<p class="wp-block-paragraph">毎日・毎月の繰り返し処理では、ファイル名に日付を入れて履歴を残すのが定石です。同名ファイルの上書きを防げます。</p>



<h3 class="wp-block-heading"><span id="toc11">Format関数で日付を文字列に変換する</span></h3>



<p class="wp-block-paragraph"><code>Format</code> 関数は、日付や数値を任意の書式の文字列に変換するVBA組み込み関数です。</p>



<pre class="wp-block-code"><code>Sub Sample_DatedFilename()
    '--- 日付付きファイル名を生成 ---
    Dim sToday As String
    Dim sPath As String
    sToday = Format(Date, &quot;yyyymmdd&quot;)
    sPath = &quot;C:PDF日報_&quot; &amp; sToday &amp; &quot;.pdf&quot;

    '--- アクティブシートを日付付きファイル名で出力 ---
    ActiveSheet.ExportAsFixedFormat _
        Type:=xlTypePDF, _
        Filename:=sPath

    MsgBox &quot;保存完了: &quot; &amp; sPath
End Sub</code></pre>



<p class="wp-block-paragraph"><code>Format(Date, "yyyymmdd")</code> は、今日の日付を <code>20260509</code> のような8桁文字列に変換します。これをファイル名に組み込むと、<code>日報_20260509.pdf</code> というファイルが生成されます。</p>



<h3 class="wp-block-heading"><span id="toc12">日付フォーマットの主な書式</span></h3>



<p class="wp-block-paragraph"><code>Format</code> 関数の書式指定は、用途によって使い分けます。</p>



<figure class="wp-block-table"><table><thead><tr><th>書式指定</th><th>出力例</th><th>用途</th></tr></thead><tbody><tr><td>yyyymmdd</td><td>20260509</td><td>日次ファイル（短縮）</td></tr><tr><td>yyyy-mm-dd</td><td>2026-05-09</td><td>日次ファイル（区切り付き）</td></tr><tr><td>yyyymm</td><td>202605</td><td>月次ファイル</td></tr><tr><td>yyyy年m月</td><td>2026年5月</td><td>報告書名向け</td></tr><tr><td>yyyymmdd_hhmmss</td><td>20260509_143052</td><td>同日複数回保存（時刻付き）</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">同じ日に複数回PDFを出力する可能性があるなら、<code>hhmmss</code>（時刻）まで含めるとファイルがぶつかりません。<code>Format(Now, "yyyymmdd_hhmmss")</code> のように <code>Now</code> 関数を使います。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p><strong>TIP</strong></p><p>ファイル名にシート名を含めたい場合は、<code>ActiveSheet.Name & "_" & sToday & ".pdf"</code> のように連結します。シートを追加するたびに自動で命名されるため、保守性が高くなります。</p></blockquote>



<h2 class="wp-block-heading"><span id="toc13">保存先フォルダを自動作成する</span></h2>



<p class="wp-block-paragraph">「保存先フォルダが存在しないとエラーになる」のはVBA初心者がつまずきやすいポイントです。フォルダを動的に作成する処理を入れておくと、毎月新しいフォルダが必要になっても安全に運用できます。</p>



<h3 class="wp-block-heading"><span id="toc14">MkDir関数でフォルダを作成する</span></h3>



<p class="wp-block-paragraph">VBAの <code>MkDir</code> 関数は、指定パスにフォルダを作成します。ただし、すでに存在するフォルダに <code>MkDir</code> を実行するとエラーになります。<code>Dir</code> 関数で存在チェックしてから作成するのが定石です。</p>



<pre class="wp-block-code"><code>Sub Sample_CreateFolderAndExport()
    '--- 保存先フォルダのパスを生成 ---
    Dim sFolder As String
    Dim sFile As String
    Dim sToday As String
    sToday = Format(Date, &quot;yyyymm&quot;)
    sFolder = &quot;C:PDF&quot; &amp; sToday
    sFile = sFolder &amp; &quot;日報_&quot; &amp; Format(Date, &quot;yyyymmdd&quot;) &amp; &quot;.pdf&quot;

    '--- フォルダが存在しなければ作成 ---
    If Dir(sFolder, vbDirectory) = &quot;&quot; Then
        MkDir sFolder
    End If

    '--- PDFを出力 ---
    ActiveSheet.ExportAsFixedFormat _
        Type:=xlTypePDF, _
        Filename:=sFile

    MsgBox &quot;保存完了: &quot; &amp; sFile
End Sub</code></pre>



<p class="wp-block-paragraph">このコードでは、<code>C:PDF202605</code> という年月別フォルダを自動作成し、その中に日付付きPDFを保存します。月が変わるたびに自動で新しいフォルダが作られるため、年間ファイル管理がスッキリします。</p>



<h3 class="wp-block-heading"><span id="toc15">階層フォルダを一気に作成するMkDirRecursive</span></h3>



<p class="wp-block-paragraph"><code>MkDir</code> は1階層しか作れません。<code>C:PDF2026 5</code> のような多階層をまとめて作りたい場合は、自作関数を1つ用意しておくと便利です。</p>



<pre class="wp-block-code"><code>Sub MkDirRecursive(ByVal sPath As String)
    '--- 階層フォルダを再帰的に作成 ---
    Dim sParent As String

    If Dir(sPath, vbDirectory) &lt;&gt; &quot;&quot; Then Exit Sub

    sParent = Left(sPath, InStrRev(sPath, &quot;&quot;) - 1)
    If Len(sParent) &gt; 0 Then
        MkDirRecursive sParent
    End If
    MkDir sPath
End Sub

Sub Sample_DeepFolder()
    '--- 階層フォルダ + PDF出力 ---
    Dim sFolder As String
    Dim sFile As String
    sFolder = &quot;C:PDF&quot; &amp; Format(Date, &quot;yyyy&quot;) &amp; &quot;&quot; &amp; Format(Date, &quot;mm&quot;)
    sFile = sFolder &amp; &quot;日報.pdf&quot;

    MkDirRecursive sFolder

    ActiveSheet.ExportAsFixedFormat _
        Type:=xlTypePDF, _
        Filename:=sFile
End Sub</code></pre>



<p class="wp-block-paragraph"><code>MkDirRecursive</code> を1度書いておくと、年/月/日の3階層構造でも安心してフォルダを生成できます。<code>InStrRev</code> で末尾の <code></code> 位置を特定し、親フォルダから再帰的に作成する仕組みです。</p>



<h2 class="wp-block-heading"><span id="toc16">複数シートを一括PDF出力する</span></h2>



<p class="wp-block-paragraph">請求書を取引先ごとに、月次報告を部署ごとに分けて保存する場合は、ループで複数シートを順番にPDF化します。</p>



<h3 class="wp-block-heading"><span id="toc17">For Eachで全シートを個別PDF化する</span></h3>



<p class="wp-block-paragraph">ブック内のすべてのシートを、シート名でPDFファイルに分けて保存するコードです。</p>



<pre class="wp-block-code"><code>Sub Sample_ExportAllSheetsSeparately()
    '--- 全シートを個別PDFで出力 ---
    Dim ws As Worksheet
    Dim sFolder As String
    Dim sFile As String
    Dim sToday As String
    sToday = Format(Date, &quot;yyyymmdd&quot;)
    sFolder = &quot;C:PDF&quot; &amp; sToday

    '--- フォルダ作成 ---
    If Dir(sFolder, vbDirectory) = &quot;&quot; Then
        MkDir sFolder
    End If

    '--- 全シートをループ ---
    For Each ws In ThisWorkbook.Worksheets
        sFile = sFolder &amp; &quot;&quot; &amp; ws.Name &amp; &quot;.pdf&quot;
        ws.ExportAsFixedFormat _
            Type:=xlTypePDF, _
            Filename:=sFile
    Next ws

    MsgBox &quot;全シートのPDF出力完了&quot;
End Sub</code></pre>



<p class="wp-block-paragraph"><code>For Each ws In ThisWorkbook.Worksheets</code> で、ブック内のすべてのワークシートを順に処理します。10シートあれば、10ファイルのPDFが一気に作られます。</p>



<p class="wp-block-paragraph"><code>For</code> ループの基本構文は<a href="https://mashukabu.com/excel-vba-howto-use-for/">Excel VBAでFor文を使う方法</a>を参照してください。コレクション処理に最適化された <code>For Each</code> は<a href="https://mashukabu.com/vba-howto-use-for-each-next/">Excel VBAでFor Each Nextを使う方法</a>で解説しています。</p>



<h3 class="wp-block-heading"><span id="toc18">特定シートだけを1つのPDFにまとめる</span></h3>



<p class="wp-block-paragraph">複数シートを「1つのPDFファイル」としてまとめて出力するパターンもよく使います。役員報告用の資料一式などです。</p>



<pre class="wp-block-code"><code>Sub Sample_ExportSelectedSheetsAsOnePDF()
    '--- 指定シートを配列で選択して1つのPDFに ---
    Dim sFile As String
    sFile = &quot;C:PDF月次報告_&quot; &amp; Format(Date, &quot;yyyymm&quot;) &amp; &quot;.pdf&quot;

    '--- 複数シートを選択 ---
    ThisWorkbook.Sheets(Array(&quot;売上&quot;, &quot;コスト&quot;, &quot;利益&quot;)).Select

    '--- 選択中のシートをまとめてPDF化 ---
    ActiveSheet.ExportAsFixedFormat _
        Type:=xlTypePDF, _
        Filename:=sFile

    '--- 選択を解除（先頭シートを単独選択） ---
    ThisWorkbook.Sheets(1).Select

    MsgBox &quot;結合PDF出力完了: &quot; &amp; sFile
End Sub</code></pre>



<p class="wp-block-paragraph"><code>Sheets(Array("売上", "コスト", "利益")).Select</code> で複数シートを同時選択した状態にしておき、<code>ActiveSheet.ExportAsFixedFormat</code> を呼ぶと、選択中のシートがすべて1つのPDFにまとめられます。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p><strong>NOTE</strong></p><p>ブック全体をまとめたい場合は <code>ThisWorkbook.ExportAsFixedFormat</code> を使います。<code>ActiveSheet</code> ではなくブック自体に対してメソッドを呼ぶと、すべてのシートが1ファイルにまとまります。</p></blockquote>



<h3 class="wp-block-heading"><span id="toc19">シート名でフィルタしてPDF化する</span></h3>



<p class="wp-block-paragraph">「月次」で始まるシートだけPDF化したい、といった条件付き出力も可能です。</p>



<pre class="wp-block-code"><code>Sub Sample_ExportFilteredSheets()
    '--- 「月次」で始まるシートだけ個別PDFに ---
    Dim ws As Worksheet
    Dim sFolder As String
    sFolder = &quot;C:PDF月次レポート_&quot; &amp; Format(Date, &quot;yyyymm&quot;)

    If Dir(sFolder, vbDirectory) = &quot;&quot; Then
        MkDir sFolder
    End If

    For Each ws In ThisWorkbook.Worksheets
        '--- シート名先頭が「月次」のものだけ処理 ---
        If Left(ws.Name, 2) = &quot;月次&quot; Then
            ws.ExportAsFixedFormat _
                Type:=xlTypePDF, _
                Filename:=sFolder &amp; &quot;&quot; &amp; ws.Name &amp; &quot;.pdf&quot;
        End If
    Next ws
End Sub</code></pre>



<p class="wp-block-paragraph"><code>If Left(ws.Name, 2) = "月次" Then</code> の条件で、シート名の先頭2文字が「月次」のシートだけをPDF化します。命名規則を活用すると、ブックを開きっぱなしのまま対象だけ抽出して出力できます。</p>



<h2 class="wp-block-heading"><span id="toc20">印刷範囲を指定してPDF化する</span></h2>



<p class="wp-block-paragraph">シート全体ではなく、特定のセル範囲だけをPDFにしたい場面もあります。請求書テンプレートの「明細部分のみ」や、ダッシュボードの「グラフ部分のみ」など、用途は多岐にわたります。</p>



<h3 class="wp-block-heading"><span id="toc21">PrintAreaで印刷範囲を設定する</span></h3>



<p class="wp-block-paragraph">ワークシートの <code>PageSetup.PrintArea</code> プロパティに範囲文字列を代入すると、その範囲だけが印刷対象になります。</p>



<pre class="wp-block-code"><code>Sub Sample_ExportWithPrintArea()
    '--- 印刷範囲を設定してPDF化 ---
    Dim ws As Worksheet
    Set ws = Worksheets(&quot;請求書&quot;)

    '--- 印刷範囲を A1:F30 に固定 ---
    ws.PageSetup.PrintArea = &quot;A1:F30&quot;

    '--- 印刷範囲だけをPDF出力 ---
    ws.ExportAsFixedFormat _
        Type:=xlTypePDF, _
        Filename:=&quot;C:PDF請求書.pdf&quot;, _
        IgnorePrintAreas:=False
End Sub</code></pre>



<p class="wp-block-paragraph"><code>IgnorePrintAreas:=False</code>（既定値）にしておくと、<code>PrintArea</code> の設定が反映されます。<code>A1:F30</code> の範囲外にあるメモやコメント欄はPDFに含まれなくなります。</p>



<h3 class="wp-block-heading"><span id="toc22">動的に印刷範囲を決める（最終行まで）</span></h3>



<p class="wp-block-paragraph">データが日々増えるシートでは、最終行まで自動で印刷範囲にしたいケースがあります。<code>Cells(Rows.Count, 1).End(xlUp).Row</code> で最終行を取得します。</p>



<pre class="wp-block-code"><code>Sub Sample_DynamicPrintArea()
    '--- 動的に印刷範囲を決めてPDF化 ---
    Dim ws As Worksheet
    Dim lastRow As Long
    Dim sArea As String

    Set ws = Worksheets(&quot;売上一覧&quot;)
    lastRow = ws.Cells(Rows.Count, 1).End(xlUp).Row
    sArea = &quot;A1:F&quot; &amp; lastRow

    '--- 印刷範囲を動的に設定 ---
    ws.PageSetup.PrintArea = sArea

    ws.ExportAsFixedFormat _
        Type:=xlTypePDF, _
        Filename:=&quot;C:PDF売上一覧_&quot; &amp; Format(Date, &quot;yyyymmdd&quot;) &amp; &quot;.pdf&quot;

    MsgBox &quot;印刷範囲 &quot; &amp; sArea &amp; &quot; をPDF化しました&quot;
End Sub</code></pre>



<p class="wp-block-paragraph"><code>lastRow</code> の取得方法は<a href="https://mashukabu.com/excel-vba-howto-get-lastrow/">Excel VBAでLastRowを取得する方法</a>で詳しく解説しています。データが10行のときも1000行のときも、自動でフィットした範囲のPDFが生成できます。</p>



<h3 class="wp-block-heading"><span id="toc23">印刷範囲を無視してシート全体をPDF化する</span></h3>



<p class="wp-block-paragraph">逆に「シート全体を必ずPDF化したい」場合は、<code>IgnorePrintAreas:=True</code> を指定します。</p>



<pre class="wp-block-code"><code>Sub Sample_IgnorePrintArea()
    '--- 印刷範囲設定を無視してシート全体をPDF化 ---
    ActiveSheet.ExportAsFixedFormat _
        Type:=xlTypePDF, _
        Filename:=&quot;C:PDF全体.pdf&quot;, _
        IgnorePrintAreas:=True
End Sub</code></pre>



<p class="wp-block-paragraph">既存ブックに古い <code>PrintArea</code> が残っていると、意図せず一部しかPDFにならないトラブルが起きます。事前に <code>True</code> で全体出力するか、<code>PrintArea = ""</code> でリセットするとトラブルを防げます。</p>



<h2 class="wp-block-heading"><span id="toc24">実用サンプル: 請求書を取引先別にPDF自動保存</span></h2>



<p class="wp-block-paragraph">ここまで学んだ要素を組み合わせて、実務で使える請求書PDF自動保存マクロを作ります。</p>



<h3 class="wp-block-heading"><span id="toc25">想定シナリオ</span></h3>



<p class="wp-block-paragraph">「取引先一覧」シートにA列：取引先名、B列：請求金額が入力されています。マクロを実行すると、「請求書ひな形」シートに各取引先の情報を流し込み、取引先名のPDFを <code>C:請求書YYYYMM</code> フォルダに自動保存します。</p>



<h3 class="wp-block-heading"><span id="toc26">完成コード</span></h3>



<pre class="wp-block-code"><code>Sub ExportInvoicesPerClient()
    '--- 請求書を取引先別にPDF自動保存 ---
    Dim wsList As Worksheet
    Dim wsTpl As Worksheet
    Dim sFolder As String
    Dim sFile As String
    Dim sClient As String
    Dim sAmount As String
    Dim lastRow As Long
    Dim i As Long

    Set wsList = Worksheets(&quot;取引先一覧&quot;)
    Set wsTpl = Worksheets(&quot;請求書ひな形&quot;)

    '--- 保存先フォルダを年月単位で作成 ---
    sFolder = &quot;C:請求書&quot; &amp; Format(Date, &quot;yyyymm&quot;)
    If Dir(sFolder, vbDirectory) = &quot;&quot; Then
        MkDir sFolder
    End If

    '--- 取引先一覧の最終行を取得 ---
    lastRow = wsList.Cells(Rows.Count, 1).End(xlUp).Row

    '--- 取引先ごとにループ ---
    For i = 2 To lastRow
        sClient = wsList.Cells(i, 1).Value
        sAmount = wsList.Cells(i, 2).Value

        '--- ひな形に情報を転記 ---
        wsTpl.Range(&quot;B2&quot;).Value = sClient
        wsTpl.Range(&quot;B5&quot;).Value = sAmount
        wsTpl.Range(&quot;B6&quot;).Value = Format(Date, &quot;yyyy年m月d日&quot;)

        '--- 取引先名でPDF保存 ---
        sFile = sFolder &amp; &quot;&quot; &amp; sClient &amp; &quot;_請求書_&quot; &amp; _
                Format(Date, &quot;yyyymm&quot;) &amp; &quot;.pdf&quot;

        wsTpl.ExportAsFixedFormat _
            Type:=xlTypePDF, _
            Filename:=sFile, _
            IgnorePrintAreas:=False
    Next i

    MsgBox lastRow - 1 &amp; &quot;社分の請求書PDFを保存しました&quot; &amp; vbCrLf &amp; sFolder
End Sub</code></pre>



<p class="wp-block-paragraph">このマクロを月初に1回実行するだけで、取引先10社分の請求書が <code>C:請求書202605</code> フォルダ内に整理されて保存されます。手作業で30分かかっていた作業が、ボタン1つの数秒で終わります。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p><strong>TIP</strong></p><p>請求書テンプレートに通し番号を入れる場合は、<code>wsTpl.Range("B1").Value = "INV-" & Format(Date, "yyyymm") & "-" & Format(i - 1, "000")</code> のように連番も自動生成できます。</p></blockquote>



<h2 class="wp-block-heading"><span id="toc27">よくあるエラーと対処法</span></h2>



<p class="wp-block-paragraph"><code>ExportAsFixedFormat</code> を使うときに遭遇しやすいエラーを5つ紹介します。</p>



<h3 class="wp-block-heading"><span id="toc28">実行時エラー&#8217;1004&#8242;: ドキュメントが保存されませんでした</span></h3>



<p class="wp-block-paragraph">最頻出のエラーです。原因は主に3つあります。</p>



<figure class="wp-block-table"><table><thead><tr><th>原因</th><th>対処</th></tr></thead><tbody><tr><td>保存先フォルダが存在しない</td><td><code>Dir + MkDir</code> でフォルダ存在チェック・作成</td></tr><tr><td>同名PDFが他アプリで開かれている</td><td>該当PDFを閉じてから再実行</td></tr><tr><td>保存先パスに使用不可文字（` / : * ? &#8221; < ></td><td>`）が含まれる</td><td>ファイル名から該当文字を除去</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">特に取引先名をファイル名に使う場合、<code>株式会社○○/△△</code> のように <code>/</code> が含まれていると保存に失敗します。事前に <code>Replace</code> 関数でクリーニングしておくのが安全です。</p>



<pre class="wp-block-code"><code>sClient = Replace(sClient, &quot;/&quot;, &quot;_&quot;)
sClient = Replace(sClient, &quot;&quot;, &quot;_&quot;)</code></pre>



<h3 class="wp-block-heading"><span id="toc29">PDFが空白・1ページ目しか出ない</span></h3>



<p class="wp-block-paragraph">シート内のデータ範囲は広いのに、PDFが1ページしか生成されない場合は <code>PrintArea</code> が古い状態で残っていることが多いです。</p>



<pre class="wp-block-code"><code>'--- 印刷範囲をリセットしてから出力 ---
ws.PageSetup.PrintArea = &quot;&quot;
ws.ExportAsFixedFormat _
    Type:=xlTypePDF, _
    Filename:=&quot;C:PDF全体.pdf&quot;, _
    IgnorePrintAreas:=True</code></pre>



<p class="wp-block-paragraph"><code>PrintArea = ""</code> で範囲をクリアし、<code>IgnorePrintAreas:=True</code> をセットで指定するとシート全体がPDF化されます。</p>



<h3 class="wp-block-heading"><span id="toc30">文字が小さすぎてPDFが読めない</span></h3>



<p class="wp-block-paragraph">シート全体を1ページに収めようとすると、データ量が多い場合に文字が極端に小さくなります。<code>PageSetup.Zoom</code> プロパティと <code>FitToPagesWide / FitToPagesTall</code> を使って調整します。</p>



<pre class="wp-block-code"><code>With ws.PageSetup
    .Zoom = False
    .FitToPagesWide = 1   '横は1ページに収める
    .FitToPagesTall = False  '縦は自動（複数ページ可）
End With</code></pre>



<p class="wp-block-paragraph">横幅は1ページに収めつつ、縦は必要な分だけページを増やす設定です。長いリストでも文字が読める品質を保てます。</p>



<h3 class="wp-block-heading"><span id="toc31">実行時エラー&#8217;9&#8242;: インデックスが有効範囲にありません</span></h3>



<p class="wp-block-paragraph"><code>Worksheets("シート名")</code> で指定したシートが存在しないときに発生します。シート名のタイポ・全角半角の混在・不要スペースが主な原因です。</p>



<pre class="wp-block-code"><code>'--- シート存在チェックを入れる ---
Dim ws As Worksheet
On Error Resume Next
Set ws = Worksheets(&quot;請求書ひな形&quot;)
On Error GoTo 0

If ws Is Nothing Then
    MsgBox &quot;シート「請求書ひな形」が見つかりません&quot;
    Exit Sub
End If</code></pre>



<p class="wp-block-paragraph">VBAのエラー処理パターン全般は<a href="https://mashukabu.com/vba-error-handling-complete-guide/">VBAのエラーハンドリング完全ガイド</a>で詳しく解説しています。</p>



<h3 class="wp-block-heading"><span id="toc32">PDFの画質を変えたい</span></h3>



<p class="wp-block-paragraph">既定の <code>xlQualityStandard</code> で問題が出ることはまずありませんが、ファイルサイズを抑えたい場合は <code>xlQualityMinimum</code> を指定できます。</p>



<pre class="wp-block-code"><code>ActiveSheet.ExportAsFixedFormat _
    Type:=xlTypePDF, _
    Filename:=&quot;C:PDF軽量版.pdf&quot;, _
    Quality:=xlQualityMinimum</code></pre>



<p class="wp-block-paragraph"><code>xlQualityMinimum</code> だと画像が圧縮され、ファイルサイズが概ね半分程度になります。メール添付向けの軽量PDFを作りたい場合に便利です。</p>



<h2 class="wp-block-heading"><span id="toc33">ExportAsFixedFormatと他の保存方法の使い分け</span></h2>



<p class="wp-block-paragraph">ExcelからPDFを生成する方法は <code>ExportAsFixedFormat</code> だけではありません。用途別の使い分けを整理しておきます。</p>



<figure class="wp-block-table"><table><thead><tr><th>方法</th><th>特徴</th><th>推奨用途</th></tr></thead><tbody><tr><td>ExportAsFixedFormat</td><td>高速・高品質・引数が豊富</td><td>請求書・報告書の自動化（標準）</td></tr><tr><td>PrintOut（PrintToFile）</td><td>印刷ダイアログ経由</td><td>物理プリンタでの印刷自動化</td></tr><tr><td>SaveAs（xlPDF不可）</td><td>PDF不可</td><td>xlsx/xlsm保存用</td></tr><tr><td>名前を付けて保存 ダイアログ</td><td>手動操作</td><td>1回限りの保存</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">VBAでPDF出力するなら、<code>ExportAsFixedFormat</code> が標準解と覚えておけば十分です。<code>PrintOut</code> はネットワークプリンタ経由の物理印刷が必要なケースだけで使います。</p>



<h2 class="wp-block-heading"><span id="toc34">まとめ</span></h2>



<p class="wp-block-paragraph">VBAの <code>ExportAsFixedFormat</code> メソッドを使うと、ExcelシートのPDF出力作業を完全に自動化できます。</p>



<ul class="wp-block-list"><li><strong>基本構文</strong>: <code>対象.ExportAsFixedFormat Type:=xlTypePDF, Filename:="パス"</code></li><li><strong>日付付きファイル名</strong>: <code>Format(Date, "yyyymmdd")</code> でファイル名に日付を組み込む</li><li><strong>保存先フォルダ自動作成</strong>: <code>Dir + MkDir</code> で年月別フォルダを動的に生成する</li><li><strong>複数シート一括処理</strong>: <code>For Each</code> で個別PDF、<code>Sheets(Array(...)).Select</code> で結合PDF</li><li><strong>印刷範囲指定</strong>: <code>PageSetup.PrintArea</code> + <code>IgnorePrintAreas:=False</code> で範囲制御</li><li><strong>エラー対処</strong>: フォルダ不在・同名ファイル開きっぱなし・PrintArea残留が頻出原因</li></ul>



<p class="wp-block-paragraph">請求書を10社分・月次報告書を5部門分PDF化する作業は、初回1時間の自動化投資で年間60時間以上が浮きます。本記事の請求書テンプレートをそのままコピペして、自社の取引先一覧に合わせて調整するところから始めてください。</p>



<p class="wp-block-paragraph">VBAの基本構文を学び直したい方は、テーマ別にこちらの記事をご覧ください。</p>



<ul class="wp-block-list"><li>変数宣言の使い方は<a href="https://mashukabu.com/excel-vba-variable-explanation/">Excel VBAの変数の使い方</a></li><li>繰り返し処理の基本は<a href="https://mashukabu.com/excel-vba-howto-use-for/">Excel VBAでFor文を使う方法</a></li><li>コレクション処理は<a href="https://mashukabu.com/vba-howto-use-for-each-next/">Excel VBAでFor Each Nextを使う方法</a></li><li>最終行取得は<a href="https://mashukabu.com/excel-vba-howto-get-lastrow/">Excel VBAでLastRowを取得する方法</a></li></ul>



<p class="wp-block-paragraph">エラーハンドリングを本格的に整備したい方は<a href="https://mashukabu.com/vba-error-handling-complete-guide/">VBAのエラーハンドリング完全ガイド</a>が役立ちます。VBA全体を体系的に学びたい方は、入門ハブ記事の<a href="https://mashukabu.com/excel-vba-automation-guide/">Excel VBAでマクロ自動化を始めるための完全ガイド</a>も参考にしてください。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://mashukabu.com/vba-export-pdf/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
