【Word VBA】文書に含まれる単語を調べるマクロ(Collectionオブジェクト)

文書中から単語を取り出す方法をご紹介します。

おなじみのインストラクターのネタ帳 の管理人でMicrosoft Excel MVPの伊藤潔人さんが先日の記事で「文書に含まれる単語を調べるマクロ 」を書かれていました。

Dictionaryオブジェクトを用いて重複する単語を削除しているのですね。

非常に興味深いですね。

私は、「頻度のヒント 」というアドインにて、もっと泥臭く重複する単語を除外する方法を使っていたので、シンプルな方法に驚きました。

こういう発見があるからマクロは楽しいですね。

これに触発されて、私も方法を調べていたところ、Collection オブジェクトにたどり着きました。

なぜ、DictionaryオブジェクトではなくてCollection オブジェクトなのかというのは、別の記事「文書に含まれる単語を調べるマクロ_並べ替え付き(Collectionオブジェクト)」で書いていきたいと思いますが、ひとまず、Collection オブジェクトを用いて同じことを実行してみます。

マクロの解説

仕組みは、伊藤さんの文書に含まれる単語を調べるマクロ と同じです。

myDicというCollection オブジェクトにすでに登録済みの文字列(Key)を登録使用とするとエラーになるので、ここで重複する文字列を除外しています。

詳しくは、伊藤さんの記事をご覧ください。また、私のExcel VBAの師匠の田中亨先生 の記事「重複しないリストを作る 」にもリンクされているので、合わせてご覧いただくと非常によくわかると思います。

Collectionオブジェクトと伊藤さんの記事のDictionaryオブジェクトとの違いは、keyを呼び出しだと思います。

Dictionaryオブジェクトでは、keyを呼び出せます。プログラムの最後に書かれている新規文書への書出しのときに、keyに登録されている単語をはき出していますね。

Collectionオブジェクトでは、keyを呼び出せません。プログラムの最後に書かれている新規文書への書出しのときに、Itemに登録されている単語をはき出しています。

Collectionオブジェクトでは、引数のkeyで重複を判定しますが、実際にCollectionのメンバーとして登録されるのは、引数Itemに入れられたデータです。

少し記載が異なりますので、Dictionaryオブジェクトと比較してみてください。

もう一つの違い

あと、大きな違いがあります。

Dictionaryオブジェクトのkeyの重複判定では、大文字・小文字・全角・半角の区別をします。

しかし、Collectionオブジェクトのkeyの重複判定では、その区別をしません。

単に単語を書き出すだけであれば、どちらでも問題ありませんが、数を数えるときには、大文字と小文字の区別はなくてもいいと思います。

ただ、半角・全角の区別はして欲しいなあ。。。

中途半端な終わり方ですが、ここまでとしておきます。

マクロ


Sub 文書に含まれる単語を書き出すマクロ()

 '重複の判定にて、大文字・小文字の区別をしない
 '重複の判定にて、全角・半角の区別をしない

 Dim myDic As New Collection
 Dim wrd As Range
 Dim myItem As Variant

 On Error Resume Next
 For Each wrd In ActiveDocument.Words
  myDic.Add Item:=wrd.text, key:=CStr(wrd.text)
 Next wrd
 On Error GoTo 0

 '書き出し
 With Application.Documents.Add
  For Each myItem In myDic
   .Range.InsertAfter myItem & vbCr
  Next myItem
 End With

End Sub

参考にした記事

文書に含まれる単語を調べるマクロ  (伊藤潔人さんの記事)

重複しないリストを作る  (田中亨先生の記事)

トップへ戻る