VBA プロシージャ名の取得 ハッシュテーブルの利用

VBAで,プロシャージャ名を取得する方法をあれこれあさっていましたが,あるサイトに,VBSでプロ
シージャ名を取得するVBSがのっていました。VBSとVBAの区別がつかなかったのですが,別物という
ことに気づき,あるサイトでVBSをVBAに変換するサイトがありましたので,そこでVBAに変換してみ
ました。下記のVBSを変換すると,

Set HashTbl = CreateObject("System.Collections.Hashtable")
Set CPobj = WBobj.VBProject.VBComponents("Module1")
Set CMod = CPobj.CodeModule
For i = 1 To CMod.CountOfLines
    ProcName = CMod.ProcOfLine(i,0)  ' プロシージャ名を取得
    If ProcName <> "" And HashTbl.ContainsKey(ProcName) = False Then
        HashTbl.Add ProcName, i
        EXLapp.MacroOptions CPobj.Name & "." & ProcName,,,,True,""
    End If
Next

下記のように変換してくれました。

' This code is translated from VBScript to VBA.
Dim HashTable As Object
Dim ComponentObject As Object
Dim CodeModule As Object
Dim ProcedureName As String
Dim LineIndex As Long

Set HashTable = CreateObject("Scripting.Dictionary") ' Using Scripting.Dictionary for better compatibility in VBA
Set ComponentObject = WBobj.VBProject.VBComponents("Module1")
Set CodeModule = ComponentObject.CodeModule

For LineIndex = 1 To CodeModule.CountOfLines
    ProcedureName = CodeModule.ProcOfLine(LineIndex, 0)  ' Retrieve the procedure name
    If ProcedureName <> "" And Not HashTable.Exists(ProcedureName) Then
        HashTable.Add ProcedureName, LineIndex
        EXLapp.MacroOptions ComponentObject.Name & "." & ProcedureName, , , , True, ""
    End If
Next LineIndex

ただ,このままではだめで,一部修正が必要でした。まず,

 EXLapp.MacroOptions ComponentObject.Name &amp; "." &amp; ProcedureName, , , , True, ""

の部分は,多分,ショートカットの設定の部分?なので,削除しました。また,「WBobj」の設定がしてない
ことでエラーになるので,ここを,とりあえず「Thisworkbook」に,そして,表示の部分を加えて下記のよ
うにしました。

Dim HashTable As Object
Dim ComponentObject As Object
Dim CodeModule As Object
Dim ProcedureName As String
Dim i As Integer
Dim keys() As Variant
Dim values() As Variant

Set HashTable = CreateObject("Scripting.Dictionary") ' Using Scripting.Dictionary for better compatibility
Set ComponentObject = ThisWorkbook.VBProject.VBComponents("Module1")
Set CodeModule = ComponentObject.CodeModule

For i = 1 To CodeModule.CountOfLines
    ProcedureName = CodeModule.ProcOfLine(i, 0)  ' プロシージャ名を取得
    If ProcedureName <> "" And Not HashTable.Exists(ProcedureName) Then
        HashTable.Add ProcedureName, i '要素にプロシャージャの開始行番号を追加
    End If
Next i

keys = HashTable.keys
values = HashTable.Items

For i = 0 To UBound(keys)
    Debug.Print keys(i) & " " & values(i)
Next i

これで,自身のModule1に記載された,プロシャージャとその開始行番号が表示されるようになりました。

今回,参考にしたHPにハッシュテーブルを使った例がでていましたので,ハッシュテーブルを使ってみまし
た。ハッシュテーブル(連想配列)は,以前から知っていましたが,使ったことはありませんでした。通常の
配列と違って,設定した key によって,それに応じた item にアクセスできるところが便利な所
のようです。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA