【VBA】Excelファイルを一括でPDFファイルに変換する方法

VBA

概要

「Excelファイルを一括でPDFファイルに変換する方法」を説明する上で、PDFに変換するツールを作成する手順を用いて説明していきます。作成するツールの仕様は、PDFに変換したいExcelファイルを「入力ファイル格納フォルダ」に格納し、マクロを実行することで、「出力ファイル格納フォルダ」に変換したPDFファイルを出力するツールとなります。

ツールの作成手順

今回作成するツールは、以下の2つの手順を実施するだけになります。

・PDFに変換するために必要な情報を入力
・ExcelファイルをPDFに変換(VBAマクロ作成)

PDFに変換するために必要な情報を入力

PDFに変換するために必要な情報として以下の3点の入力情報が必要となります。

・入力ファイル格納フォルダ(PDFに変換したいExcelファイルを格納するフォルダ)
・出力ファイル格納フォルダ(変換したPDFファイルを出力するフォルダ)
・出力モード(「Excelのブック毎にPDF変換するのか」「シート毎にPDF変換するのか」)

入力情報は、ツール実行時に情報を打ち込むダイアログを作成してもいいですが、今回は入力情報を設定するシートを作成しております。イメージは以下の用なシートになります。

「入力ファイル格納フォルダ」と「出力ファイル格納フォルダ」については説明は不要かと思いますので、「出力モード」について説明致します。出力モードでは、ブック単位でPDFを作成するかシート単位でPDFを作成するかを決めることができます。詳細は以下で説明致します。

Excelのブック毎にPDFに変換

Excelをブック毎にPDFに変換するとは、1ブック内に複数のシートがあった場合であっても、1つのPDFファイルとして出力するということになります。以下のように「出力テスト.xlsx」の中に「AAAシート」「BBBシート」「CCCシート」があった場合、3シート分を1PDFファイルに出力します。

Excelのシート毎にPDFに変換

Excelをシート毎にPDFに変換するとは、1ブック内に複数のシートがあった場合、複数のPDFファイルとして出力するということになります。以下のように「出力テスト.xlsx」の中に「AAAシート」「BBBシート」「CCCシート」があった場合、各シート毎にPDFファイルに出力します。

※「ファイル名_シート名」でファイル出力

ExcelファイルをPDFに変換(VBAマクロ作成)

次に実際のソースコードを書いて説明していきます。最後に全体のソースコードを載せます。
以下の構成で説明していきます。

・変数定義
・入力情報のチェック
・PDFに変換

変数定義

マクロを作成する上で、使用する変数を一番初めに定義していきます。コードは以下になります。

'========================================
' 変数定義箇所
'========================================
Public Const BOOK_MODE = "ブック単位"
Public Const SHEET_MODE = "シート単位"
    
'PDFを保存するファイルパスを指定
Dim filePath As String
'出力ファイルパス
Dim outputDir As String
'入力ファイルパス
Dim inputDir As String
'出力モード
Dim mode As String
'ループカウンタ
Dim i As Integer
'シート名称
Dim sheetName As String

入力情報のチェック

入力情報を入力するシートに値が設定されていることを確認します。入力するシートの名称は仮に「出力設定」としてコードを書いていきます。

'入力情報シートをアクティブにする
Worksheets("出力設定").Activate

'========================================
' 入力情報のチェック
'========================================

'入力ファイル格納フォルダ(出力設定シートのC3に値が設定されている場合)
inputDir = Cells(3, 3).Value
'出力ファイル格納フォルダ(出力設定シートのC6に値が設定されている場合)
outputDir = Cells(6, 3).Value

'出力モード(出力設定シートのC9に値が設定されている場合)
mode = Cells(9, 3).Value

'入力ファイルパスに値が設定されているか
If inputDir = "" Then
    MsgBox "入力ファイル格納フォルダが設定されていません。"
    Exit Sub
End If

