[VBA]フォルダ内に存在するExcelにおいて、使用されている機能をカウントするツール「FeatureTotalizer」を作ってみた

発端

以上が、作成した発端です。

集計対象

以下の項目を集計対象としました。
既存Excelに使われている機能を集計し、メンテナンスするのに必要なスキルを列挙するのが目的なので、今回、構文解析は行っていません。

・ワークシート関数
・VBAステートメント
・VBA関数
・VBAオブジェクト
・VBAプロパティ
・VBAメソッド
・M言語
・VBA中に記載されたM言語

集計結果は何に使えるのか

主な利用目的として考えられるのは、既存Excelファイルに使われている機能の把握であり、ツールはそれを前提としたデザインになっています。

使われている機能を把握する事により、業務における学習範囲を絞る事が可能です。
Excelのワークシート関数は現時点で約500個あり、VBAのステートメント、関数、M言語の関数なども含めると、すべての機能を網羅しようと思ったら1500以上の機能を学習する必要があり、それはナンセンスです。
使用する機能を開拓するのは一部のエンジニアで良くて、他の担当者は既存機能に追随する事を目的に学習を進めることは効率的だと考えます。

ツール紹介

以下、メイン画面です。
ツール名は当初別の名前だったのですが、ぐぐってみたら、同じ名前でAddIn作られている方が居て、かつ、意味合い的にもAggregateじゃないな、と、思ったので、こちらの名前(Feature Totalizer)にしました。
使用方法は下図に記載ありますが、「パス指定」「変数名指定」「集計ボタンクリック」の3ステップで完了します。
検査対象を1つのフォルダにまとめてから集計する事をお勧めします。

画像1

以下、ワークシート関数のマスターです。
関数名と説明は、すべて参考サイトからの引用です。
ここに記載されていない関数名は、オリジナル関数と見做して集計しません。

画像2

以下、VBAのマスターです。
種別には「Solver関数、コレクション、オブジェクト、メソッド、プロパティ、関数、ステートメント」を記載していますが、参考サイトと厳密な1対1対応になっていません。
例えば「ステートメント」は「言語リファレンス>リファレンス>キーワードタスク別キーワード」から取得していますが、「ステートメント」という表現は取られていません。
古い話ですが、MSX BASICのテキストにおいて「関数」「ステートメント」と分けて記載されていましたので、その分類に従いました。

画像3

以下、M言語のマスターです。
関数名および説明は参考サイトに準拠していますが、1セル1関数になるように行を増やしています。
なお、M言語についてはステートメントに相当するキーワードの探索を行わない仕様としています。

画像4

以下、集計結果です。
それぞれファイル名、名称、出現回数(カウント)が分かるように集計しています。VBAのみ、種別も表示するようにしています。
並べ替えは行っていませんので、必要に応じて並べ替えを行うと良いと思います。

画像5

画像6

画像7

集計方法

ざっくり説明すると、「全文字列からキーワード候補の文字列を配列で取り出し、それぞれのマスターに存在する物をカウントする」方法で集計しています。
厳密な構文解析を行っていませんので、想定できていない誤動作は起こりうると考えていますが、当座の目的は果たせると考えています。
集計方法は、それぞれの機能によって微妙に異なります。
ざっくり以下の通りです。

・ワークシート関数
 セルの「Formula」プロパティのうち、1文字目が「=」の文字列から、「(」の直前に記載された文字列をキーワードとして取り出し、マスター有無を確認の上、集計しています。

・VBA
 対象ブックのCodeModuleに含まれる文字列をLinesプロパティで取得、した後、次の操作を行う事でキーワードを取得、マスター有無を確認の上、集計しています。
 ・文字列除去
 ・コメント除去
 ・プロシージャ名除去
 ・行継続文字「& _」除去(replaceで置換)
 ・ラベル除去(([\w|\.]+: )を除去)
 ・複数のスペース「\s」を1個の半角スペースに置換([\s]:[ \t\r\n\v\f]と等価)
 ・左辺値から変数名および「=」除去(([\w|\.]+ = )を除去)
 ・特定文字列除去
  文字列連結文字「&」、半角カッコ「()」、半角中カッコ「{}」、カンマ「,」
 ・複数のスペース「\s」を1個の半角スペースに置換([\s]:[ \t\r\n\v\f]と等価)
 「.」を半角スペースに置換
 ・半角スペースを区切り文字としてsplit
 ・文字列が無くなるまでループ
 ・3個の文字列を半角スペースでつないだ文字がキーワードにあるか確認
 ・2個の文字列を半角スペースでつないだ文字がキーワードにあるか確認
 ・1個の文字列を半角スペースでつないだ文字がキーワードにあるか確認

・M言語
 ブックのQueriesオブジェクト配下にあるFormulaプロパティから文字列を取得し、ワークシート関数と同様の手順で関数名を取り出し、カウントしています。
 なお、VBAにてM言語を編集している可能性も考慮し、コードモジュールから取り出した文字列についても、ダブルクォートを除去して結合した後にワークシート関数と同様の手順で関数名を取り出しています。

ここから先は

23,616字

¥ 100

期間限定 PayPay支払いすると抽選でお得に!

この記事が気に入ったらサポートをしてみませんか?