文書中から単語を取り出す方法をご紹介します。
おなじみのインストラクターのネタ帳 の管理人で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
参考にした記事
文書に含まれる単語を調べるマクロ (伊藤潔人さんの記事)
重複しないリストを作る (田中亨先生の記事)