コピペプログ

VBA、VBS、バッチファイルなどの備忘録と日記です。

【VBS】Word・Excel・PowerPointをPDFに一括変換する【VBScript】

ネット上で見つけた便利なコードを改造。 ドラッグアンドドロップでフォルダ内のofficeファイルをPDFに変換します。 仕事で大量のWordファイルやExcelファイルのマニュアルをPDFに変換することに… 先人のコードを参考に機能を付け足して作りました。

【欲しかった機能】

  • フォルダドロップ

  • サブフォルダ内も実行

  • ファイルのあるフォルダ内に変換後のファイルを作成

  • 変換前と同じファイル名

  • 処理中の表示

Option Explicit
'IE の宣言と初期化
Dim ie
initializeIe()
updateMsg "処理を開始します..."

'------------------------------------------------
'ドラッグ&ドロップされたフォルダの処理
Dim Args  

Set Args = WScript.Arguments
If Args.Count <> 1 Then '処理できるのは1フォルダのみ
    WScript.Echo "当スクリプトに対象となる1フォルダをドラッグ&ドロップして処理を実行してください。"
    WScript.Quit    'スクリプトを終了
End If

'フォルダ判別
With CreateObject("Scripting.FileSystemObject") '以下の処理はEnd WithまでScripting.FileSystemObjectを使用
    If .FolderExists(Args(0)) = False Then  'ドラッグされたものを解析
        WScript.Echo "フォルダが見つかりません。" & vbCrLf & "あるいはフォルダではありません。"
        closeIe()
        WScript.Quit
    End If
End With

'officeファイルの有無チェック「IsExistsParticularFile」に処理渡した結果下で処理
If (IsExistsParticularFile(Args(0), "doc") = False) And _
    (IsExistsParticularFile(Args(0), "docx") = False) And _
    (IsExistsParticularFile(Args(0), "xls") = False) And _
    (IsExistsParticularFile(Args(0), "xlsx") = False) And _
    (IsExistsParticularFile(Args(0), "xlsm") = False) And _
    (IsExistsParticularFile(Args(0), "ppt") = False) And _
    (IsExistsParticularFile(Args(0), "pptx") = False) Then
    WScript.Echo "指定したフォルダ内にOFFICEファイルが見つかりませんでした。"
    closeIe()
    WScript.Quit
End If

' 処理…
updateMsg "PDF変換処理を実行しています..."
WScript.Sleep 5000  ' サンプル用・処理している風に少し止める

ConvertWordToHtml Args(0) 'WordToHtmlへWScript.Argumentsを渡して呼び出し。フォルダパスとかファイル名とか。

' 完了
updateMsg "スクリプト処理完了!"
WScript.Echo "処理が終了しました。"
' IE を終了させスクリプトを閉じる
closeIe()
WScript.Quit
'---------------------------------------------------------------
Private Sub ConvertWordToHtml(ByVal FolderPath)
'指定したフォルダ内のWordファイルをPDFファイルに変換
Dim wdApp, wdDoc, exApp, exBook, pwApp, pwSs
Dim f

Const msoFalse = 0
Const msoTrue = -1
Const xlTypePDF = 0
Const xlQualityStandard = 0
Const wdExportFormatPDF = 17
Const wdExportOptimizeForPrint = 0
Const wdExportAllDocument = 0
Const wdExportDocumentContent = 0
Const wdExportCreateWordBookmarks = 2
Const wdDoNotSaveChanges = 0

Set wdApp = CreateObject("Word.Application")     'Wordのオブジェクトを作成
Set exApp = CreateObject("Excel.Application")     'Excelのオブジェクトを作成
Set pwApp = CreateObject("PowerPoint.Application")     'PowerPointのオブジェクトを作成
wdApp.Visible = False 'Wordアプリを非表示
exApp.Visible = False 'Excelアプリを非表示
pwApp.Visible = True 'PowerPointアプリを非表示
pwApp.WindowState = 2 'ppWindowMinimized 
  
