フォルダ内のWordファイルをPDFで出力する

指定フォルダ内のWordファイルをPDFで出力します。
指定フォルダ直下のみ処理します(サブフォルダ配下は対象外)。

Sub フォルダ内のWordファイルをPDFで出力する()

    Dim StartTime  As Date          '開始時間
    Dim EndTime  As Date            '終了時間
    
    Dim FSO As Object               'ファイルシステムオブジェクト
    Dim FolderPath As String        'ダイアログで指定されたフォルダパス
    Dim objFolder As Object         'フォルダオブジェクト
    Dim objFiles As Object          'ファイルオブジェクト
    Dim objF As Object              'ファイルオブジェクト用for文変数
    Dim FileCount As Long           '処理するファイル数
    Dim FilePaths()                 '処理するファイルパス(配列)
    Dim i As Long
    Dim docWord As Document         '開いたWordファイル
    
    Dim WSH As Variant              'WSH(Windows Scripting Host)
    Dim DefaultPath As String       'デスクトップパス
    
    Set FSO = CreateObject("Scripting.FileSystemObject")
    Set WSH = CreateObject("WScript.Shell")
    
    Dim strOutputFolder As String   '出力先フォルダ
    Dim PdfOptimizeOption As Long   'PDF最適化オプション
    Dim MsgRtn As Long              'Msgboxの戻り値
        
    StartTime = Now()   '開始時間
    
    '--------------------------------------
    'フォルダと直下のファイルを取得
    '--------------------------------------
    'フォルダダイアログ
    DefaultPath = WSH.SpecialFolders("Desktop") & "\"   'デスクトップに指定
    With Application.FileDialog(msoFileDialogFolderPicker)
        .InitialFileName = DefaultPath      'デフォルトフォルダをデスクトップにする
        If .Show = True Then
            FolderPath = .SelectedItems(1)
        End If
    End With
    'フォルダダイアログで「キャンセル」したので終了
    If FolderPath = "" Then Exit Sub
    'フォルダ取得
    Set objFolder = FSO.GetFolder(FolderPath)
    'ファイルが1つもない場合は終了
    If objFolder.Files.Count = 0 Then
        '終了メッセージ
        MsgBox "指定されたフォルダにはファイルが1つもないので、終了します。", _
            vbOKOnly + vbExclamation
        Exit Sub
    End If
    'ファイル取得
    Set objFiles = objFolder.Files
    
    '--------------------------------------
    'ファイルパスを取得
    '--------------------------------------
    '処理するファイル数の初期化
    FileCount = 0
    For Each objF In objFiles
        'Wordのファイルのみ処理
        If LCase(FSO.GetExtensionName(objF.Name)) = "doc" Or _
            LCase(FSO.GetExtensionName(objF.Name)) = "docx" Then
            'ファイルカウント
            FileCount = FileCount + 1
            'ファイルパスを取得するための動的配列を定
            If FileCount = 1 Then
                ReDim FilePaths(FileCount)
            Else
                ReDim Preserve FilePaths(FileCount)
            End If
            'ファイルパスを配列に格納
            FilePaths(FileCount) = objF
        End If
    Next objF
    
    '処理対象のファイルが1つもない場合は終了
    If FileCount = 0 Then
        '終了メッセージ
        MsgBox "指定されたフォルダには処理対象となるファイルが1つもないので、終了します。", _
                vbOKOnly + vbExclamation
        Exit Sub
    End If
    
    '--------------------------------------
    'PDFファイルの出力先フォルダを作成
    '--------------------------------------
    Do
        strOutputFolder = FolderPath & "\" & "pdf_" & Format(Now(), "yymmdd_hhmmss")
        'フォルダがなかったら
        If FSO.FolderExists(strOutputFolder) = False Then
            'フォルダ作成
            On Error Resume Next
            FSO.CreateFolder (strOutputFolder)
            On Error GoTo 0
            If Err.Number = 0 Then
                Exit Do
            Else
                MsgBox "出力用フォルダを作成できませんでした。終了します。" & _
                        vbCrLf & vbCrLf & _
                        Err.Number & " : " & Err.Description & vbCrLf & vbCrLf & _
                        "フォルダ名:" & strOutputFolder, _
                        vbOKOnly + vbExclamation
                Exit Sub
            End If
        End If
    Loop
    
    '--------------------------------------
    'PDF最適化オプション選択
    '--------------------------------------
    MsgRtn = MsgBox("PDF最適化オプションはデフォルトのままでいいですか?" & _
            vbCrLf & vbCrLf & _
            "はい(デフォルト):標準(オンライン発行及び印刷)" & vbCrLf & _
            "いいえ      :最小サイズ(オンライン発行)" & vbCrLf & vbCrLf & _
            "※よくわからない場合は「はい」を選んでください。", _
            vbYesNo + vbInformation)
    If MsgRtn = vbYes Then
        PdfOptimizeOption = wdExportOptimizeForPrint '標準(オンライン発行及び印刷)
    ElseIf MsgRtn = vbNo Then
        PdfOptimizeOption = wdExportOptimizeForOnScreen '最小サイズ(オンライン発行)
    End If

    
    '--------------------------------------
    'ファイルを開いて処理する
    '--------------------------------------
    For i = 1 To FileCount
        'ファイルを開く(読み取り専用)
        Documents.Open FilePaths(i), ReadOnly:=True
        Set docWord = ActiveDocument
        
        docWord.ExportAsFixedFormat OutputFileName:=strOutputFolder & "\" & FSO.GetBaseName(docWord.Name) & ".pdf", _
            ExportFormat:=wdExportFormatPDF, OptimizeFor:=PdfOptimizeOption
        'ファイルを閉じる
        docWord.Close SaveChanges:=wdDoNotSaveChanges
    Next i
    
    '--------------------------------------
    '終了
    '--------------------------------------
    '終了時間
    EndTime = Now()
    '終了メッセージ
    MsgBox "PDFを " & FileCount & " ファイル出力しました。" & vbCrLf & vbCrLf & _
           "出力先フォルダ:" & strOutputFolder & vbCrLf & _
            "処理時間: " & Format(EndTime - StartTime, "hh:mm:ss"), _
            vbOKOnly + vbInformation
    
    'オブジェクトクリア
    Set FSO = Nothing
    Set objFolder = Nothing
    Set objF = Nothing
    Set docWord = Nothing
    Set WSH = Nothing

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