ExcelマクロVBAサンプル集
VBAコードの全プロシージャー・プロパィ一覧を取得

ExcelマクロVBAの実用サンプル、エクセルVBA集と解説
最終更新日:2019-10-16

VBAコードの全プロシージャー・プロパィ一覧を取得


VBAの開発規模がある程度大きくなってくると、VBAソース管理の必要性を感じることもあると思います。
モジュールの数も増えてきて、プロシージャー・プロパティが膨大になっきます。
以下は、指定ブックの全モジュールの全プロシージャー・プロパティを一覧にするVBAサンプルです。


SubまたはFunctionプロシージャ、Property Get,Let,Setの種別や、プロシージャ等の直前コメントも取得するようにしています。

セキュリティについて

VBAでVBAプロジェクトを扱う為には、以下の設定が必要になります。

「ファイル」→「オプション」→「セキュリティ センター」→「セキュリティ センターの設定」→「マクロの設定」

VBA マクロ VBProject VBComponents

この「VBA プロジェクト オブジェクト モデルへのアクセスを信頼する」にチェックを付けてください。
ただし、セキュリティを弱くするので、
このようなVBAを実行するとき以外は、チェックを外しておくことをお勧めします。
このチェックを付けずに今回のVBAを実行すると以下のエラーとなります。

VBA マクロ VBProject VBComponents

VBAコードの全プロシージャー・プロパィ一覧を取得するVBAコード

標準モジュール


'Dictionaryにプロシージャー・プロパティ情報を格納
Public Sub getCodeModule(ByRef dicProcInfo As Dictionary, _
             ByVal wb As Workbook, _
             ByVal sMod As String)
  Dim cProcInfo As clsProcInfo
  Dim sProcName As String
  Dim sProcKey As String
  Dim iProcKind As Long
  Dim i As Long
  Dim VVC As Object
  Set VVC = wb.VBProject.VBComponents(sMod).CodeModule
  i = 1
  Do While i <= VVC.CountOfLines
    sProcName = VVC.ProcOfLine(i, iProcKind)
    sProcKey = sMod & "." & sProcName
    If sProcName <> "" Then
      If isProcLine(VVC.Lines(i, 1), sProcName) Then
        If Not dicProcInfo.Exists(sProcKey) Then
          Set cProcInfo = New clsProcInfo
          cProcInfo.ModName = sMod
          cProcInfo.ProcName = sProcName
          cProcInfo.ProcKind = iProcKind
          cProcInfo.LineNo = i
          cProcInfo.Comment = getProcComment(i, VVC)
          cProcInfo.Source = getProcSource(i, VVC)
          dicProcInfo.Add sProcKey, cProcInfo
        End If
      End If
    End If
    i = i + 1
  Loop
End Sub

'プロシージャー・プロパティ定義行かの判定
Private Function isProcLine(ByVal strLine As String, _
              ByVal ProcName As String) As Boolean
  strLine = " " & Trim(strLine)
  Select Case True
    Case Left(strLine, 1) = " '"
      isProcLine = False
    Case strLine Like "* Sub " & ProcName & "(*"
      isProcLine = True
    Case strLine Like "* Sub " & ProcName & " _"
      isProcLine = True
    Case strLine Like "* Function " & ProcName & "(*"
      isProcLine = True
    Case strLine Like "* Function " & ProcName & " _"
      isProcLine = True
    Case strLine Like "* Property * " & ProcName & "(*"
      isProcLine = True
    Case strLine Like "* Property * " & ProcName & " _"
      isProcLine = True
    Case Else
      isProcLine = False
  End Select
End Function

'継続行( _)全てを連結した文字列で返す
Private Function getProcSource(ByRef i As Long, _
                ByVal aCodeModule As Object) As String
  getProcSource = ""
  Dim sTemp As String
  Do
    sTemp = Trim(aCodeModule.Lines(i, 1))
    If Right(aCodeModule.Lines(i, 1), 2) = " _" Then
      sTemp = Left(sTemp, Len(sTemp) - 1)
    End If
    getProcSource = getProcSource & sTemp
    If Right(aCodeModule.Lines(i, 1), 2) <> " _" Then Exit Do
    i = i + 1
  Loop
End Function

'プロシージャーの直前のコメントを取得
Private Function getProcComment(ByVal i As Long, _
                ByVal aCodeModule As Object) As String
  getProcComment = ""
  i = i - 1
  Do While Left(aCodeModule.Lines(i, 1), 1) = "'"
    If getProcComment <> "" Then getProcComment = vbLf & getProcComment
    getProcComment = aCodeModule.Lines(i, 1) & getProcComment
    i = i - 1
  Loop
End Function

クラスモジュール:clsProcInfo
Option Explicit

Public ModName As String
Public ProcName As String
Public ProcKind As String
Public LineNo As Long
Public Source As String
Public Comment As String

Public Property Get ProcKindName() As String
  Select Case ProcKind
    Case 0
      ProcKindName = "Sub Function"
    Case 1
      ProcKindName = "Property Let"
    Case 2
      ProcKindName = "Property Set"
    Case 3
      ProcKindName = "Property Get"
  End Select
End Property

Public Property Get Scope() As String
  Select Case True
    Case Trim(Source) Like "Private *"
      Scope = "Private"
    Case Trim(Source) Like "Friend *"
      Scope = "Friend"
    Case Trim(Source) Like "Static *"
      Scope = "Static"
    Case Else
      Scope = "Public"
  End Select
End Property

参照設定
「ツール」→「参照設定」で、
Microsoft Scripting Runtime
これを参照設定して下さい。

