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入門!】Gitって何?から基本的な使い方までを簡単解説
更新日 : 2019年10月14日

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

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

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


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

  • テクニック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

SEからWebエンジニアへ転職した理由

侍エンジニア塾卒業生の小池さんは、以前は社内SEとして約5年ほど勤務していました。しかし業務内容は社内のヘルプデスク対応など、プログラムを書く仕事は全くなかったそうです。

SEながらプログラムを書けない現状に「将来仕事がなくなるんじゃないか」と不安を感じ、プログラミング学習を決意。

弊社スクールで学習し、無事ベンチャー企業のプログラマーとして転職に成功しました。そんな小池さんの学習法や転職体験談を伺いましたので、是非ご覧ください。

「プログラミングができないSEは仕事がなくなる」不安を感じたSEが未経験から転職成功するまで
更新日 : 2019年10月7日

書いた人

Sanshiro Wakizaka

Sanshiro Wakizaka

フリーランスエンジニア兼ライターのワキザカ サンシロウです。
ExcelVBAの自動化ツール開発、WEB開発をメインにエンジニア業務をこなしつつ、サムライエンジニアにてライター業務をしております。

プログラミングをこれからやってみたい方に向けて、ためになる記事を全力で書いていきますので宜しくお願い致します!

おすすめコンテンツ

あなたにぴったりなプログラミング学習プランを無料で診断!

プログラミング学習の効率を劇的に上げる学習メソッドを解説