If Right(FolderPath, 1) <> ChrW(92) Then FolderPath = FolderPath & ChrW(92) 'FolderPath末尾¥をつける処理 ChrW(92)は「¥」Chr 【キャラクター】関数
    With CreateObject("Scripting.FileSystemObject")
        For Each f In .GetFolder(FolderPath).Files 'ファイルの数だけ繰り返し処理
            Select Case LCase(.GetExtensionName(f)) 'ファイル形式が当てはまれば処理
        'Wordファイルのみ処理
            Case "doc", "docx"
                Set wdDoc = wdApp.Documents.Open(CStr(f)) 'Wordで対象ファイルを開く
                wdDoc.ExportAsFixedFormat FolderPath & .GetBaseName(f) & ".pdf", wdExportFormatPDF, False'HTM形式で保存する
                wdDoc.Close wdDoNotSaveChanges '対象ファイル閉じる
                Set wdDoc = Nothing '変数の片付け
            Case "xls", "xlsx", "xlsm"
                Set exBook = exApp.Workbooks.Open(CStr(f)) 'Excelで対象ファイルを開く
                exBook.ExportAsFixedFormat xlTypePDF, FolderPath & .GetBaseName(f) & ".pdf", xlQualityStandard, False, False, , , False 
                exBook.Close wdDoNotSaveChanges '対象ファイル閉じる
                Set exBook = Nothing '変数の片付け
            Case "ppt", "pptx"
                Set pwSs = pwApp.Presentations.Open(CStr(f)) 'PowerPointで対象ファイルを開く
                pwSs.SaveAs, FolderPath & .GetBaseName(f) & ".pdf", ppSaveAsPDF, msoTrue '
                pwSs.Close wdDoNotSaveChanges '対象ファイル閉じる
                Set pwSs = Nothing '変数の片付け
        End Select
    Next
End With
wdApp.Quit 'Wordアプリを終了
exApp.Quit 'Excelアプリを終了
pwApp.Quit 'PowerPointアプリを終了

End Sub
'------------------------------------------------------------------------------------------------------------------

Private Function IsExistsParticularFile(ByVal FolderPath, ByVal FileExtension)
'指定したフォルダ内に特定の拡張子のファイルがあるかを調べる
Dim ret
Dim f
 
ret = False '初期化
With CreateObject("Scripting.FileSystemObject")
    For Each f In .GetFolder(FolderPath).Files
        Select Case LCase(.GetExtensionName(f))
        Case LCase(FileExtension)
            ret = True
            Exit For
        End Select
    Next
End With
IsExistsParticularFile = ret
End Function
'------------------------------------------------------------------------------------------------------------------
' IE の初期化
Sub initializeIe()
  Set ie = CreateObject("InternetExplorer.Application")
  With ie
    .Navigate("about:blank")
    .ToolBar = False
    .StatusBar = False
    ' 幅・高さの設定
    .Width = 300
    .Height = 200
    ' 画面右上に配置する。"parentWindow.screen" はパスカルケースで書くと認識されない
    .Top = 0
    .Left = .Document.parentWindow.screen.Width - 300
    .Document.Charset = "UTF-8"
    .Visible = True
    .Document.Title = "スクリプト実行中"
  End With
End Sub
'------------------------------------------------------------------------------------------------------------------
' メッセージを IE に追記する
' 引数のメッセージを IE の最終行に追記する。
' 最終行が表示されるようにスクロール位置を最下部に設定する。
Sub updateMsg(value)
  With ie
    .Document.Body.innerHTML = .Document.Body.innerHTML & value & "<br>"
    .Document.Script.setTimeout "javascript:scrollTo(0," & .Document.Body.ScrollHeight & ");", 0
  End With
End Sub

' IE を終了する
Sub closeIe()
  ie.Quit
  Set ie = Nothing
End Sub