みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。
Word文書ですが、複数のドキュメントファイルに一気に同じ処理を加えたいときありますよね。
例えば以下のようなニーズがあります。
- 文書全体のフォント種類を変更したい
- 全角スペースを取り除きたい
- 特定の文字列を別の文字列に置換したい
- 文書のページ数や文字数を調べたい
このような要望が出てきたときは、VBAの出番ですよね。
ドキュメントファイルがどんなにたくさんあったとしても、マクロさえ仕込んでおけば、あとはPCが自動で勝手に、そして正確に処理をしてくれます。
ということで、今回から何回かにわけて複数のWordドキュメントについて一括で処理をするWordマクロの作り方についてお伝えしますね。
今回は一回目ということで、ドキュメント一括処理の基本中の基本、最初の一歩です。Word VBAでドキュメントファイルを開く方法、そして閉じる方法についてお伝えします。
では、行ってみましょう!
OpenメソッドでWordドキュメントを開く
Word VBAでドキュメントを開く場合は、Documentsコレクションに対するOpenメソッドを使います。
Documentオブジェクトではなくて、Documentsコレクションが対象ということに注意くださいね。コレクションに開いたドキュメントを追加するイメージです。
また、ファイル名はパスを指定しないと「既定のローカルフォルダの保存場所」(「ファイル」→「オプション」→「保存」で確認できます)に存在するファイルを開きます。
ですが、多くの場合は別のフォルダであることが多いと思いますのでフルパスを指定します。
以下画像のようにフォルダ「C:\Users\ntaka\Dropbox\desktop\word-document」内の「原稿(1章).docx」を開きたいとします。
その場合は、以下のようなプロシージャを実行すれば、開くことができます。
Sub openDoc()
Documents.Open "C:\Users\ntaka\Dropbox\desktop\word-document\原稿(1章).docx"
End Sub
こちら実行をしますと、以下のように「原稿(1章).docx」が開きます。
なつかしい原稿が開きました。
Pathプロパティでドキュメントのパスを取得する
ファイル名フルパスの指定、長すぎてちょっと面倒ですね。
今回の場合は、Pathプロパティを活用するのがおすすめです。
これで、指定したDocumentオブジェクトが格納されているフォルダパスを取得できます。
マクロを記述しているドキュメントはThisDocumentと表すことができますから、上記のプロシージャは
Sub openDoc()
Documents.Open ThisDocument.Path & "\原稿(1章).docx"
End Sub
と書き直すことができます。
開いたドキュメントを取り扱う方法
ただ、これでは開いただけで何の操作もできません。
ほとんどの場合は開いた後に、そのドキュメントに何かしらかの操作をしたいわけですから、その方法を知る必要がありますよね。
開いたドキュメントをオブジェクト変数にセットする
一つの方法としては、開いたドキュメントをオブジェクト変数にセットする方法です。
このように書きますね。
Openメソッドは戻り値で開いたDocumentオブジェクトを返しますから、それをすぐさまオブジェクト変数にセットしてしまうのです。
ところで、今回は引数の指定が括弧内になっていますね。戻り値がある場合は、引数の指定は括弧内になりますからね。覚えておくと良いです。
例えば、このようなプロシージャですね。
Sub openDoc()
Dim doc As Document
Set doc = Documents.Open(ThisDocument.Path & "\原稿(1章).docx")
Debug.Print doc.Name
End Sub
実行しますと、指定したドキュメントが先ほどと同様開くとともに、イミディエイトウィンドウにファイル名が出力されます。
DocumentオブジェクトのNameプロパティは、ドキュメントのファイル名を表します。
開くドキュメントとWithステートメント
別の方法として、Openメソッドで開いたドキュメントをWithステートメントでくくるという方法があります。
’処理
End With
こちらも引数の指定がカッコつきになりますので、ご注意くださいね。
プロシージャとしては以下のようなパターンです。
Sub openDoc()
With Documents.Open(ThisDocument.Path & "\原稿(1章).docx")
Debug.Print .Name
End With
End Sub
これでWithブロック内は開いたオブジェクトを対象として処理を書くことができます。
オブジェクト変数を使わなくていいのなら、こちらのほうが行数が少なくて済みそうですね。
Closeメソッドでドキュメントを閉じる
開いているドキュメントを閉じる場合はCloseメソッドを使います。
OpenメソッドはDocumentsコレクションが対象でしたが、CloseメソッドはDocumentオブジェクトが対象になります。
例えば、開いたドキュメントをオブジェクト変数にセットした場合は以下のようなプロシージャになります。
Sub openDoc()
Dim doc As Document
Set doc = Documents.Open("C:\Users\ntaka\Dropbox\desktop\word-document\原稿(1章).docx")
Debug.Print doc.Name
doc.Close
End Sub
Withステートメントを使ったパターンのほうは
Sub openDoc()
With Documents.Open(ThisDocument.Path & "\原稿(1章).docx")
Debug.Print .Name
.Close
End With
End Sub
とすればOKです。
まとめ
Word VBAでドキュメントを開く方法と閉じる方法についてお伝えしました。
- DocumentsコレクションのOpenメソッドでドキュメントファイルを開く
- 開いたドキュメントをオブジェクト変数にセットする
- 開いたドキュメントをWithステートメント内で使用する
- DocumentオブジェクトのPathプロパティでドキュメントのフォルダパスを取得する
- CloseメソッドでDocumentオブジェクトを閉じる
といったテクニックをお伝えしました。
いずれも、Word VBAで複数ドキュメントを一括処理するときには必須となりますのでバッチリ押さえておいてくださいね。
次回は、FileSystemオブジェクトとFor Each文を使ってフォルダ内の全てのドキュメントについて操作をする方法です。
どうぞお楽しみに!