Django Girls and Boys 備忘録

Python、Selenium、Django、java、iPhoneアプリ、Excelマクロなどで気付いたこと、覚えておきたいことなどを載せていきます。

【Excel VBA】PDFを結合する方法(マクロで複数PDFを1つにまとめる)

Excel VBAで作業していると、

  • 複数のPDFを1つにまとめたい
  • シートごとに出力したPDFを結合したい
  • 月次レポートを1つのPDFにしたい

という場面があります。

例えば、

 
売上.pdf
在庫.pdf
集計.pdf

 

を、

 
まとめ.pdf
 
のようにしたいケースです。

この記事では、Excel VBAでPDFを結合する方法を例を挙げて説明します。


まず結論:VBAだけではPDF結合できない

ここが重要です。

Excel VBAには、

 
複数のPDFを結合する標準機能
 

がありません。

そのため、PDF結合をするには次のどちらかを使います。


方法① Adobe Acrobatを使う(本格的)

Adobe Acrobat(有料版)が入っていれば、
VBAからPDF結合ができます。

Adobe Readerではできません


方法② 最初からExcelでまとめてPDF化する(おすすめ)

もし元データがExcelなら、

 
PDFを後から結合する
 

よりも、

 
最初からまとめてPDF化する
 

方が簡単です。

この記事では両方紹介します。


方法① Adobe Acrobatを使ってPDFを結合する

サンプルコード

そのまま貼り付けて使えます。

 
Sub MergePDFs()
    Dim AcroApp As Object
    Dim MainPDF As Object
    Dim TempPDF As Object
    Dim files As Variant
    Dim i As Long

    ' 結合するPDF一覧
    files = Array( _
        "C:\Test\1.pdf", _
        "C:\Test\2.pdf", _
        "C:\Test\3.pdf" _
    )

    ' Acrobat起動
    Set AcroApp = CreateObject("AcroExch.App")
    Set MainPDF = CreateObject("AcroExch.PDDoc")

    ' 最初のPDFを開く
    MainPDF.Open files(0)

    ' 2つ目以降を追加
    For i = 1 To UBound(files)
        Set TempPDF = CreateObject("AcroExch.PDDoc")
        TempPDF.Open files(i)
        MainPDF.InsertPages _
            MainPDF.GetNumPages - 1, _
            TempPDF, _
            0, _
            TempPDF.GetNumPages, _
            True
        TempPDF.Close
    Next i

    ' 保存
    MainPDF.Save 1, "C:\Test\merged.pdf"
    ' 終了
    MainPDF.Close
    AcroApp.Exit

End Sub

 


実行結果

次のPDFが

 
1.pdf
2.pdf
3.pdf

 

 
merged.pdf

 

として結合されます。


コードのポイント

PDF一覧を指定

 
files = Array(
    "C:\Test\1.pdf",
    "C:\Test\2.pdf"
)

 

ここに結合したいPDFを並べます。


ページを追加

 
MainPDF.InsertPages

 

これがPDFを結合している部分です。


最後に保存

 
MainPDF.Save

 

これで1つのPDFになります。


注意点

Adobe Acrobat(有料)が必要

これは必須です。

 
Adobe Acrobat Reader では不可
 

です。


PDFファイルが開いていると失敗することがある

事前に閉じておきましょう。


方法② Excelで最初からまとめてPDF化する(おすすめ)

もし元データがExcelでそれをPDF化したいならこちらが簡単です。


コード例

 
Sub ExportAllSheetsToOnePDF()

    Dim folderPath As String

    folderPath = "C:\Test\"
    Worksheets.Select
    ActiveSheet.ExportAsFixedFormat _
        Type:=xlTypePDF, _
        Filename:=folderPath & "all.pdf"

End Sub

 


実行結果

複数シートが

 
all.pdf

 

として1つにまとまります。


どちらを使うべき?

方法 おすすめ
既にPDFがある Acrobatで結合
Excelデータから作る まとめてPDF化

まとめ

Excel VBA単体では、

 
PDFを直接結合できない
 

ので、

  • Adobe Acrobatを使う
    または
  • 最初からまとめてPDF化する

のどちらかを使います。

 

 

 

 

【Excel VBA】シートをまとめて印刷・PDF化する方法(実務で超便利)

Excelでは、

  • 全シートをまとめて印刷したい
  • 会議資料をPDF化したい
  • レポートを一括出力したい

という場面がよくあります。

そんな時はVBAで一発です。


① すべてのシートをまとめて印刷する

最も簡単な方法はこちらです。

 
Sub PrintAllSheets()
    Worksheets.PrintOut
End Sub

 

これで全シートがまとめて印刷されます。


特定シートだけ印刷したい場合

 
Sub PrintVisibleSheets()

    Dim ws As Worksheet

    For Each ws In Worksheets
        If ws.Visible = xlSheetVisible Then
            ws.PrintOut
        End If
    Next ws

End Sub

 

これは非表示シートを除外できます。


