VBAでExcelファイルとWordファイルをPDF化するマクロ

仮想プリンタを使わなくてもPDF出力できます

PDF化と言うと仮想プリンタを使って印刷処理でPDF化する方法が有名ですが
現代のエクセルやワードはファイルの保存で普通にPDFファイルを保存することが可能です

昔ながらの仮想プリンタでPDF出力する画面
f:id:keiaruesu:20210422213445p:plain

現代では普通にPDF保存できるようになってる
Office2012あたりからできるようになった
f:id:keiaruesu:20210422214251p:plain

というわけでVBAでPDFファイル出力するときもExportAsFixedFormatというコマンドで簡単に出力可能になってます

エクセルファイルのPDF出力

エクセルのPDF保存の場合、いろいろ省略するとこんな感じになる

    'ワークブック
    Dim workbookObj As Workbook
    '開く
    Set workbookObj = Workbooks.Open(fileName:=excelFilePath, UpdateLinks:=0, ReadOnly:=True, IgnoreReadOnlyRecommended:=True)

    'PDF出力
    Call workbookObj.ExportAsFixedFormat(xlTypePDF, pdfFilePath)

    'ブックを閉じる
    Call workbookObj.Close

 上記のような単純なWorkbooks.Openの場合、他人や自分が開いてるエクセルファイルを開こうとしていろいろ不都合が発生したりする。そのため下で紹介してるサンプルコードでは「Dim excelApp As New Excel.Application」を使ってプロセスを新しく作成してPDF化するファイルはそっちで開くようにしている。エクセル開く系の処理はこれを頻繁に使うと思うので覚えておいて損はない

ワードファイルのPDF出力

ワードのPDF保存の場合、いろいろ省略するとこんな感じになる

    '必要な参照設定
    'Microsoft Word 16.0 Object Library
    'wordの新規プロセス
    Dim wordApp As New Word.Application
    'wordドキュメントオブジェクト
    Dim wordDoc As Word.Document

    wordApp.Visible = True

    'ドキュメント開く
    Set wordDoc = wordApp.Documents.Open(wordFilePath, ReadOnly:=True)
    'PDF出力
    Call wordDoc.ExportAsFixedFormat(pdfFilePath, wdExportFormatPDF)

    'プロセス開放
    Call wordDoc.Close
    Call wordApp.Quit

 エクセルでワードファイル開くときは「Microsoft Word 16.0 Object Library」の参照設定が必要になるので注意しよう。サンプルコードでは参照設定なしでも動くコードもついでに書いておいたけど参照設定ある版のほうが色々楽だと思う
 エクセルでもワードでもPDF出力に使うのはExportAsFixedFormatという処理だけど渡す引数や引数の並びは全然違うので注意しよう、てかなんで共通じゃないんだこれ

サンプルコード

続きを読む

VBAで全ファイルを一覧表示するサンプル

f:id:keiaruesu:20210419211946j:plain
エクセルマクロで指定フォルダ以下のファイルやフォルダに対していろいろ処理をしたいということはよくあると思うのでその雛型になるサンプルを置いておく

ファイル一覧出力の簡単なサンプルコード

とりあえずアルゴリズムがどうなってんのか分かりやすくしたコードがコレ
エクセルVBAに貼り付けて「execFileListOutput」を呼び出せば動くと思う

なるべく簡単にしたサンプルコード

Option Explicit

'必要な参照設定
'Microsoft Scripting Runtime

'出力ログの開始Range
Dim logStartRange As Range

'ファイルリスト出力処理の呼び出し元
Public Sub execFileListOutput()
    
    '検索するフォルダパスの指定
    Dim searchPath As String
    searchPath = "C:\Users\Public\Documents"
    
    'リスト書き出しの開始位置
    Set logStartRange = Range("A10")
    
    'ヘッダを作成
    logStartRange.Offset(0, 0) = "ファイルパス"
    logStartRange.Offset(0, 1) = "ファイル名"
    
    'セルを初期位置へ移動
    logStartRange.Activate
    
    'ファイルの一覧出力開始
    Call getFileList(searchPath)

    '横幅調整
    Cells.Columns.AutoFit

    Call MsgBox("処理が終わりました")

End Sub

'ファイルリストの出力処理
'再帰呼び出しでサブフォルダも探索するよ
Private Sub getFileList(ByVal searchPath As String)
    
    Dim fso As New FileSystemObject
    Dim objFile As File
    Dim lastLogRange As Range
    
    'ファイルの取得
    For Each objFile In fso.GetFolder(searchPath).Files
        
        'ログ最終行の1行下を取得
        Set lastLogRange = ActiveCell.Offset(1, 0)
        lastLogRange.Activate
        
        'ファイルの情報を書き出し
        'パス
        lastLogRange.Offset(0, 0).Value = objFile.Path
        'ファイル名
        lastLogRange.Offset(0, 1).Value = objFile.Name
    Next

    'サブフォルダの探索
    Dim objSubFolder As Folder
    
    For Each objSubFolder In fso.GetFolder(searchPath).SubFolders
        
        '再起呼び出しだよ
        Call getFileList(objSubFolder.Path)
    Next

End Sub

getFileListでファイル一覧を出力、サブフォルダがあった場合getFileListの中でgetFileListを呼び出すことでサブフォルダ内でも一覧出力処理を繰り返す典型的な再帰呼び出しの処理だね
より実践的にするにはアクセス権の関係とかで開けないファイルフォルダが稀によく出てくるのでエラー処理やファイルフォルダの属性チェックなどをする処理を割と入念に入れておこう

より実践的なサンプルコード

続きを読む