VBAでコードを解析するツールが知りたい・・・
できれば、解析後の結果もわかりやすく見たい・・・
VBAでコードを解析しようとしても、公式のツールはないですよね。ただ、VBAでコードを解析したいと思うタイミングは結構あります。そのため、VBAでコード解析できるツールを知りたい・・・と思う方は結構いるのではないでしょうか。
こんにちは!フリーランスエンジニア兼テックライターのワキザカです。
この記事では、VBAでコード解析するツールをタイプ別に紹介します!
ただ紹介するだけでなく、状況に応じて使い分けられるよう紹介しているので、ぜひ見てみてくださいね!
この記事はこんな人のために書きました。
- VBAのコード解析ツールを知りたい人
- VBAでコードを解析する方法を知りたい人
VBAでコード解析ツールを選ぶときの考え方
はじめに、VBAでコード解析ツールを選ぶときの考え方について解説します。
コード解析と一口に言っても、解析方法はさまざまですよね。そのため、用途に応じてコード解析ツールを選ぶことが重要です。
VBAでコード解析を行うときは、次のような用途がありますよね。
■VBAでコード解析するときの理由
- 開発を進めるために、前のバージョンとの差分が知りたい
- 既に出来上がったプロジェクトのコードを分析して読み進めたい
- ExcelからAccessに移行を考えており、工数見積もりのため規模感を知りたい
利用したいシーンによって、必要なツールは全く違います。また、実現したいことがツールとして存在しない場合もあるので、ツール以外の方法を使ったり、別途VBAでツールを作ったほうがいいときもあります。
用途に応じて、それぞれ詳しく解説しますね。
【タイプ別】VBAのコード解析ツールの使い方
次に、3つのタイプに分けてコード解析ツールの使い方をご紹介します。
開発をすすめながら解析したいとき
まずは、開発を進めながら解析したいときです。
大規模なシステムになってくると、1人でコードを書くケースは少ないですよね。誰かが別の機能を作っているというケースの方が多いです。そのため、どんなコードがどこに書かれているか調べる方法を知っておくと便利です。
その方法が、バージョン管理ツールを使う方法です。バージョン管理ツールではGitが有名ですが、Gitと連携してVBAのコードを差分で見ることができる「vbac」があります。連携すると、次のように差分を見れるようになります。
導入方法や連携方法は以下がわかりやすいので、おすすめです。
引用:vbacでエクセルVBAのソースコードをGitバージョン管理する方法 https://tonari-it.com/vba-vbac-git/
ちなみに、Gitって何?という方は、以下を見てみてくださいね!
出来上がったコードを読むために解析したいとき
次は、「出来上がったコードを読むために解析したいとき」についてです。
結論から言うと、見やすい解析ができるツールはありません。そのため、コードを読むときのテクニックを覚えておくことがおすすめです。
■コードを読む時のテクニック
- テクニック1:右クリック + ショートカットキーで定義に移動・戻るを高速化
- テクニック2:ステップ実行を覚えてデバッグを高速化
- テクニック3:イミディエイトウィンドウを使いこなして値の確認を高速化
VBAのコードウィンドウで右クリック + Dで定義に移動、右クリック + Nで定義に戻ることができます。サブシージャや関数が多いコードの場合は、このショートカットキーを覚えるだけでも高速化することができます。
また、ステップイン、ステップオーバーなどステップ実行を徹底的に覚えたり、イミディエイトウィンドウで変数の値を確認できるようになると、コードを速く読めるようになります。ちょっとした事の積み重ねで速くできるので、とてもおすすめです。
デバッグ方法、イミディエイトウィンドウの使い方については以下で詳しく解説しています。自信がない方は、以下を見てみることがおすすめです!
全体の規模感がわかるように情報をまとめたいとき
次が、「全体の規模感がわかるように情報をまとめたいとき」についてです。
こちらもツールとして良いものはないですが、地道に調べるととても時間がかかってしまいます。そんなときは、VBAでモジュール名、プロシージャ名、モジュールごとの総行数、全体の行数などを出力するコードを自作することがおすすめです!
言葉だけだとわかりづらいので、サンプルコードを用意しました。
実行前:
サンプルコード:
Sub コード分析() '変数宣言 Dim intWriteRow As Long '書き込む行番号 Dim intMdlTotalNum As Long 'モジュール総数 Dim intProTotalNum As Long 'プロシージャ総数 Dim intCodeTotalNum As Long 'コード総数 Dim strMdlName As String 'モジュール名 Dim strProName As String 'プロシージャ名 Dim intCodeNum As Long 'コード数 Dim intRowCount As Long 'データの行数カウント用 '①モジュール数を取得 Dim intMdlNum As Integer 'モジュール数 intMdlTotalNum = ActiveWorkbook.VBProject.VBComponents.Count '②モジュール数分処理をループ Dim i As Long, j As Long intProTotalNum = 0 intCodeTotalNum = 0 intRowCount = 1 intWriteRow = 9 For i = 1 To intMdlTotalNum With ActiveWorkbook.VBProject.VBComponents(i) '③モジュール名を設定 strMdlName = .Name With .CodeModule 'プロシージャ数分処理をループ For j = 1 To .CountOfLines If strProName <> .ProcOfLine(j, 0) Then '④プロシージャ名・コード数をセット strProName = .ProcOfLine(j, 0) intCodeNum = .ProcCountLines(strProName, 0) '⑤No、モジュール名、プロシージャ名、コード数をセルに書き込む With Worksheets("分析結果一覧") .Cells(intWriteRow, 2).Value = intRowCount 'No .Cells(intWriteRow, 3).Value = strMdlName 'モジュール名 .Cells(intWriteRow, 4).Value = strProName 'プロシージャ名 .Cells(intWriteRow, 5).Value = intCodeNum 'コード数 End With 'サマリーデータ用のプロシージャ総数、コード総数を更新 intProTotalNum = intProTotalNum + 1 intCodeTotalNum = intCodeTotalNum + intCodeNum '次に書き込む行数を更新 intWriteRow = intWriteRow + 1 'Noを更新 intRowCount = intRowCount + 1 End If Next j 'プロシージャ名を空に戻す strProName = "" End With End With Next i '⑥サマリーデータを登録 Worksheets("分析結果一覧").Cells(3, 3).Value = intMdlTotalNum Worksheets("分析結果一覧").Cells(4, 3).Value = intProTotalNum Worksheets("分析結果一覧").Cells(5, 3).Value = intCodeTotalNum End Sub
実行結果:
コードが長いので、1つずつ解説しますね。
まず、以下のコードでブックのプロシージャ数を取得しています。
Dim intMdlNum As Integer 'モジュール数 intMdlTotalNum = ActiveWorkbook.VBProject.VBComponents.Count
このあと、モジュール数分処理をループしています。そのループ処理の中で、コードの行数文次のようにループ処理をしています。
For j = 1 To .CountOfLines Next i
さらに、このループ処理の中でプロシージャ名があった場合は取得し、その名前を使ってコード数を取得しています。
If strProName <> .ProcOfLine(j, 0) Then '④プロシージャ名・コード数をセット strProName = .ProcOfLine(j, 0) 'プロシージャ名 intCodeNum = .ProcCountLines(strProName, 0) 'プロシージャのコード数 End If
取得した値を使って、次のように詳細データをセルに書き込んでいます。
'No、モジュール名、プロシージャ名、コード数をセルに書き込む With Worksheets("分析結果一覧") .Cells(intWriteRow, 2).Value = intRowCount 'No .Cells(intWriteRow, 3).Value = strMdlName 'モジュール名 .Cells(intWriteRow, 4).Value = strProName 'プロシージャ名 .Cells(intWriteRow, 5).Value = intCodeNum 'コード数 End With
また、最後にサマリーデータを計算するためにプロシージャ総数、コード総数をループ処理の中で見つかった数分足していく処理を書いています。
'サマリーデータ用のプロシージャ総数、コード総数を更新 intProTotalNum = intProTotalNum + 1 intCodeTotalNum = intCodeTotalNum + intCodeNum
最後に、ループ処理を抜けた後で以下のようにサマリーデータを書き込む処理を書いてます。
'サマリーデータを登録 Worksheets("分析結果一覧").Cells(3, 3).Value = intMdlTotalNum Worksheets("分析結果一覧").Cells(4, 3).Value = intProTotalNum Worksheets("分析結果一覧").Cells(5, 3).Value = intCodeTotalNum
ExcelからAccessにコードを移行するようなケースだと、VBAの規模感を知りたいときに便利ですよね。サマリーデータ、詳細データがあれば見積りもしやすくなるのではないでしょうか。
サンプルコードは、実行前・後の画像のような「分析結果一覧」シートを作成すれば実行できるので、ぜひ動かしてみてくださいね!
VBAでコード解析するときに大事なこと
ここまで、用途に応じたコード解析方法についてご紹介しました。
重要なのは、「コード解析ツールを探すこと」ではなく、「解析して何を実現したいか」です。
ツールを使えば便利に解析できることもありますが、無い時は諦めるのではなく、
- 作業スピードをあげられないか?
- ツールを自作して実現できないか?
と考え、思考を巡らしていくことが重要です。
ツールを一度作ることで今後作業が簡略化されるのであれば作るべきですし、滅多にない作業であれば、いっそのこと手作業でそのまま終わらせてしまうことも一つの手です。これがいい!と固定概念に捕らわれずに、本質を見極めることが重要です。
まとめ
今回は、VBAでコード解析できるツール・用途別の解析方法について解説しました。
最後にお伝えしたように「ツールを探すこと」を目的にするのではなく、「最適な方法を探すこと」が重要です。
ぜひ、用途に応じて解析方法を身に着けてくださいね!