'出力ファイルパスに値が設定されているか
If outputDir = "" Then
    MsgBox "出力ファイル格納フォルダが設定されていません。"
    Exit Sub
End If

'モードに値が設定されているか
If mode = "" Then
    MsgBox "出力モードが設定されていません。"
    Exit Sub
End If

PDFに変換

入力ファイル格納フォルダに格納したExcelファイルをPDFに変換する箇所のコードを記載致します。変換する箇所はモードによって出力方法をブック毎かシート毎かに分けております。

'入力フォルダにある全てのファイルを取得
Set FSO = New FileSystemObject
Set TARGET = FSO.GetFolder(inputDir).Files
Dim arr() As String

For Each TEMP In TARGET
    
    arr = Split(TEMP.Name, ".")
    
    '========================================
    ' ブック単位にPDF変換
    '========================================
    If mode = BOOK_MODE Then
        'PDFへ変換するファイルを開く
        Workbooks.Open Filename:=inputDir & "\" & TEMP.Name
    
        '開いたブックを、PDFで保存
        ActiveWorkbook.ExportAsFixedFormat 0, outputDir & "\" & arr(0) & ".pdf"

        '開いたブックを閉じる
        ActiveWorkbook.Close False
    '========================================
    ' シート単位にPDF変換
    '========================================
    ElseIf mode = SHEET_MODE Then
    
        'PDFへ変換するファイルを開く
        Workbooks.Open Filename:=inputDir & "\" & TEMP.Name
        
        'シートの枚数分ループ
        For i = 1 To Sheets.Count
            'ワークシートをアクティブにする
            Worksheets(i).Activate
            'シート名称の取得
            sheetName = ActiveSheet.Name
            'シート毎にPDFで保存
            ActiveSheet.ExportAsFixedFormat 0, outputDir & "\" & arr(0) & "_" & sheetName & ".pdf"
            
        Next i
    
        '開いたブックを閉じる
        ActiveWorkbook.Close False
    End If
    
Next

MsgBox "PDFファイルの出力が完了しました。"

ソースコード全体

上記で説明したソースコードをまとめて記載したものが以下になります。

'PDF出力
Sub pdfOutput()
    '========================================
    ' 変数定義箇所
    '========================================
    Public Const BOOK_MODE = "ブック単位"
    Public Const SHEET_MODE = "シート単位"
    
    'PDFを保存するファイルパスを指定
    Dim filePath As String
    '出力ファイルパス
    Dim outputDir As String
    '入力ファイルパス
    Dim inputDir As String
    '出力モード
    Dim mode As String
    'ループカウンタ
    Dim i As Integer
    'シート名称
    Dim sheetName As String
    '出力データシートをアクティブにする
    Worksheets("出力設定").Activate


    '========================================
    ' 入力情報のチェック
    '========================================
    '出力設定シートの入力チェック
    inputDir = Cells(3, 3).Value
    outputDir = Cells(6, 3).Value
    mode = Cells(9, 3).Value
    
    '入力ファイルパスに値が設定されているか
    If inputDir = "" Then
        MsgBox "入力フォルダが設定されていません。"
        Exit Sub
    End If
    
    '出力ファイルパスに値が設定されているか
    If outputDir = "" Then
        MsgBox "出力フォルダが設定されていません。"
        Exit Sub
    End If
    
    'モードに値が設定されているか
    If mode = "" Then
        MsgBox "出力モードが設定されていません。"
        Exit Sub
    End If
    
    '入力フォルダにある全てのファイルを取得
    Set FSO = New FileSystemObject
    Set TARGET = FSO.GetFolder(inputDir).Files
    Dim arr() As String

    For Each TEMP In TARGET
        
        arr = Split(TEMP.Name, ".")
        
        '========================================
        ' ブック単位にPDF変換
        '========================================
        If mode = BOOK_MODE Then
            'PDFへ変換するファイルを開く
            Workbooks.Open Filename:=inputDir & "\" & TEMP.Name
        
            '開いたブックを、PDFで保存
            ActiveWorkbook.ExportAsFixedFormat 0, outputDir & "\" & arr(0) & ".pdf"
    
            '開いたブックを閉じる
            ActiveWorkbook.Close False
        '========================================
        ' シート単位にPDF変換
        '========================================
        ElseIf mode = SHEET_MODE Then
        
            'PDFへ変換するファイルを開く
            Workbooks.Open Filename:=inputDir & "\" & TEMP.Name
            
            'シートの枚数分ループ
            For i = 1 To Sheets.Count
                'ワークシートをアクティブにする
                Worksheets(i).Activate
                'シート名称の取得
                sheetName = ActiveSheet.Name
                'シート毎にPDFで保存
                ActiveSheet.ExportAsFixedFormat 0, outputDir & "\" & arr(0) & "_" & sheetName & ".pdf"
                
            Next i
        
            '開いたブックを閉じる
            ActiveWorkbook.Close False
        
        
        End If
        
    Next

    MsgBox "PDFファイルの出力が完了しました。"