② ブック全体をPDF化する

こちらは非常によく使います。

 
Sub ExportWorkbookToPDF()

    Dim folderPath As String

    folderPath = "C:\Test\"
    ActiveWorkbook.ExportAsFixedFormat _
        Type:=xlTypePDF, _
        Filename:=folderPath & "まとめ資料.pdf"

End Sub

 


実行結果

例えば

 
C:\Test\まとめ資料.pdf

 

というPDFが作成されます。


③ シートごとにPDF化する

1シートずつPDFにしたい場合はこちら。

 
Sub ExportEachSheetToPDF()
    Dim ws As Worksheet
    Dim folderPath As String
    folderPath = "C:\Test\"
    For Each ws In Worksheets
        ws.ExportAsFixedFormat _
            Type:=xlTypePDF, _
            Filename:=folderPath & ws.Name & ".pdf"
    Next ws
End Sub

 


実行結果

シートが

  • 売上
  • 在庫
  • 集計

なら、

  • 売上.pdf
  • 在庫.pdf
  • 集計.pdf

が作成されます。


よくある用途

月次レポート

毎月の報告資料をPDF化


請求書

顧客ごとにPDF出力


会議資料

複数シートをまとめて1つのPDFに


注意点

保存先フォルダを作っておく

 
folderPath = "C:\Test\"

 

フォルダがないとエラーになります。


同名PDFは上書きされる

既に同じ名前がある場合は注意しましょう。


まとめ

印刷なら

 
Worksheets.PrintOut

 

PDF化なら

 
ExportAsFixedFormat

 

これを覚えておけばOKです。


一言まとめ

シートの分割保存も、印刷も、PDF化もVBAなら数秒で自動化できます。

 

 

 

【Excel VBA】シートを別ブックに分割する方法(1シートずつ自動保存)

Excelでよくある作業の1つがこれです。

  • シートごとに別ファイルにしたい
  • 担当者ごとに配布したい
  • 月別シートを個別保存したい

そんな時は、VBAでシートを1つずつ別ブックに分割保存できます。

この記事では、その方法を説明します。


基本コード

 
Sub SplitSheets()

    Dim ws As Worksheet
    Dim folderPath As String

    ' 保存先フォルダ
    folderPath = "C:\Test\"

    ' すべてのシートを順番に処理
    For Each ws In Worksheets
        ' シートをコピー(新しいブックになる)
        ws.Copy
        ' 新しいブックを保存
        ActiveWorkbook.SaveAs _
            Filename:=folderPath & ws.Name & ".xlsx", _
            FileFormat:=xlOpenXMLWorkbook
        ' 保存後に閉じる
        ActiveWorkbook.Close False
    Next ws

End Sub

 


コードの流れ

このマクロは次の順番で動きます。

① シートを1枚コピー

 
ws.Copy

 

これでそのシートだけの新しいExcelブックが作られます。


② ファイル名を付けて保存

 
ActiveWorkbook.SaveAs _
    Filename:=folderPath & ws.Name & ".xlsx"

 

 
例えばシート名が

売上
 
なら、
 
C:\Test\売上.xlsx

 

として保存されます。


③ ブックを閉じる

 
ActiveWorkbook.Close False

 

保存したら閉じて次のシートへ進みます。


実行結果

例えば元のブックに

  • 売上
  • 在庫
  • 集計

という3枚のシートがあると、

保存先フォルダに

  • 売上.xlsx
  • 在庫.xlsx
  • 集計.xlsx

が自動作成されます。


注意点

保存先フォルダは事前に作成

 
folderPath = "C:\Test\"

 

このフォルダが存在しないとエラーになります。


同名ファイルがあると上書き確認が出る

必要なら DisplayAlerts=False を使って自動化できます。

 

 

 

 

 

 

 

 

【Excel VBA】シート名を一括変更するマクロ(連番・一括置換対応)

Excelでシートが大量にあると、
シート名の変更がとても面倒になります。

例えば👇

  • Sheet1, Sheet2 → 日付付きに変更したい

  • 売上_1, 売上_2 → 連番にしたい

  • 「2023」→「2024」に一括変更したい

この記事では、シート名を一括変更するマクロをわかりやすく解説します。


方法①:連番でシート名を変更

 
 
Sub RenameSheets()
    Dim i As Long
    For i = 1 To Worksheets.Count
        Worksheets(i).Name = "Sheet_" & Format(i, "000")
    Next i
End Sub
 

実行結果

 
Sheet_001
Sheet_002
Sheet_003


方法②:文字を置換して変更

 
Sub ReplaceSheetNames()

    Dim ws As Worksheet
    For Each ws In Worksheets
        ws.Name = Replace(ws.Name, "2023", "2024")
    Next ws

End Sub


方法③:セルの値を使って変更

 
Sub RenameFromCells()

    Dim i As Long
    For i = 1 To Worksheets.Count
        Worksheets(i).Name = Cells(i, 1).Value
    Next i

End Sub

👉 A列の値で名前変更


