概要
ExcelVBAの可視化
§2
ビジネステクノロジー活用講座
■ExcelVBAのソースコードを可視化/一覧化する
最近のExcelはこれがExcelか!と思うほど、強力な開発機能を備えています。しかし、他に人が作成したExcelVBAは解読や修正が
困難な場合が多々あります。
Sheetや共通モジュール、フォームに散在するVBAソースを1つのExcelシート上にまとめれば、解析も容易。
あとはExcelの機能でExcelVBAを可視化、解析が簡単にできます。
以下のような解析画面はその下に添付したVBAソースをそのまま使用すれば、すぐに作成できます。
☆動かない場合にはお気軽にお問い合わせください☆
ExcelVBAをExportしたフォルダ
Excelに取り込んで作成したソースファイル一覧
Excel上の全VBAソースコード表示
Excelのフィルタ機能やVBAで作成した関数レベルの一覧表
【ExcelVBA可視化プログラム・ソース】
'
' ソースをExportするプログラムです。解析したいExcelシートのどこかに貼り付けて実行すれば、
' そのカレントフォルダに\sourceフォルダが作成され、そのフォルダ下にVBAソースがExportされます。
'
Private Sub CommandButton1_Click()
Dim TempComponent As Object
Dim ExportPath As String
'Export先フォルダの作成、存在すればデータをクリアー
ExportPath = ThisWorkbook.Path & "\source"
If Dir(ExportPath, vbDirectory) = "" Then
Call MkDir(ExportPath)
End If
'
If Dir(ExportPath & "\BAS", vbDirectory) = "" Then
Call MkDir(ExportPath & "\bas")
Else
Kill ExportPath & "\bas\*.*"
End If
'
If Dir(ExportPath & "\CLS", vbDirectory) = "" Then
Call MkDir(ExportPath & "\cls")
Else
Kill ExportPath & "\cls\*.*"
End If
'
If Dir(ExportPath & "\FRM", vbDirectory) = "" Then
Call MkDir(ExportPath & "\frm")
Else
Kill ExportPath & "\frm\*.*"
End If
'プロジェクト内全ソースコードをExport
For Each TempComponent In ThisWorkbook.VBProject.VBComponents
Select Case TempComponent.Type
Case 1 '標準モジュール
TempComponent.Export ExportPath & "\bas\" & TempComponent.Name & ".bas"
Case 2 'クラスモジュール
TempComponent.Export ExportPath & "\cls\" & TempComponent.Name & ".cls"
Case 3 'ユーザーフォーム
TempComponent.Export ExportPath & "\frm\" & TempComponent.Name & ".frm"
Case 100 'Excelオブジェクト(ワークブック・シート)
TempComponent.Export ExportPath & "\cls\" & TempComponent.Name & ".cls"
End Select
Next
MsgBox "Export完了"
End Sub
'
' 上記のExportデータを一括してExcelシートに読込み、関数一覧などを作成するVBAです。
'
Dim out_ctr As Long
'全ソース読込み
Private Sub CommandButton1_Click()
Dim foldername As String
Dim i As Long
Dim x, y As String
Dim buff As String
out_ctr = 0
Worksheets("Sheet1").Cells.ClearContents
Worksheets("Sheet2").Cells.ClearContents
foldername = GetFoldername("c:\")
If foldername <> "" Then
Call getFileList(foldername)
out_ctr = 1
i = 1
Do Until Worksheets("Sheet1").Cells(i, 1) = ""
x = Worksheets("sheet1").Cells(i, 2)
j = InStrRev(x, ".")
y = StrConv(Mid(x, j, 10), vbLowerCase)
If y = ".bas" Or y = ".cls" Or y = ".frm" Then
Open Worksheets("Sheet1").Cells(i, 1) & "\" & Worksheets("Sheet1").Cells(i, 2) For Input As #1
num = 0
Do Until EOF(1)
Line Input #1, buff
num = num + 1
y = StrConv(buff, vbLowerCase)
'If InStr(1, y, "function ") > 0 And InStr(1, y, "end function") < 1 Or _
' InStr(1, y, "sub ") > 0 And (InStr(1, y, "end sub") < 1 Or InStr(1, y, "exit sub") < 1) Then
Worksheets("Sheet2").Cells(out_ctr, 1) = Worksheets("sheet1").Cells(i, 1)
Worksheets("Sheet2").Cells(out_ctr, 2) = Worksheets("sheet1").Cells(i, 2)
Worksheets("Sheet2").Cells(out_ctr, 3) = buff
Worksheets("Sheet2").Cells(out_ctr, 4) = num
out_ctr = out_ctr + 1
'End If
Loop
Close #1
End If
i = i + 1
Loop
End If
End Sub
'ファイル一覧作成
Sub getFileList(DirPath As String)
Dim buff As String, fl As Object
buff = Dir(DirPath & "\*.*")
Do While buff <> ""
out_ctr = out_ctr + 1
Cells(out_ctr, 1) = DirPath
Cells(out_ctr, 2) = buff
buff = Dir()
Loop
With CreateObject("Scripting.FileSystemObject")
For Each fl In .GetFolder(DirPath).SubFolders
Call getFileList(fl.Path)
Next fl
End With
End Sub
'フォルダ選択
Function GetFoldername(pathname) As String
Dim FN As String
With Application.FileDialog(msoFileDialogFolderPicker)
.InitialFileName = pathname
If .Show = -1 Then
FN = .SelectedItems(1)
Else
FN = ""
End If
End With
GetFoldername = FN
End Function
Excelシートに取り込めば、あとはExcelの検索やフィルタ機能、さらにはVBAを使えば本格的なプログラム解析まで簡単に可能です。 システムエンジニアの手作業に依存せず、エンジニアよりも安く、早く、正確に作業が可能です。ぜひお試しください。