End Sub

上記のソースをそのまま転記していただければ使用できますが、「FileSystemObject」を使用しているのでExcel側の設定を入れないといけない可能性があります。その場合「FileSystemObject 参照設定」でGoogle検索してください。参照設定する詳細がすぐに出てくると思います。

最後に

エンジニアとして細かくても技術力を上げていけば、個人でも会社でもお金を稼げるようになっていきます。私から3点お金を稼ぐための方法をおススメします。

副業サイトでお金を稼ぐ

一番最初が副業サイトでお金を稼ぐです!
私は、副業サイトのココナラで月にVBAを作成し月に2~3万円ほど稼いでいます。VBAを作成している人の提案を購入したり、自身でVBAを作成し販売することもできます。
プログラミング関連だけでなく、私のProfileのアイコンもココナラで頼んで1000円で作成してもらいました!登録は無料なので、是非登録してみてください。

キャリアアップのための転職をする

転職というと、そりゃ給料上がるだろ!って思う方が多いと思いますが、エンジニアは転職してなんぼの職種です。就職難の昨今でもエンジニアは現場に人が足りていません。そのため、ある程度のお金を払っても入社してくれる方を探している企業が多いのが現状です。
また、会社にもよりますが、多くの会社は入社してから数年間は雀の涙程度の給料しかあがっていきません。ただ、転職することで、100万円単位で年収が上がっていくこともざらにあります。
エンジニアは転職してキャリアアップしていく職種と言えます。

私も使用していましたが、やはり転職サイトは大手がいいでしょう!大手の方が、企業との付き合いも多く給与面も福利厚生面も手厚いところを紹介してくれます。

フリーランスエンジニアになる

最後はハードルが高そうに見えるフリーランスエンジニアになります。副業と転職に比べると確かにハードルは高いですが、皆さんが思っているような、何でもできるエンジニアの方はあまりいません。フリーランスエンジニアの方に話を聞くとやっぱり給与面でフリーランスになる方が多いです。

例えば、大手のSierで働いてたとすると、1カ月大体一人当たり200万円、顧客からお金をもらって働きます。大手の子会社となると、200万円から半分の100万円程度で雇われるのが一般的です。
ここから3割程度は個人の給与として支払われ、残りの7割は企業の取り分となります。企業に雇われているので仕方ないですねw

ただ、フリーランスエンジニアは、大手の用にはいかないですが、子会社と同じぐらいの100万円程度で雇ってもらい。そこから企業の取り分がないため、全額自分に入ってきます。福利厚生等はありませんが、金額だけ聞くと驚愕ですねw最近はフリーランスの人が入る団体等もあり、フリーランスの方が活躍できる環境が整ってきています。

フリーランスの方専用のスクール等もあるので、相談してみるのもいいと思います。

コメント

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