みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。
複数のWordドキュメントについて一括で処理をするWordマクロの作り方についてのシリーズ、第二回目です。
前回の記事はコチラ。
ドキュメントファイルを開く方法と閉じる方法についてお伝えしました。
今回ですが、もう一括処理、進めちゃいます。
Word VBAでフォルダ内のドキュメント全てを順番に開いて操作をする方法です。
では、行ってみましょう!
FileSystemオブジェクトとは
さて、今回は「フォルダ内にある全てのドキュメント」を操作していきたいわけですから、フォルダの操作が必要になります。
そして、VBAでフォルダやファイル、またはドライブなどを操作するときには、FileSystemオブジェクトと呼ばれるオブジェクトを使います。
FileSystemオブジェクトの生成と破棄
まず、FileSystemオブジェクトを使う場合は以下命令によってFileSystemオブジェクトを生成してオブジェクト変数にセットする必要があります。
また、FileSystemオブジェクトを使い終わった際には、以下のようにして、生成したオブジェクトを破棄します。
ですから、一般的にFileSystemオブジェクトを使うプロシージャは以下のような構成になります。
Sub openDocs()
Dim objFso As Object
Set objFso = CreateObject("Scripting.FileSystemObject")
'処理
Set objFso = Nothing
End Sub
これで、objFsoという名称でFileSystemオブジェクトを生成し、何らかの操作をした上で破棄するという流れができました。
指定したフォルダ内のファイルを参照する
では、FileSystemオブジェクトを使って、フォルダ内のファイルを参照する方法を見ていきましょう。
getFolderメソッドでフォルダを取得する
フォルダを取得するにはgetFolderメソッドを使います。
フォルダを取得する場合は、フォルダのフルパスを指定して、以下のように書きます。
例えば、以下のプロシージャを実行してみますと、現在マクロを記述しているドキュメントが保存されているフォルダのフォルダ名が表示されます。
Sub openDocs()
Dim objFso As Object
Set objFso = CreateObject("Scripting.FileSystemObject")
Debug.Print objFso.getFolder(ThisDocument.Path).Name
Set objFso = Nothing
End Sub
Nameプロパティですが、フォルダ名を知ることができます。
Filesプロパティでファイルをコレクションとして取得する
続いて、Filesプロパティを使ってフォルダ内のファイルをコレクションとして取得します。
これで、指定したFolderオブジェクトのFilesコレクションを取得できます。
For Each~Next文でフォルダ内のファイルを一つ一つ操作する
こうして取得したFilesコレクションの要素であるFileオブジェクト一つ一つに対して処理を行っていきたいのですが、そのようなときに便利な繰り返し構文、For Each~Next文があります。
以下のように書きます。
’処理
Next 変数
毎回の繰り返しでコレクションの要素一つ一つを取り出して変数に格納した上でブロック内の処理を行います。そして、コレクション内のすべての要素に対して処理を終えると、繰り返しから抜けるというものです。
これ、すごく便利なので、ぜひ覚えておいてくださいね。
フォルダ内のドキュメント名を出力する
マクロが存在しているフォルダ内に「原稿」というフォルダがありまして、その中身は以下のようになっています。
テストとして、このフォルダ内のドキュメントを開いて、ドキュメント名を出力して、閉じるというプロシージャを作ってみましょう。
Sub openDocs()
Dim objFso As Object
Set objFso = CreateObject("Scripting.FileSystemObject")
Dim strPath As String
strPath = ThisDocument.Path & "\原稿\"
Dim obj As Object
For Each obj In objFso.getfolder(strPath).Files
With Documents.Open(strPath & "\" & obj.Name)
Debug.Print .Name
.Close
End With
Next obj
Set objFso = Nothing
End Sub
これを実行すると、以下のようにドキュメント名がイミディエイトウィンドウに出力されます。
Nameプロパティでファイル名を取得する
Openメソッドでドキュメントを開く際にファイル名が必要になりますが、ファイル名はFileオブジェクトのNameプロパティで取得できます。
ドキュメント名=ファイル名を取得するだけなら、わざわざOpenメソッドで開く必要はないのですが、何かWordマクロならではの処理を加えるのであれば、開く必要が出てきますね。
まとめ
Word VBAでフォルダ内の全てのドキュメントを順番に操作する方法についてお伝えしました。
- FileSystemオブジェクトでフォルダとそのFilesコレクションをつかむ
- For Each~Next文でその要素であるファイル一つ一つについて繰り返し処理をする
この二つが、今後ずーっとお世話になる重要なテクニックになりますので、ぜひマスター下さいませ。
では次回、実際に開いたファイルについて色々な処理をしていきたいと思います。
どうぞお楽しみに!