- ベストアンサー
エクセルVBAで特定文字列の個数を高速に調べたい
文字列の入っている変数内で特定の文字列(今回はvbCrLf)が何個発生しているかを、高速に調べたいのですが、どのような方法があるでしょうか? 現在以下のことをやっています。 数千件のテキストファイルから特定文字列を検索しています。 検索を高速化するために、テキストファイルをバイナリーモードで1つの変数に読み込み、instr関数で検索しています。 見つかった場合、その位置から前にあるvbCrLfをInStrRev関数で、後ろにあるvbCrLfをinstr関数で位置を調べ、元の変数からmid関数で該当ラインを取り出しています。 検索はこれで可能ですが、特定文字列を調べたinstr関数の戻り値がテキストファイルの先頭からの位置(何桁目)なので、検索した文字列が何行目にあるか分かりません。 変数の検索文字が見つかった位置までの部分でvbCrLfが何個発生しているかが分かれば行数が判定できます。 vbCrLfを調べるinstr関数を何回も繰り返せば行数の判定は可能ですが、もっと高速に(一つの関数・命令で)調べることはできないでしょうか? また他に行数を特定する良い方法があったら教えてください。 よろしくお願い申し上げます。
- みんなの回答 (7)
- 専門家の回答
お礼
回答ありがとうございました。 RegExp、ヒントになりました。 > 改行コード以外の文字をカウントする場合は、 > RegExpクラスのmatchオブジェクトを使うのが > よいと思います。 とのことですが、改行コードをカウントできました。 RegExpオブジェクトのPatternプロパティにvbCrLfを指定し Executeメソッドを実行し、MatchesコレクションのCount プロパティでvbCrLfの個数が分かりました。 FileSystemObjectのTextStreamはテキストファイルの全行数を調べる ように思えますが、いかがでしょうか。 知りたいのは全行数ではなく、該当文字列のあった行です。 いずれにしても、先のMatchesコレクションで分かったvbCrLfの個数で ラインが割り出せますので問題ありません。