Option Explicit
Option Base 1
Sub Word一括印刷() 'H29.1.22
Dim seDir As String
'Wordファイルが保存されているフォルダーを選択
With Application.FileDialog(msoFileDialogFolderPicker)
If .Show = True Then
seDir = .SelectedItems(1)
Else
Exit Sub
End If
End With
Dim FSobj As Object 'ファイルシステムオブジェクト
Dim FSobjfolder As Object 'フォルダーオブジェクト
Dim FSobjfile As Object 'ファイルオブジェクト
Set FSobj = CreateObject("Scripting.FileSystemObject")
Set FSobjfolder = FSobj.GetFolder(seDir)
Dim cnt As Long 'カウンター
cnt = 0
Dim FName() As String 'Wordファイル名を入れる動的配列変数
For Each FSobjfile In FSobjfolder.Files
'Wordファイルが見つかったらファイル名を配列に入れる
If Right$(FSobjfile.Name, 4) = ".doc" Or Right$(FSobjfile.Name, 5) = ".docx" Then
cnt = cnt + 1
ReDim Preserve FName(cnt)
FName(cnt) = FSobjfile.Name
End If
Next
Set FSobj = Nothing 'オブジェクトを開放
Set FSobjfolder = Nothing 'オブジェクトを開放
Set FSobjfile = Nothing 'オブジェクトを開放
If cnt = 0 Then
MsgBox "Wordファイルが見つかりません。", vbExclamation
Exit Sub
End If
Dim wdApp As Object 'Wordアプリケーションオブジェクト
Dim doc As Object 'Wordドキュメントオブジェクト
Set wdApp = CreateObject("Word.Application")
wdApp.Visible = True 'Wordアプリケーションを表示
Application.DisplayAlerts = False
For cnt = LBound(FName) To UBound(FName)
Debug.Print FName(cnt)
Set doc = wdApp.Documents.Open(seDir & "\" & FName(cnt))
doc.PrintOut
doc.Close
Next cnt
Application.DisplayAlerts = True
wdApp.Quit 'Wordアプリケーションを終了
Set wdApp = Nothing 'オブジェクトを開放
Set doc = Nothing 'オブジェクトを開放
MsgBox "Wordファイルの一括印刷終了", vbInformation
End Sub
Dim sc As New Scripting.FileSystemObject
For Each FSobjfile In FSobjfolder.Files
'Wordファイルが見つかったらファイル名を配列に入れる
' If Right$(FSobjfile.Name, 4) = ".doc" Or Right$(FSobjfile.Name, 5) = ".docx" Then
' cnt = cnt + 1
' ReDim Preserve FName(cnt)
' FName(cnt) = FSobjfile.Name
' End If
Debug.Print FSobjfile.Name
Select Case LCase(sc.GetExtensionName(FSobjfile.Name)) 'hoge.DOCXみたいなのもありそうだからLCaseしておく
Case "doc", "docx"
cnt = cnt + 1
ReDim Preserve FName(cnt)
FName(cnt) = FSobjfile.Name
End Select
Next
田中 宏明さんの投稿
(投稿ID: 2795)
MS-Officeのバージョンを気にせずに実行できるよう工夫しています。
達人養成塾に入って1年以内でこのレベルに到達してことに感謝します。
ゲストさんのコメント
(コメントID: 4234)
スキルが身につくって、うれしいですよね。
拡張子は、Right関数で調べずとも、 .GetExtension で取得して調査したほうがさらにカッコいいかと。
以下に、関連部分だけ示します。
あと、配列使わないで、見つけたら即処理でも良いような気も。
元のコードでは、処理対象がなかった場合はその旨ユーザに通知して処理を終えていますね。
僕の提案した方法でいくなら、その代わり、以下の実装とします。
・処理があったか?というフラグとなる変数をboolean型で用意
・処理を行ったか?は、ループを抜けたところでその変数の値を元に判定。
・処理がなかったと判定した場合はその旨通知。
田中 宏明さんのコメント
(コメントID: 4235)
コメントありがとうございます。
拡張子が大文字の場合、Wordファイルと認識しないことに気がつきました。
思い切って投稿してみてよかったです。
>田中 宏明 さん:
>
>スキルが身につくって、うれしいですよね。
>
>拡張子は、Right関数で調べずとも、 .GetExtension で取得して調査したほうがさらにカッコいいかと。
>
>以下に、関連部分だけ示します。
>
ゲストさんのコメント
(コメントID: 4236)
今後ともお楽しみいただければと!