注意点(重要)

シート名の重複はNG

同じ名前は使えません。

👉 エラーになります


使えない文字

 

\/:*?[]

👉 シート名に使えない


まとめ

方法 内容
連番 自動命名
Replace 一括変更
セル参照 柔軟

 

 

 

 

 

 

 

 

 

【Excel VBA】シート名で条件分岐する方法(If / Select Case)

VBAでは、シート名によって処理を変えることがよくあります。

例えば👇

  • 「売上」なら集計

  • 「データ」なら加工

  • 「ログ」ならスキップ

この記事では、シート名で条件分岐する方法を解説します。


方法①:Ifで分岐(基本)

 
 
Sub BranchByName()

    Dim ws As Worksheet
    For Each ws In Worksheets
        If ws.Name = "売上" Then
            ws.Range("A1").Value = "売上処理"
        ElseIf ws.Name = "データ" Then
            ws.Range("A1").Value = "データ処理"
        End If
    Next ws

End Sub
 

方法②:Select Case(おすすめ)

 
 
Sub BranchBySelectCase()

    Dim ws As Worksheet
    For Each ws In Worksheets
        Select Case ws.Name
        Case "売上"
            ws.Range("A1").Value = "売上処理"
        Case "データ"
            ws.Range("A1").Value = "データ処理"
        Case Else
            ws.Range("A1").Value = "その他"
        End Select
    Next ws

End Sub
 

👉 分岐が多いときはこれが見やすい


部分一致で判定する

 
 
If InStr(ws.Name, "売上") > 0 Then
 

👉 「売上2024」などにも対応


実務でよくあるパターン

ログシートを除外

 
 
If ws.Name <> "ログ" Then
 

まとめ

方法 特徴
If シンプル
Select Case 見やすい
InStr 柔軟

一言まとめ

シート名で分岐すれば、処理を自由にコントロールできる。

 

 

 

 

 

 

 

 

【Excel VBA】非表示シートを除外する方法(Hidden対応)

VBAで全シートを処理するとき、非表示シートは除外したいのに
非表示シートまで処理されてしまうことがあります。

これを防ぐのが

👉 非表示シートの除外

です。


シートの表示状態とは?

VBAではシートの表示状態は3種類あります。

状態 意味
xlSheetVisible 表示
xlSheetHidden 非表示
xlSheetVeryHidden 強い非表示

方法①:Visibleで判定(基本)

 
 
Sub ExcludeHiddenSheets()

    Dim ws As Worksheet
    For Each ws In Worksheets
        If ws.Visible = xlSheetVisible Then
            ws.Range("A1").Value = "処理対象"
        End If
    Next ws

End Sub
 

👉 表示されているシートだけ処理


方法②:非表示だけ処理したい場合

 
 
 If ws.Visible <> xlSheetVisible Then
 

実務でよくある使い方

表示シートだけ集計

 
 
Dim total As Long
For Each ws In Worksheets
If ws.Visible = xlSheetVisible Then
total = total + ws.Range("A1").Value
End If
Next ws
 

よくあるミス

非表示シートを処理したくない場合に、以下にて実行
 
For Each ws In Worksheets
ws.Range("A1").Value = "処理"
Next ws
 

👉 非表示シートにも実行される


まとめ

非表示を除外するには👇

 
 
 
float minDistance = float.MaxValue;


If ws.Visible = xlSheetVisible Then

一言まとめ

非表示シートは意外と落とし穴。必ず除外条件を入れよう。

 

 

 

 

 

 

 

【Excel VBA】特定のシートだけ処理する方法(初心者向け)

VBAで複数シートを扱うとき、
**「特定のシートだけ処理したい」**場面はとても多いです。

例えば👇

  • 「売上」シートだけ処理したい

  • 「データ」シートだけ対象にしたい

  • 一部のシートだけ集計したい

この記事では、特定のシートだけ処理する方法を説明します。


方法①:シート名を指定する(基本)

 
 
Sub ProcessOneSheet()

    Worksheets("売上").Range("A1").Value = "処理済み"

End Sub
 

👉 「売上」シートだけ処理されます


方法②:複数の特定シートだけ処理する

 
 
Sub ProcessSomeSheets()

    Dim ws As Worksheet
    For Each ws In Worksheets
        If ws.Name = "売上" Or ws.Name = "データ" Then
            ws.Range("A1").Value = "対象"
        End If
    Next ws

End Sub
 

方法③:配列で指定(おすすめ)

対象が多い場合👇

 
 
Sub ProcessWithArray()

    Dim ws As Worksheet
    Dim targets As Variant
    targets = Array("売上", "データ", "集計")
    For Each ws In Worksheets
        If Not IsError(Application.Match(ws.Name, targets, 0)) Then
            ws.Range("A1").Value = "対象"
        End If
    Next ws

End Sub
 

👉 実務でよく使う書き方


まとめ

方法 特徴
名前指定 シンプル
If条件 柔軟
配列 実務向き