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 & "." & 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 にアクセスできるところが便利な所
のようです。