VBAでコード解析するツールとは?タイプ別にツールを紹介!


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って何?という方は、以下を見てみてくださいね!

Gitって何?入門者が最低限知っておきたい用語や使い方を徹底紹介
更新日 : 2020年7月2日

出来上がったコードを読むために解析したいとき

次は、「出来上がったコードを読むために解析したいとき」についてです。

結論から言うと、見やすい解析ができるツールはありません。そのため、コードを読むときのテクニックを覚えておくことがおすすめです。


■コードを読む時のテクニック

  • テクニック1:右クリック + ショートカットキーで定義に移動・戻るを高速化
  • テクニック2:ステップ実行を覚えてデバッグを高速化
  • テクニック3:イミディエイトウィンドウを使いこなして値の確認を高速化

VBAのコードウィンドウで右クリック + Dで定義に移動、右クリック + Nで定義に戻ることができます。サブシージャや関数が多いコードの場合は、このショートカットキーを覚えるだけでも高速化することができます。

また、ステップイン、ステップオーバーなどステップ実行を徹底的に覚えたり、イミディエイトウィンドウで変数の値を確認できるようになると、コードを速く読めるようになります。ちょっとした事の積み重ねで速くできるので、とてもおすすめです。

デバッグ方法、イミディエイトウィンドウの使い方については以下で詳しく解説しています。自信がない方は、以下を見てみることがおすすめです!

【ExcelVBA入門】VBAでデバッグするための方法とは?
更新日 : 2018年12月5日
【ExcelVBA入門】デバッグに使うイミディエイトウィンドウとは?
更新日 : 2019年4月15日

全体の規模感がわかるように情報をまとめたいとき

次が、「全体の規模感がわかるように情報をまとめたいとき」についてです。

こちらもツールとして良いものはないですが、地道に調べるととても時間がかかってしまいます。そんなときは、VBAでモジュール名、プロシージャ名、モジュールごとの総行数、全体の行数などを出力するコードを自作することがおすすめです!

言葉だけだとわかりづらいので、サンプルコードを用意しました。

実行前:

実行前のExcel

サンプルコード:

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

実行結果:

実行後のExcel

コードが長いので、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でコード解析できるツール・用途別の解析方法について解説しました。

最後にお伝えしたように「ツールを探すこと」を目的にするのではなく、「最適な方法を探すこと」が重要です。

ぜひ、用途に応じて解析方法を身に着けてくださいね!

LINEで送る
Pocket

ITエンジニアへ転職したい方におすすめ

自分を評価してくれる企業に転職して年収を上げたい! 自分のスキルにあった独自案件を知りたい!
エンジニアは今もっとも注目されている職業の1つ。エンジニアになって年収を増やしたい方や、あなたのスキルに見合った企業へ転職したいエンジニアの方も多いですよね。

しかし、大手の転職媒体は扱う求人数が多くても、誰もが登録しているので競争率もかなり高くなっています。そのため、あなたの条件に見合った企業を見つけても転職するためには、相応の努力とスキルが必要となります。

こういった媒体では、未経験からエンジニアを目指す方やエンジニア歴2〜3年で転職を考えている方にとって、最適な転職環境とはいえません。

そこでオススメしたいのが、未経験者や若手エンジニア向けの独自案件を多く掲載している「侍ワークス」です。

侍ワークスは、独自案件を多く掲載しているだけでなく、

・応募から就業まで一貫したサポート

・就業後もアフターフォロー

といった経験の浅い方や初めてエンジニアを目指す方にも安心のフォロー体制が整っています。もちろん登録は完全無料!しかも案件を見るだけなら登録も不要です。

まずは、お気軽にどんな求人があるか見てみてください。あなたにピッタリの企業がきっと見つかりますよ! 侍ワークスの求人情報を見る

書いた人

Sanshiro Wakizaka

Sanshiro Wakizaka

新卒入社したメーカー系のIT企業で、システムエンジニアとして約5年勤務。
Webアプリ、業務アプリ開発において、要件定義、設計、インフラ、製造、テスト、運用保守など、様々な経験あり。
また、侍ブログ編集部として、これまでに200記事以上の記事を執筆。
現在はフリーランスエンジニア兼テックライターとして活動中。