指定フォルダ内の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
