ExcelファイルのVBA検索ツールを作ったよ!!(解説編)

ExcelファイルのVBA検索ツールを作ってみました。前回の記事はこちらです。
hirocom777.hatenadiary.org

今回は、前回紹介したツールの詳細(というほどでもない)を解説したいと思います。

小さなツールを作って少しずつ改良をしていくとすごく勉強になるよ !!

プログラミングの勉強方法は色々ありますが、これは僕がよくやる方法です。 小さなツールを作って少しずつ改善していく・・・効果は抜群だと感じています。今回ご紹介したツールも色々な学びがありましたので、ここで共有したいと思います。興味のある方は、以下からダウンロードして使ってみてください。

VBA検索ツール131.zip - Google ドライブ

他のExcelファイルのVBAにアクセスできる

 前回でもお話ししましたが、このツールは以下のサイトを参考にしました。
officetanaka.net
 VBAってこんなことも出来るんですね。この記事読んだのでツール作ったも同然です。普段作るツールではこの手法はあまり使わないのですが、この手法は知っておくと便利。逆にこの手法を理解するためにツールを作ったとも言えます。手法を理解するためにテーマを選定してツールを作るのはアリだと思います。

ファイルシステムオブジェクト、フォルダオブジェクト

 正直言っちゃいますと、このツールで初めてFSO(ファイルシステムオブジェクト、フォルダオブジェクト)を使いました。

  Dim objFso As Object
  Set objFso = CreateObject("Scripting.FilesystemObject")

とか

  Dim objFolder As Object
  Set objFolder = objFso.GetFolder(TopSheet.txtFolder.Text)

の様に宣言が面倒なんですよね。でも、今回の様にファイルを取り扱うことが中心となるツールでは強力な威力を発揮しました。一度使ってみるとハードルはぐんと下がります。今後は色々なところで応用できそうです。

検索機能(パターンマッチ)

 検索機能についてはこだわりました。このツールのキーとも言えますからね。このツールでは検索機能を実現するためにLike演算子を使っています。普通、指定文字列の検索にはInstr関数を使ったりするのですが、ここは意図的にLike演算子を使いました。実際の検索でもパターンマッチの機能が使えるようにするためです。このツールでは検索文字列の前後に"*"をつけることでLike演算子を使った検索を実現しています。以下のようになりますね。

検索対象 like "*検索文字列*"

この形にすると、検索文字列の中にパターンマッチの表記方法を適用できます。"[1-5]"(数字の1~5にマッチする)とか、"A?C"(ABCとかA3Cとかにマッチする)とか検索方法に幅を持たせることが出来るんです。VBAの機能をツールの機能として引き出しています。面白いでしょ!!

検索機能(全角半角の区別、大文字小文字の区別)

 検索機能もう一つのこだわりはこの機能です。ワープロやエディタの検索機能によく付いている設定項目です。どうやって実現しているんでしょうか?
実際のところはツールの中を確認できないので何とも言えないのですが、このツールではVBAのStrConv関数で実現しています。

StrConv関数の使い方は以下が詳しいかと・・・
officetanaka.net

全角半角を区別しない場合には、検索文字列、検索対象文字列とも半角文字列に変換しています。
(引数 conversionはvbNarrow)
大文字小文字を区別しない場合には、検索文字列、検索対象文字列とも小文字の文字列に変換しています。
(引数 conversionはvbLowerCase)
両方とも区別しない場合には、検索文字列、検索対象文字列とも半角小文字に変換ですね。
(引数 conversionはvbLowerCase+vbNarrow)

前出のパターンマッチ機能とも併せて検索機能を実現しています。このツールでいろいろな検索パターンを試してみると面白いと思います。

再帰(フォルダの検索)

 再帰って、プロシージャの中で自分自身を呼び出しちゃう奴。具体時に何に使うのかって説明難しいけれど、こういう時に使うんですね。指定されたフォルダA内を検索するプロシージャの中で、フォルダA内にフォルダBを発見したら自分自身を呼び出してフォルダB内も検索するって感じ。一回使いどころを覚えると、理解が深まります。

今回のツールはプロテクトなど掛けていません。ソースリストも読めますので興味のある方は改造して機能アップさせちゃったりして遊んでください(笑)

最後までお付き合いいただき有難うございました。