みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。
エクセルVBAでWord文書の操作をする方法についてお伝えしています。
前回の記事はコチラ。
エクセルVBAでWord文書を開いてページ数や文字数などの色々な情報を取得する方法をお伝えしました。
今回は、このプログラムを応用して、エクセルVBAでフォルダ内のWord文書の各種情報を取得してリスト化するプログラムを作っていきます。
では、行ってみましょう
前回のおさらい
前回作成したプログラムはこちらです。
Sub Word文書の情報を取得する()
Dim wdApp As Word.Application
Set wdApp = CreateObject("Word.Application")
wdApp.Visible = True
Dim wdDoc As Word.Document
Set wdDoc = wdApp.Documents.Open(ThisWorkbook.Path & "\原稿(1章).docx")
With wdDoc
Debug.Print "ページ数:" & .Content.Information(wdNumberOfPagesInDocument)
Debug.Print "段落数:" & .Paragraphs.Count
Debug.Print "文数:" & .Sentences.Count
Debug.Print "単語数:" & .Words.Count
Debug.Print "文字数:" & .Characters.Count
End With
wdApp.Visible = False
Set wdApp = Nothing
End Sub
「原稿(1章).docx」というファイルのページ数や段落数など色々な情報を取得するプログラムでした。
7行目~16行目までの処理を、フォルダ内のWord文書について繰り返すように改良をしていきたいと思います。
今回やりたいこと:フォルダ内のWord文書の情報をリスト化
まず、対象となるWord文書を以下フォルダに用意しています。
現在マクロを記述しているエクセルファイルが「Book1.xlsm」で、情報を取得したいWord文書ファイルが「原稿」というフォルダ内にゴソっと入っているという前提です。
取得した情報について記載するシートは以下の通りです。
2行目にSUM関数を仕込んでいて、合計値を算出できるようにしています。なお、このシートのオブジェクト名は「Sheet1」としています。
フォルダ内のWord文書の情報をリスト化するプログラム
では、実際のプログラムを紹介しましょう、
こちらです。
Sub フォルダ内のWord文書の情報を取得する()
Dim wdApp As Word.Application
Set wdApp = CreateObject("Word.Application")
wdApp.Visible = True
Dim objFso As Object
Set objFso = CreateObject("Scripting.FileSystemObject")
Dim path As String
path = ThisWorkbook.path & "\原稿"
Dim objFolder As Object
Set objFolder = objFso.GetFolder(path)
Dim i As Long
i = 3
Dim f As Object
For Each f In objFolder.Files
With wdApp.Documents.Open(path & "\" & f.Name)
Sheet1.Range(Sheet1.Cells(i, 1), Sheet1.Cells(i, 6)).Value = Array( _
f.Name, _
.Content.Information(wdNumberOfPagesInDocument), _
.Paragraphs.Count, _
.Sentences.Count, _
.Words.Count, _
.Characters.Count)
i = i + 1
.Close
End With
Next f
wdApp.Visible = False
Set wdApp = Nothing
End Sub
これを実行すると、以下のようにフォルダ内に存在するすべてのWord文書についての情報をリスト化することができます。
フォルダ内のファイル全てについて処理をする
まず、フォルダ内のファイルについて繰り返し処理をするには、FileSystemオブジェクトとFor Each~Next文を使うのが便利です。
プログラムでいうと
- 7行目~8行目:objFsoとしてFileSystemオブジェクトの生成
- 10行目~11行目:対象となるフォルダのパスを変数pathに取得
- 13行目~14行目:対象となるフォルダをフォルダオブジェクトobjFolderとして取得
- 20行目~32行目:For Each文でobjFolder内のファイル全てについて繰り返し
という部分です。
それぞれの命令について詳細は以下の記事をご覧ください。
WithステートメントとOpenメソッドの組み合わせ
21行目で、現在繰り返しの対象となっているWord文書を開き、それをWithステートメントの対象としてます。
WithステートメントとOpenメソッドの組み合わせの記述です。
’処理
End With
これにより、Withブロック内では開いたWord文書について、オブジェクト名を省略して記述できるようになります。
便利です。
Word文書の情報を取得
24行目~28行目は前回紹介した部分で、Word文書の各種情報を取得しています。
23行目は、見てわかりますが、Nameプロパティでファイル名を取得している部分です。上から順に、ページ数、段落数、文数、単語数、文字数を取得しています。
まとめ
以上、エクセルVBAでフォルダ内のWord文書のページ数、文字数などをリスト化するプログラムを紹介しました。
Word文書がたくさんあったとしても、いちいち開いて確認する必要はありませんね。
どうぞご活用ください。
さて、次回はまた別の情報の取得の仕方について、紹介をしていきます。
どうぞお楽しみに!