<?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>請求書 &#8211; biz-tactics</title>
	<atom:link href="https://mashukabu.com/tag/%E8%AB%8B%E6%B1%82%E6%9B%B8/feed/" rel="self" type="application/rss+xml" />
	<link>https://mashukabu.com</link>
	<description></description>
	<lastBuildDate>Sat, 04 Jul 2026 01:48:56 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0.1</generator>

<image>
	<url>https://mashukabu.com/wp-content/uploads/2022/04/cropped-site-icon-32x32.png</url>
	<title>請求書 &#8211; biz-tactics</title>
	<link>https://mashukabu.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>【コピペで動く】GASでスプレッドシートから請求書PDFを自動生成してメール送付する方法</title>
		<link>https://mashukabu.com/gas-spreadsheet-invoice-pdf/</link>
					<comments>https://mashukabu.com/gas-spreadsheet-invoice-pdf/#respond</comments>
		
		<dc:creator><![CDATA[まっしゅ]]></dc:creator>
		<pubDate>Sat, 13 Jun 2026 01:10:09 +0000</pubDate>
				<category><![CDATA[仕事効率化]]></category>
		<category><![CDATA[GAS]]></category>
		<category><![CDATA[Google Apps Script]]></category>
		<category><![CDATA[PDF自動生成]]></category>
		<category><![CDATA[スプレッドシート]]></category>
		<category><![CDATA[業務効率化]]></category>
		<category><![CDATA[請求書]]></category>
		<guid isPermaLink="false">https://mashukabu.com/?p=8028</guid>

					<description><![CDATA[スプレッドシートの請求データをテンプレートに差し込み、GASでPDF化してGmailで自動送付する方法をコピペコード付きで解説。テンプレシートの作り方・PDF変換のURLパラメータ・ファイル名の動的命名・Drive保存まで、毎月の請求書発行を丸ごと自動化します。]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">毎月の請求書発行、いまだに次のような手作業を繰り返していませんか。</p>



<ul class="wp-block-list"><li>1社ずつテンプレートをコピーする</li><li>取引先名と金額を打ち替える</li><li>PDFに書き出す</li><li>メールに添付する</li></ul>



<p class="wp-block-paragraph">取引先が10社・20社と増えるほど、この単純作業に半日とられてしまいますよね。転記ミスや添付忘れも怖いところです。</p>



<p class="wp-block-paragraph">実はこの一連の流れ、Google Apps Script（GAS）を使えば<strong>ボタン1つで丸ごと自動化できます</strong>。スプレッドシートの請求データをテンプレートに差し込み、PDF化して、Driveに保存して、Gmailで送付するまでを全部やってくれます。</p>



<p class="wp-block-paragraph">この記事では、コピペでそのまま動く完成コードと、つまずきやすいポイントの対処法まで、実務で使える形でまとめました。</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">GASで請求書PDFを自動生成する仕組みとは？｜全体の流れを把握する</a><ol><li><a href="#toc2" tabindex="0">必要な前提条件</a></li></ol></li><li><a href="#toc3" tabindex="0">スプレッドシートを準備する｜データシートとテンプレシートを作る</a><ol><li><a href="#toc4" tabindex="0">データシートの作り方</a></li><li><a href="#toc5" tabindex="0">テンプレートシートの作り方</a></li></ol></li><li><a href="#toc6" tabindex="0">請求書PDFを自動生成するGASコード【コピペOK】</a><ol><li><a href="#toc7" tabindex="0">差し込みとPDF変換の関数を追加する</a></li></ol></li><li><a href="#toc8" tabindex="0">PDF変換のURLパラメータを使いこなす｜余白・向き・範囲を制御する</a></li><li><a href="#toc9" tabindex="0">ファイル名を動的に付ける｜日付と取引先名で自動命名する</a></li><li><a href="#toc10" tabindex="0">Drive保存とGmail送信を組み込む｜送付まで全自動にする</a><ol><li><a href="#toc11" tabindex="0">実行ボタンを付けて誰でも使えるようにする</a></li></ol></li><li><a href="#toc12" tabindex="0">うまくいかないときの対処法｜よくあるトラブルと解決策</a><ol><li><a href="#toc13" tabindex="0">2社目から差し込みがされない・プレースホルダーが残る</a></li><li><a href="#toc14" tabindex="0">「承認が必要です」と表示されて実行できない</a></li><li><a href="#toc15" tabindex="0">PDFの一部が切れる・2ページに分かれてしまう</a></li><li><a href="#toc16" tabindex="0">スクリプトの実行時間が長すぎてエラーになる</a></li></ol></li><li><a href="#toc17" tabindex="0">まとめ｜請求書発行を丸ごと自動化して毎月の手間を消す</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">GASで請求書PDFを自動生成する仕組みとは？｜全体の流れを把握する</span></h2>



<p class="wp-block-paragraph">最初に、これから作るものの全体像をつかんでおきましょう。やっていることはシンプルで、次の5ステップを GAS が順番に実行するだけです。</p>



<ol class="wp-block-list"><li>請求データ（取引先・品目・金額）が並んだ「データシート」を1行ずつ読み込む</li><li>レイアウトを整えた「テンプレートシート」にその値を差し込む</li><li>テンプレートシートをPDFに変換する</li><li>PDFをGoogle Driveの指定フォルダに保存する</li><li>取引先のメールアドレス宛にPDFを添付してGmailで送信する</li></ol>



<p class="wp-block-paragraph">ちょっとむずかしく見えますが、やっていることはシンプルです。「スプレッドシートを差し込み印刷して、PDFにして、メールで送る」という、ふだん手作業でやっていることをそのままコードにしただけなんです。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p><strong>NOTE: GASは追加費用ゼロで使えます</strong><br>GAS（Google Apps Script）はGoogleが提供する無料のスクリプト環境で、JavaScriptに似た言語で書きます。Googleアカウントさえあれば、インストール不要でブラウザ上のエディタからすぐに使えます。基本操作に不安がある方は<a href="https://mashukabu.com/spreadsheet-gas-getting-started-recipes/">GAS入門記事</a>を先に読んでおくと、この記事がスムーズに理解できますよ。</p></blockquote>



<h3 class="wp-block-heading"><span id="toc2">必要な前提条件</span></h3>



<p class="wp-block-paragraph">実装を始める前に、次のものを準備しておいてください。</p>



<ul class="wp-block-list"><li>Googleアカウント（無料のもので問題ありません）</li><li>編集権限のあるGoogleスプレッドシート1つ</li><li>請求書PDFを保存するGoogle Driveのフォルダ1つ</li><li>取引先のメールアドレスが分かっていること（自動送信する場合）</li></ul>



<p class="wp-block-paragraph">特別な有料サービスやプラグインは一切不要です。すべてGoogle標準の機能だけで完結します。</p>



<h2 class="wp-block-heading"><span id="toc3">スプレッドシートを準備する｜データシートとテンプレシートを作る</span></h2>



<p class="wp-block-paragraph">GASを書く前に、土台となるスプレッドシートを整えます。1つのスプレッドシートの中に「データシート」と「テンプレートシート」という2枚のシートを用意するのがポイントです。</p>



<h3 class="wp-block-heading"><span id="toc4">データシートの作り方</span></h3>



<p class="wp-block-paragraph">まず1枚目に、請求データを並べる「データ」という名前のシートを作ります。1行目を見出しにして、2行目以降に取引先ごとのデータを1行ずつ入れていきましょう。</p>



<figure class="wp-block-table"><table><thead><tr><th>取引先名</th><th>メールアドレス</th><th>品目</th><th>金額</th></tr></thead><tbody><tr><td>株式会社サンプル</td><td>sample@example.com</td><td>Webサイト保守</td><td>50000</td></tr><tr><td>田中商事株式会社</td><td>tanaka@example.com</td><td>コンサルティング</td><td>120000</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">金額の列は、カンマ区切りの文字列ではなく<strong>数値のまま</strong>入れておきましょう。あとでコード側で <code>toLocaleString()</code> を使ってカンマ表示に整えるので、ここでは生の数値にしておくのがポイントです。</p>



<h3 class="wp-block-heading"><span id="toc5">テンプレートシートの作り方</span></h3>



<p class="wp-block-paragraph">次に2枚目に、請求書のレイアウトを整えた「テンプレート」という名前のシートを作ります。ここは実際の請求書として見栄えするように、セルの結合や罫線、フォントサイズを調整してデザインします。</p>



<p class="wp-block-paragraph">差し込みたい場所には、あとでGASが置き換えるための<strong>目印（プレースホルダー）</strong>を入れておきます。たとえば次のように書いておきます。</p>



<ul class="wp-block-list"><li>宛名のセル: <code>{{取引先名}} 御中</code></li><li>品目のセル: <code>{{品目}}</code></li><li>金額のセル: <code>{{金額}}</code></li><li>発行日のセル: <code>{{発行日}}</code></li></ul>



<p class="wp-block-paragraph">このように <code>{{ }}</code> で囲んだ文字列を目印にしておけば、GASが「この目印を見つけたら、データシートの値に置き換える」という処理をしてくれますよ。Word差し込み印刷の差し込みフィールドと同じ発想ですね。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p><strong>NOTE: 印刷範囲を意識してレイアウトする</strong><br>テンプレートシートはそのままPDFになります。A4縦1枚にきれいに収まるよう、列幅と行の高さを調整しておきましょう。余計な列や行が広がっていると、PDFに余白として写り込んでしまいます。</p></blockquote>



<h2 class="wp-block-heading"><span id="toc6">請求書PDFを自動生成するGASコード【コピペOK】</span></h2>



<p class="wp-block-paragraph">それでは本体のコードです。スプレッドシートのメニューから「拡張機能」→「Apps Script」を開き、エディタに次のコードを貼り付けてください。</p>



<pre class="wp-block-code"><code>function createInvoicePdf() {
  // --- 設定（ここだけ自分の環境に合わせて変更）---
  const DATA_SHEET_NAME = 'データ';        // データシートの名前
  const TEMPLATE_SHEET_NAME = 'テンプレート'; // テンプレシートの名前
  const SAVE_FOLDER_ID = 'ここにDriveフォルダのIDを貼る'; // PDF保存先フォルダ
  const SEND_MAIL = false; // true にするとメール送信も実行する

  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const dataSheet = ss.getSheetByName(DATA_SHEET_NAME);
  const templateSheet = ss.getSheetByName(TEMPLATE_SHEET_NAME);
  const saveFolder = DriveApp.getFolderById(SAVE_FOLDER_ID);

  // データシートを2行目から最終行まで読み込む
  const lastRow = dataSheet.getLastRow();
  const data = dataSheet.getRange(2, 1, lastRow - 1, 4).getValues();

  // 発行日（今日の日付）を「2026年6月8日」形式で作る
  const today = new Date();
  const issueDate = Utilities.formatDate(today, 'JST', 'yyyy年M月d日');

  // 1行ずつ処理する
  data.forEach(function(row) {
    const clientName = row[0]; // 取引先名
    const email = row[1];      // メールアドレス
    const item = row[2];       // 品目
    const amount = row[3];     // 金額

    if (!clientName) return; // 取引先名が空の行はスキップ

    // テンプレートに差し込む
    fillTemplate(templateSheet, {
      '{{取引先名}}': clientName,
      '{{品目}}': item,
      '{{金額}}': '¥' + Number(amount).toLocaleString(),
      '{{発行日}}': issueDate
    });

    // 差し込み結果を確実に反映させる
    SpreadsheetApp.flush();

    // テンプレシートをPDFに変換する
    const fileName = issueDate.replace(/[年月]/g, '-').replace('日', '')
      + '_' + clientName + '_請求書.pdf';
    const pdfBlob = exportSheetAsPdf(ss, templateSheet, fileName);

    // Driveに保存する
    const pdfFile = saveFolder.createFile(pdfBlob);

    // メール送信する（SEND_MAIL が true のときだけ）
    if (SEND_MAIL &amp;&amp; email) {
      sendInvoiceMail(email, clientName, pdfFile.getBlob());
    }

    Logger.log(clientName + ' のPDFを作成しました: ' + pdfFile.getUrl());
  });
}</code></pre>



<p class="wp-block-paragraph">このコードは「設定」の部分だけ自分の環境に合わせれば、あとはそのまま動きます。それぞれの値を順番に説明します。</p>



<ul class="wp-block-list"><li><code>DATA_SHEET_NAME</code>: 請求データを入れたシートの名前</li><li><code>TEMPLATE_SHEET_NAME</code>: 請求書レイアウトのシートの名前</li><li><code>SAVE_FOLDER_ID</code>: PDFを保存したいDriveフォルダのID（次の項目で取得方法を説明します）</li><li><code>SEND_MAIL</code>: 最初は <code>false</code> のままにして、PDF生成だけテストしてから <code>true</code> に切り替えるのが安全です</li></ul>



<h3 class="wp-block-heading"><span id="toc7">差し込みとPDF変換の関数を追加する</span></h3>



<p class="wp-block-paragraph">上のコードから呼び出している補助関数を、同じファイルの下に続けて貼り付けます。</p>



<pre class="wp-block-code"><code>// テンプレートのプレースホルダーを実際の値に置き換える
function fillTemplate(sheet, replaceMap) {
  const range = sheet.getDataRange();
  const values = range.getValues();

  for (let r = 0; r &lt; values.length; r++) {
    for (let c = 0; c &lt; values[r].length; c++) {
      let cell = values[r][c];
      if (typeof cell === 'string') {
        for (const key in replaceMap) {
          if (cell.indexOf(key) !== -1) {
            cell = cell.split(key).join(replaceMap[key]);
          }
        }
        values[r][c] = cell;
      }
    }
  }
  range.setValues(values);
}</code></pre>



<p class="wp-block-paragraph">ここで注意したいのは、<code>fillTemplate</code> でテンプレートシートの値を<strong>直接書き換えている</strong>点です。1社目の差し込みで <code>{{取引先名}}</code> が実際の名前に変わってしまうと、2社目では目印が見つからなくなってしまいます。</p>



<p class="wp-block-paragraph">これを防ぐ仕組みは、このあと「うまくいかないときの対処法」で解説していきましょう。</p>



<h2 class="wp-block-heading"><span id="toc8">PDF変換のURLパラメータを使いこなす｜余白・向き・範囲を制御する</span></h2>



<p class="wp-block-paragraph">GASでスプレッドシートをPDF化するときは、Googleの<strong>エクスポート用URL</strong>にアクセスして変換します。このURLにパラメータを付けることで、用紙の向きや余白、印刷範囲を細かく指定できるのがポイントです。</p>



<pre class="wp-block-code"><code>// 指定したシートだけをPDFに変換する
function exportSheetAsPdf(ss, sheet, fileName) {
  const ssId = ss.getId();
  const gid = sheet.getSheetId();

  // エクスポート用URLとパラメータ
  const url = 'https://docs.google.com/spreadsheets/d/' + ssId
    + '/export?'
    + 'format=pdf'        // PDF形式で出力
    + '&amp;gid=' + gid       // 対象シートのID
    + '&amp;portrait=true'    // 縦向き（横向きは false）
    + '&amp;size=A4'          // 用紙サイズ
    + '&amp;fitw=true'        // 幅をページに合わせる
    + '&amp;gridlines=false'  // 枠線（グリッド線）を非表示
    + '&amp;sheetnames=false' // シート名を非表示
    + '&amp;printtitle=false' // ファイル名を非表示
    + '&amp;top_margin=0.5'   // 上余白（インチ）
    + '&amp;bottom_margin=0.5'
    + '&amp;left_margin=0.5'
    + '&amp;right_margin=0.5';

  // 認証トークンを付けてアクセスする
  const token = ScriptApp.getOAuthToken();
  const response = UrlFetchApp.fetch(url, {
    headers: { 'Authorization': 'Bearer ' + token }
  });

  // PDFのデータ（Blob）にファイル名を付けて返す
  return response.getBlob().setName(fileName);
}</code></pre>



<p class="wp-block-paragraph">主要なURLパラメータの意味を整理しておきます。請求書の見た目を調整したいときは、ここを書き換えてください。</p>



<ul class="wp-block-list"><li><code>format=pdf</code>: 出力形式。PDFのほかに <code>xlsx</code> や <code>csv</code> も指定できます</li><li><code>gid</code>: PDF化したいシートのID。<code>sheet.getSheetId()</code> で取得します</li><li><code>portrait</code>: <code>true</code> で縦向き、<code>false</code> で横向き</li><li><code>gridlines</code>: <code>false</code> にすると、セルの枠線（グリッド線）が消えてすっきりします</li><li><code>fitw</code>: <code>true</code> にすると、列がページ幅に収まるよう自動調整されます</li><li><code>top_margin</code> などの余白: インチ単位で指定します（0.5でだいたい1.3cm程度）</li></ul>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p><strong>NOTE: gid はシートのURLで確認できる</strong><br>シートのIDは、対象シートを開いたときのURL末尾 <code>#gid=0</code> の数字部分です。コードでは <code>getSheetId()</code> を使って自動取得するので手入力は不要ですが、仕組みを知っておくと応用が利きます。</p></blockquote>



<h2 class="wp-block-heading"><span id="toc9">ファイル名を動的に付ける｜日付と取引先名で自動命名する</span></h2>



<p class="wp-block-paragraph">請求書PDFは、あとから探しやすいファイル名にしておくことが大切です。本体コードでは、次のようにファイル名を組み立てていました。</p>



<pre class="wp-block-code"><code>const fileName = issueDate.replace(/[年月]/g, '-').replace('日', '')
  + '_' + clientName + '_請求書.pdf';</code></pre>



<p class="wp-block-paragraph">これで「2026-6-8_株式会社サンプル_請求書.pdf」のような名前が自動で付きます。日付が先頭にあると、フォルダ内で日付順に並ぶので管理がラクになりますよ。</p>



<p class="wp-block-paragraph">請求書番号を入れたい場合は、データシートに「請求番号」の列を追加して、次のように組み込むと便利です。</p>



<pre class="wp-block-code"><code>// 例: INV-2026-001 のような請求番号を先頭に付ける
const invoiceNo = row[4]; // データシートの5列目に請求番号があると仮定
const fileName = invoiceNo + '_' + clientName + '_請求書.pdf';</code></pre>



<p class="wp-block-paragraph">ファイル名に使えない記号（<code>/</code> や <code>:</code> など）が取引先名に含まれる場合は、<code>replace()</code> で除去しておくと安全です。</p>



<pre class="wp-block-code"><code>const safeName = clientName.replace(/[\/:*?&quot;&lt;&gt;|]/g, '');</code></pre>



<h2 class="wp-block-heading"><span id="toc10">Drive保存とGmail送信を組み込む｜送付まで全自動にする</span></h2>



<p class="wp-block-paragraph">ここまでで「PDFを作ってDriveに保存する」までができました。最後に、そのPDFをGmailで取引先に送る関数を追加します。</p>



<pre class="wp-block-code"><code>// 請求書PDFをメールに添付して送信する
function sendInvoiceMail(email, clientName, pdfBlob) {
  const subject = clientName + ' 御中｜請求書のご送付';
  const body = clientName + ' 御中nn'
    + 'いつもお世話になっております。n'
    + '今月分の請求書をお送りいたします。n'
    + '添付のPDFをご確認のうえ、お手続きをお願いいたします。nn'
    + '何卒よろしくお願い申し上げます。';

  GmailApp.sendEmail(email, subject, body, {
    attachments: [pdfBlob],
    name: '請求担当'
  });
}</code></pre>



<p class="wp-block-paragraph"><code>GmailApp.sendEmail()</code> の <code>attachments</code> オプションにPDFのBlobを渡すだけで、添付ファイル付きメールが送れます。差出人の表示名は <code>name</code> で変えられるので、会社名や担当部署を入れておくと親切です。</p>



<p class="wp-block-paragraph">メール本文を取引先ごとに個別化したり、HTMLメールで送りたい場合は、<a href="https://mashukabu.com/spreadsheet-gmail-batch-send-gas/">スプレッドシートからGmailを一括送信する方法</a>で差し込みメールのテクニックを詳しく解説しているので、あわせて読んでみてください。</p>



<h3 class="wp-block-heading"><span id="toc11">実行ボタンを付けて誰でも使えるようにする</span></h3>



<p class="wp-block-paragraph">毎月使うものなので、スプレッドシートにカスタムメニューを追加して、ワンクリックで実行できるようにしておきましょう。</p>



<pre class="wp-block-code"><code>// スプレッドシートを開いたときにメニューを追加する
function onOpen() {
  SpreadsheetApp.getUi()
    .createMenu('請求書ツール')
    .addItem('請求書PDFを作成', 'createInvoicePdf')
    .addToUi();
}</code></pre>



<p class="wp-block-paragraph">このコードを保存してスプレッドシートを開き直すと、メニューバーに「請求書ツール」という項目が増えます。あとはそこから「請求書PDFを作成」を選ぶだけで、全自動で処理が走ります。</p>



<h2 class="wp-block-heading"><span id="toc12">うまくいかないときの対処法｜よくあるトラブルと解決策</span></h2>



<p class="wp-block-paragraph">実装中につまずきやすいポイントと、その解決策をまとめました。エラーが出ても落ち着いて確認してください。</p>



<h3 class="wp-block-heading"><span id="toc13">2社目から差し込みがされない・プレースホルダーが残る</span></h3>



<p class="wp-block-paragraph">一番ハマりやすいのがこれです。前述のとおり、<code>fillTemplate</code> がテンプレートシートを直接書き換えるため、1社目の処理で <code>{{取引先名}}</code> が消えてしまうのが原因です。</p>



<p class="wp-block-paragraph">解決策は、<strong>毎回テンプレートシートを元の状態に戻す</strong>ことです。テンプレートを別シートとして複製してから差し込み、PDF化後に削除する方法が確実です。本体コードの差し込み部分を次のように書き換えてください。</p>



<pre class="wp-block-code"><code>data.forEach(function(row) {
  // ...（変数の取り出しは同じ）...

  // テンプレートをコピーして作業用シートを作る
  const workSheet = templateSheet.copyTo(ss).setName('_work');

  fillTemplate(workSheet, {
    '{{取引先名}}': clientName,
    '{{品目}}': item,
    '{{金額}}': '¥' + Number(amount).toLocaleString(),
    '{{発行日}}': issueDate
  });
  SpreadsheetApp.flush();

  // 作業用シートをPDF化
  const pdfBlob = exportSheetAsPdf(ss, workSheet, fileName);
  saveFolder.createFile(pdfBlob);

  // 作業用シートを削除して元に戻す
  ss.deleteSheet(workSheet);
});</code></pre>



<p class="wp-block-paragraph">これなら原本のテンプレートは触らないので、何社処理しても目印が消えません。</p>



<h3 class="wp-block-heading"><span id="toc14">「承認が必要です」と表示されて実行できない</span></h3>



<p class="wp-block-paragraph">GASが初めてDriveやGmailにアクセスするときは、Googleの<strong>認可（承認）</strong>が必要です。実行時に出るダイアログで「権限を確認」→自分のアカウントを選択→「詳細」→「（プロジェクト名）に移動」→「許可」の順に進めば承認できます。これは初回だけの操作です。</p>



<h3 class="wp-block-heading"><span id="toc15">PDFの一部が切れる・2ページに分かれてしまう</span></h3>



<p class="wp-block-paragraph">テンプレートシートの内容がA4の1枚に収まっていないのが原因です。次の点を確認してください。</p>



<ul class="wp-block-list"><li>テンプレートシートの列幅を狭めて、横幅をA4内に収める</li><li>不要な列・行が広がっていないか確認する</li><li>URLパラメータに <code>fitw=true</code>（幅をページに合わせる）を入れる</li><li>それでも収まらなければ <code>portrait=false</code> で横向きにする</li></ul>



<h3 class="wp-block-heading"><span id="toc16">スクリプトの実行時間が長すぎてエラーになる</span></h3>



<p class="wp-block-paragraph">GASには1回あたり6分という実行時間の上限があります。取引先が数十社を超えて時間切れになる場合は、処理する行数を分割したり、<code>Utilities.sleep()</code> の不要な待機を入れていないか確認しましょう。</p>



<p class="wp-block-paragraph">請求業務に複数のGAS自動化を組み合わせたい方は、<a href="https://mashukabu.com/gas-deadline-reminder-alert/">GASで締め切りリマインダーを自動通知する方法</a>も参考になります。</p>



<h2 class="wp-block-heading"><span id="toc17">まとめ｜請求書発行を丸ごと自動化して毎月の手間を消す</span></h2>



<p class="wp-block-paragraph">GASを使えば、スプレッドシートの請求データから、PDF生成・Drive保存・メール送付までを全自動にできます。一度コードを組んでしまえば、翌月からはデータシートを更新してボタンを押すだけです。半日かかっていた請求業務が、文字どおり<strong>数分で終わる</strong>ようになります。</p>



<p class="wp-block-paragraph">最後に、実装のポイントを振り返っておきましょう。</p>



<ul class="wp-block-list"><li>データシートとテンプレートシートを分けて作る</li><li>テンプレートには <code>{{取引先名}}</code> などの目印を置く</li><li>PDF変換はエクスポート用URLにパラメータを付けて制御する</li><li>ファイル名は日付と取引先名で動的に命名する</li><li>2社目以降の差し込みは「テンプレートを複製してから差し込む」で解決する</li></ul>



<p class="wp-block-paragraph">まずは <code>SEND_MAIL</code> を <code>false</code> にしたまま、PDF生成だけテストしてみてください。狙いどおりのPDFができることを確認してから、メール送信を有効にするのが安全な進め方です。</p>



<p class="wp-block-paragraph">GASをもっと活用したい方は、<a href="https://mashukabu.com/gas-form-reservation-google-calendar/">予約フォームとGoogleカレンダーを連携する方法</a>など、ほかの自動化レシピもぜひ試してみてください。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://mashukabu.com/gas-spreadsheet-invoice-pdf/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<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-2" checked><label class="toc-title" for="toc-checkbox-2">目次</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>
