みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。
エクセルVBAでWord文書を操作する方法についてシリーズでお伝えしております。
前回はこちらの記事。
エクセルVBAでWordアプリケーションを起動する準備とその方法についてお伝えしました。
今回は、起動したWordアプリケーション上にWord文書を開いて、ページ数や文字数などのいろいろな情報を取得してみたいと思います。
では、行ってみましょう!
前回のおさらい
前回作成したプログラムはこちら。
Sub Wordを立ち上げる()
Dim wdApp As Word.Application
Set wdApp = CreateObject("Word.Application")
wdApp.Visible = True
MsgBox "Wordが立ち上がりました"
wdApp.Visible = False
Set wdApp = Nothing
End Sub
Wordアプリケーションのオブジェクトを生成して、表示して、閉じて、破棄するというだけのプログラムです。
これだけでは何の意味もありませんが、このプログラムをベースとして、7行目のMsgBox関数の代わりに、いろいろな処理を入れていけばよろしいということになります。
エクセルVBAでWord文書を開く
では、Word文書を開いていきましょう。
Word文書を開くには、DocumentsコレクションのOpenメソッドを使います。
それで、開いたWord文書を変数にセットして扱いたいので、以下のようにSetステートメントでセットします。
ファイル名はフルパスで指定する必要があります。
で、Documentsコレクションはどうやって取得するかというと、Word.ApplicationオブジェクトのDocumentsプロパティで取得できます。
Word文書を開くプログラム
例えば、現在のエクセルマクロを記述しているファイルと同階層の、「原稿(1章).docx」という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")
Stop
wdApp.Visible = False
Set wdApp = Nothing
End Sub
7~10行目が今回追加した部分ですね。
実行すると、Stopステートメントで中断しているところで、以下のようにWord文書が開きます。
Word文書の情報を取得する
では、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
実行すると、以下のように各情報を取得することができます。
以下、解説をしていきますね。
Word文書のページ数を取得する
まず、ページ数ですが、これは実はちょっとわかりづらいです。
Word文書のページ数を取得するには、WordのRangeオブジェクト(またはSelectionオブジェクト)のInformationプロパティという、指定した範囲の情報を取得するプロパティを使います。
Typeに指定する定数で色々な情報を取得できるのですが、今回は文書のページ数なので「wdNumberOfPagesInDocument」を指定すればOKです。
総ページ数は、RangeオブジェクトよりもDocumentオブジェクトから取得できるのが自然かなぁと思うのですが、そうはなっていないみたいですね。
Word文書の段落数、文数、単語数、文字数を調べる
続いて、Word文書の段落数、文数、単語数、文字数を調べます。
Wordでは、これらの要素は全てオブジェクトとして存在していまして、Documentオブジェクトから、それぞれ対応したコレクションを取得するプロパティがあります。
これらのコレクションを取得して、その要素数をCountプロパティでカウントすればOKということになりますね。
ちなみに、日本語の文書の場合、単語数はあまり正確ではないようですので、参考としてどうぞ。
まとめ
以上、エクセルVBAでWord文書を開いて、ページ数、段落数、文数、単語数、文字数を調べる方法をお伝えしました。
今回は一つのWord文書だけでしたが、大量のWord文書について繰り返しを回せば一気に「文書リスト」ができますよね。
次回、その文書リストを作成していきますよ。
どうぞお楽しみに!
コメント
ある書籍の翻訳を行っているのですが、索引を作成するために、このサイトの情報が非常に役に立ちました。自分のサイトでも紹介させていただきます。
影本さま
コメントありがとうございます!
とてもうれしいです。
今後とも、どうぞよろしくお願いいたします。
私の環境だけかもしれませんが「Word文書の情報を取得する」を保存後に使用すると「実行エラー91」が発生しました。
コード8行目
「Set wdDoc = wdApp.Documents.Open(ThisWorkbook.Path & “F:/個人/黒姫の魔道書/黒姫の魔導書5.docx”)」
の「ThisWorkbook.Path &」を削除と保存後も使用できるのですが・・・
私が選択したファイルが影響してるだけなのかな?
後、コード12行目の「段落数の取得」を変数に入れて使いたいたく変数宣言をしてそれに入れたりしたのですがうまくいきません。よければ教えてもらえないでしょうか?
スパイダーマッ!!さん
コメントありがとうございます!
見た感じ、対象のWordドキュメントファイルのパスはFドライブ直下なので、おっしゃる通り「ThisWorkbook.Path &」は不要ですね。
「ThisWorkbook.Path &」をつける場合は、実行するマクロを仕込んでいるエクセルファイルと同じフォルダに、対象のドキュメントが含まれているときに使うという感じです。