77Lifeworkベータ版

77Lifeworkベータ版

IT関係の話(ツール開発・インフラ構築)をメインとして、その他私の趣味や雑記用のブログです。ここに書いた内容が少しでも参考になれば嬉しいです。

ExcelシートのPDF出力処理を自動化する方法(VBA)

はじめに

こんにちは。早速ですが、皆さんはExcelのシートをPDFで出力したい場面ってありますか?
PDFとして出力するときの流れを思い浮かべてみると、1つのシートだったら簡単に終わりますよね。
しかし、複数シートを分けてPDF化する、PDF化したいExcelシートが大量にあるなど、1つ1つ手作業でやっているとさすがに辛い場合もあると思います。
というわけで、今回はそんな処理をVBAによって自動化する方法を書いていきます。

手動でPDF出力する方法

まずは自動化前後比較のために、普段手動でPDFファイルを作成する手順を確認しておきます。
ここでは以下のようなExcelシートをPDFファイルとして出力する必要がある想定でやってみます。
まずは画面左上の「ファイル」タブをクリックします。
f:id:J-back:20210503211011j:plain:w600


次に「エクスポート」を選択します。
f:id:J-back:20210503211657j:plain:w600


「PDF/XPSの作成」をクリックします。
f:id:J-back:20210503211744j:plain:w600


PDFファイルを保存するフォルダを選択し、ファイル名を入力して「発行」をクリックします。
f:id:J-back:20210503211841p:plain:w600


以上でPDF化は完了です。1つのファイルであればすぐにできますが、
やはり多くのファイルについてこれを繰り返すのは時間がもったいないですし、単純作業の繰り返しなのでモチベーションも上がりませんよね。
というわけで、自動化処理を組んでいきましょう。

自動化処理の実行イメージ

VBAのコードの前に、今回作成する処理を動作させた際の使用イメージを記載します。
この記事のコードを実装すると、下のような自動化処理ができるようになります。


今回PDF化するExcelファイルは例として以下のようなものを用意しました。
表が記載されたシートが3枚あり、それぞれを独立したPDFファイルとして保存したいという想定です。
f:id:J-back:20210504115900p:plain:w600


PDF化したい対象のExcelファイルを任意のフォルダ(ここではC:\temp\input)に配置しておきます。
ここでは対象ファイルを適当なファイル名で10個配置しています。
f:id:J-back:20210504120352p:plain:w600


PDF化したファイルを保存するフォルダ(ここではC:\temp\output)を作成しておきます。
f:id:J-back:20210504120527p:plain:w600


マクロが保存されているシートを開き、B1セルに「C:\temp\input」、B2セルに「C:\temp\output」をそれぞれ入力し、
「PDF出力実行」を押下します。
f:id:J-back:20210504121917j:plain:w600


処理が完了すると、「Complete!」というメッセージボックスが表示されます。
f:id:J-back:20210504122419p:plain:w600


B2セルで指定したoutputフォルダを見てみると、PDFファイルができあがっています。
f:id:J-back:20210504122625p:plain:w600


出力されたファイルを開いてみると、問題なくPDF化されていることがわかります。
f:id:J-back:20210504122812p:plain:w600


VBAの環境設定

マクロを実行する前に以下をやっておきましょう。
これをやらないとマクロを実行した際に「Dim fso As FileSystemObject」の部分で
コンパイルエラー:ユーザ定義型は定義されていません。」と出てエラーになります。


VBエディタの画面から「ツール」タブの「参照設定」をクリックします。
f:id:J-back:20210503223957j:plain:w600


Microsoft Scripting Runtime」にチェックを入れてOKを押下します。
f:id:J-back:20210503224121j:plain:w600


VBAによる自動化処理作成

ここからは自動化するためのVBAを組んでいきます。

まずは「pdf_conv.xlsm」というマクロ実行用のExcelシートを作成し、このファイルにマクロのコードを記述していきます。
また、上記のExcelファイルに「operation」シートを作成し、ここに編集するファイルの配置場所などを記載します。

処理の流れとしては「PDF出力実行」ボタンを押下すると、B1セルに入力されたフォルダに配置されているExcelファイルを取り込み、
B2セルに入力されているフォルダにPDFとして保存するようにします。
f:id:J-back:20210504112828p:plain:w600


作成したコードは以下です。

Option Explicit
 
Sub convertToPDF()
 
    Dim targetBook As Workbook 'PDF出力対象ブック
    
    Dim operationSheet As Worksheet
    Dim targetDevSheet As Worksheet, targetTestSheet As Worksheet, targetProSheet As Worksheet 'PDF出力対象シート
    
    Dim inputFolderPath As String, outputFolderPath As String
    Dim inputFileName As String
    Dim outputDevFilename As String, outputTestFilename As String, outputProFilename As String
    Dim prefixDev As String, prefixTest As String, prefixPro As String
    
    Dim fso As FileSystemObject
    Dim files As files, f As File
    
    
    Application.DisplayAlerts = False
    Application.ScreenUpdating = False
    
    
    Set operationSheet = ThisWorkbook.Worksheets("operation")
    inputFolderPath = operationSheet.Range("B1").Value
    outputFolderPath = operationSheet.Range("B2").Value
    
    prefixDev = "dev"
    prefixTest = "test"
    prefixPro = "pro"
    
    
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set files = fso.GetFolder(inputFolderPath + "\").files
    
    
    For Each f In files
    
        Set targetBook = Workbooks.Open(f)
        Set targetDevSheet = targetBook.Worksheets("dev")
        Set targetTestSheet = targetBook.Worksheets("test")
        Set targetProSheet = targetBook.Worksheets("pro")

        
        inputFileName = Replace(f.Name, ".xlsx", "")
        
        
        outputDevFilename = outputFolderPath + "\" + prefixDev + inputFileName + ".pdf"
        outputTestFilename = outputFolderPath + "\" + prefixTest + inputFileName + ".pdf"
        outputProFilename = outputFolderPath + "\" + prefixPro + inputFileName + ".pdf"
        
        
        'PDF出力操作
        targetDevSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=outputDevFilename
        targetTestSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=outputTestFilename
        targetProSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=outputProFilename
                
                       
        targetBook.Close
    
    Next f
    
    MsgBox "Complete!", vbInformation
 
 
End Sub
 

実際にPDF化処理をしているのは最後の方の「ExportAsFixedFormat Type:=xlTypePDF, Filename:=xxxxxx」の部分のみですが、
その前にファイルを開いてシートを読み取る操作や、出力するPDFファイルの名前を編集する操作などが含まれています。

実行ボタンへのマクロ割り当て

このコードを作成後、あらかじめ用意した「PDF出力実行」ボタンにマクロを割り当てておきましょう。
マクロを割り当てたい図形を右クリックし、「マクロの登録」を選択します。
f:id:J-back:20210504121521j:plain:w600


作成したマクロを選択し、「OK」を押下します。
f:id:J-back:20210504121707j:plain:w600


これで「PDF出力実行」ボタンをクリックするとマクロが実行されるようになりました。

おわりに

今回は以上で終わりです。
1つ1つ手作業で実行していたPDF化の操作を自動化できました。
VBAの処理も組み合わせて使うと様々な処理ができるので、今後も思いついたらどんどん書いていきます。

最後まで読んでいただきありがとうございました。