参照設定しない場合は、
dicProcInfo As Object
としてください。

概要
プロシージャー・プロパティの一覧はDictionaryに入れています。

「getCodeModule」がメインの関数で、他はその中で使用している関数になります。
「プロシージャー・プロパティ定義行かの判定」が面倒な記述になっていますが、
以下のような紛れをなるべく除くための記述になります。
・プロシージャー名直後の改行
・コメント内でのプロシージャー名
・プロシージャーのCall
・プロパテイへの値設定・取得
いろいろなパターンがあり、今回のコードでも漏れがあるかもしれません。
必要に応じて、適宜修正して使用してください。

コメントは、
プロシージャー・プロパティ直前に連続記述されているもののみ対象としています。

Dictionaryにしているので、
シートに出力するだけではなく、その他の用途でも使いやすいと思います。
Dictionaryのキーは、「モジュール名.プロシージャー名」にしていますので、簡単に検索できるはずです。

クラス使用の理由
ユーザー定義型(Type)はDictionaryやCollectionに入れられません。
そこで、ユーザー定義型の代わりにクラスを使用することで独自データ型を定義しています。
クラスにすることで、プロパティでさらに情報の操作が可能となり融通が効くようになります。

使用する場合のVBAサンプル

シートに全プロシージャー・プロパィ一覧を出力します。
どこでも良いですが、基本としては標準モジュールで使用することを想定しています。



Private Sub sample()
  Dim dicProcInfo As New Dictionary
  Dim wb As Workbook
  Set wb = ThisWorkbook
  Dim i As Long
  
  'ブックの全モジュールを処理
  With wb.VBProject
    For i = 1 To .VBComponents.Count
      Call getCodeModule(dicProcInfo, wb, .VBComponents(i).Name)
    Next
  End With
  
  'Dictionaryよりシートに出力
  Dim ws As Worksheet
  Set ws = ThisWorkbook.Worksheets("プロシーシャー一覧")
  Dim v
  With ws
    .Cells.Clear
    .Range("A1:G1").Value = Array("モジュール", "プロシージャー", "スコープ", "種別", "行位置", "ソース", "コメント")
    i = 2
    For Each v In dicProcInfo.Items
      .Cells(i, 1) = v.ModName
      .Cells(i, 2) = v.ProcName
      .Cells(i, 3) = v.Scope
      .Cells(i, 4) = v.ProcKindName
      .Cells(i, 5) = v.LineNo
      .Cells(i, 6) = v.Source
      .Cells(i, 7) = "'" & v.Comment
      i = i + 1
    Next
  End With
  Set dicProcInfo = Nothing
End Sub

参照設定
「ツール」→「参照設定」で、
Microsoft Scripting Runtime
これを参照設定して下さい。

参照設定しない場合は、
Dim dicProcInfo As Object
Set dicProcInfo = CreateObject("Scripting.Dictionary")
として下さい。

シートへの出力結果は以下のようになります。

VBA マクロ VBProject VBComponents

これだけでも使えますが、
さらに独自の項目を追加して機能拡張してみると良いのではないでしょうか。



同じテーマ「マクロVBAサンプル集」の記事

素数を求めるマクロ
入力規則のリスト入力を確認する
配色を使用したカラー設定を固定カラーに再設定
指定セルに名前定義されているか判定する
Excel2003(xls)を2007以降(xlsx,xlsm)に変換する(HasVBProject)
ハイパーリンクからファイルのフルパスを取得する
ボタンのテキスト名のシートへ移動(Application.Caller)
Excelの表をPowerPointへ図として貼り付け
フォルダ(サブフォルダも全て)削除する、Optionでファイルのみ削除
Shift_JISのテキストファイルをUTF-8に一括変換
VBAコードの全プロシージャー・プロパィ一覧を取得


新着記事NEW ・・・新着記事一覧を見る

VBAでのCSVの扱い方まとめ|VBAサンプル集(11月9日)
VBAにおける変数のメモリアドレスについて|VBA技術解説(11月8日)
空文字列の扱い方と処理速度について(""とvbNullString)|VBA技術解説(1月7日)
Errオブジェクトとユーザー定義エラー|VBA入門(11月5日)
シングルクォートの削除とコピー(PrefixCharacter)|VBA技術解説(11月4日)
ユーザー定義型の制限とクラスとの使い分け|VBA技術解説(11月3日)
クリップボードに2次元配列を作成してシートに貼り付ける|VBA技術解説(11月1日)
VBAクラスを使ったイベント作成(Event,RaiseEvent,WithEvents)|VBA技術解説(10月31日)
VBAクラスのAttributeについて(既定メンバーとFor Each)|VBA技術解説(10月19日)
VBAの用語について:ステートメントとは|VBA技術解説(10月16日)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
3.RangeとCellsの使い方|ExcelマクロVBA入門
4.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
5.変数宣言のDimとデータ型|ExcelマクロVBA入門
6.繰り返し処理(For Next)|ExcelマクロVBA入門
7.マクロって何?VBAって何?|ExcelマクロVBA入門
8.ひらがな⇔カタカナの変換|エクセル基本操作
9.空白セルを正しく判定する方法(IsEmpty,IsError,HasFormula)|VBA技術解説
10.セルに文字を入れるとは(Range,Value)|VBA入門



  • >
  • >
  • >
  • VBAコードの全プロシージャー・プロパィ一覧を取得

  • このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


    記述には細心の注意をしたつもりですが、
    間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
    なお、掲載のVBAコードは自己責任で使ってください。万一データ破損等の損害が発生しても責任は負いません。




    このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
    本文下部へ