概要
AccessMDB・VBAの可視化
§3
ビジネステクノロジー活用講座
■AccessMDBのVBAソースコードを可視化/一覧化する
MSAccessで書かれたソースコードが100万ステップ、それほど気軽に開発できるのがAccessです。しかし、どれが生きているモジュールか、どれが
不要で削除してよいか簡単に判別できなくなることもよくあります。こんな時にはMDBの中に定義されたVBAソースを1つのExcelシート上にまとめれば、解析も容易。
あとはExcelの機能でVBAを可視化、解析が簡単にできます。
以下のような解析画面はその下に添付したVBAソースをそのまま使用すれば、すぐに実行し、作成できます。
☆動かない場合にはお気軽にお問い合わせください☆
Excelに取り込んで作成したAccessMDBのVBAソースファイル一覧
AccessMDBの中の全VBAソースコードを取込み、表示
Excelのフィルタ機能やVBAで作成した関数レベルの一覧表
【AccessMDBのVBA可視化プログラム・ソース】
'
' ソースをExportするプログラムです。実行時に解析したいMDBを指定すれば、カレントフォルダに\sourceフォルダが作成され、そのフォルダ下にVBAソースがExportされます。
'
Option Explicit
Private Sub CommandButton1_Click()
Dim inFileName, fs, inFile, outPath, outFolderName
Dim accessObj, vbproject, vbcComp, ext, moduleName
inFileName = GetFilename("c:\") '取り込むMDBを選択
outPath = ThisWorkbook.Path
Set fs = CreateObject("Scripting.FileSystemObject")
Set inFile = fs.GetFile(inFileName)
outPath = outPath & "\source"
' 出力フォルダが存在していれば消して作り直す
If fs.FolderExists(outPath) Then
fs.DeleteFolder (outPath)
End If
fs.CreateFolder (outPath)
Set outFolderName = fs.GetFolder(outPath)
'mdbを開く
Set accessObj = CreateObject("Access.Application")
accessObj.OpenCurrentDatabase (inFileName)
' モジュールをテキスト化
Set vbproject = accessObj.VBE.ActiveVBProject
For Each vbcComp In vbproject.VBComponents
Select Case vbcComp.Type
Case 100, 1 'Module
ext = ".bas"
Case 2 'class
ext = ".cls"
Case 3 'Form
ext = ".frm"
Case Else
ext = ""
End Select
moduleName = Replace(vbcComp.Name, "/", "_")
vbcComp.Export (outFolderName.Path & "\" & moduleName & ext)
Next
accessObj.Application.Quit
MsgBox "完了しました"
End Sub
'ファイル選択
Function GetFilename(pathname) As String
Dim FN As String
With Application.FileDialog(msoFileDialogFilePicker)
.InitialFileName = pathname
If .Show = -1 Then
FN = .SelectedItems(1)
Else
FN = ""
End If
End With
GetFilename = FN
End Function
'
' 上記の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を使えば本格的なプログラム解析まで簡単に可能です。 システムエンジニアの手作業に依存せず、エンジニアよりも安く、早く、正確に作業が可能です。ぜひお試しください。