今回も引き続きExcelVBAのネタです。
Excelでの開発は、Excelファイル本体がバイナリであるため
バージョン管理を行う事が困難です。
(2007以降はzip解凍してxml形式になるようですが・・・)
また、VBAのモジュールは開発が進むにつれ、履歴がたまりファイルサイズが大きくなります。
モジュール自体が破損する事も多いようですね。
そういうときの対処として、モジュールを全てエクスポートし、インポートし直すと最適化される、
というのがネットに載っています。
それであれば、モジュール自体でソース管理してしまった方が良いでしょう。
モジュールはテキストファイルですので、バージョン管理ソフトとの親和性も高いです。
そこで、モジュールファイルを一括してエクスポート、
または全て解放後、一括してインポートするコードをご紹介します。
本体のファイル直下にForm、Class、Module、それぞれのフォルダを作成し、エクスポートするコードと、それらのフォルダからインポートするコードです。
一括エクスポートした後はVSSなりSVNなりにコミットしたって下さい。
''-----------------------------------------------------------------------
'' 全プロジェクトファイルエクスポート(ブック・シートに付随するコード以外)
'' 事前にマクロのセキュリティ→VBAのオブジェクトモデルへのアクセスを許可する事(実行時エラーになります。)
''-----------------------------------------------------------------------
Private Sub Export_All()
Dim Path As String
Dim i As Integer
Const cls As String = "\Class\"
Const FRM As String = "\Form\"
Const MODL As String = "\Module\"
Const EXT_MODL As String = ".bas"
Const EXT_CLS As String = ".cls"
Const EXT_FRM As String = ".frm"
Path = ThisWorkbook.Path
'' エクスポートフォルダ
If Dir(Path & cls) = "" Then MkDir (Path & cls)
If Dir(Path & FRM) = "" Then MkDir (Path & FRM)
If Dir(Path & MODL) = "" Then MkDir (Path & MODL)
With ActiveWorkbook.VBProject
For i = 1 To .VBComponents.Count
Select Case .VBComponents(i).Type
Case 1 '' vbCompTypeModul
.VBComponents(i).Export Path & MODL & .VBComponents(i).Name & EXT_MODL
Case 2 '' vbCompTypeClassModul
.VBComponents(i).Export Path & cls & .VBComponents(i).Name & EXT_CLS
Case 3 '' vbCompTypeUserform
.VBComponents(i).Export Path & FRM & .VBComponents(i).Name & EXT_FRM
End Select
Next
End With
End Sub
''-----------------------------------------------
''--プロジェクトファイル洗い替え-----------------
''-----------------------------------------------
Private Sub Refresh()
Call Release_All
Call Import_All
End Sub
'' 全プロジェクトファイルリリース
Private Sub Release_All()
Dim i As Integer
Dim colComName As New Collection
With ThisWorkbook.VBProject
For i = 1 To .VBComponents.Count
If .VBComponents(i).Type = 1 Or .VBComponents(i).Type = 2 Or .VBComponents(i).Type = 3 Then
colComName.Add (.VBComponents(i).Name)
End If
Next
For i = 1 To colComName.Count
.VBComponents.Remove .VBComponents(colComName(i))
Next
End With
Set colComName = Nothing
End Sub
'' 全プロジェクトファイルインポート
Private Sub Import_All()
Dim Path As String
Dim i As Integer
Const cls As String = "\Class\"
Const FRM As String = "\Form\"
Const MODL As String = "\Module\"
Const EXT_MODL As String = ".bas"
Const EXT_CLS As String = ".cls"
Const EXT_FRM As String = ".frm"
Path = ThisWorkbook.Path
Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")
Dim fileList As Object
'' Cls
Set fileList = fso.GetFolder(Path & cls).Files
For Each file In fileList
ActiveWorkbook.VBProject.VBComponents.Import Path & cls & file.Name
Next
'' Form
Set fileList = fso.GetFolder(Path & FRM).Files
For Each file In fileList
If Right(file.Name, 4) = EXT_FRM Then
ActiveWorkbook.VBProject.VBComponents.Import Path & FRM & file.Name
End If
Next
'' Module
Set fileList = fso.GetFolder(Path & MODL).Files
For Each file In fileList
ActiveWorkbook.VBProject.VBComponents.Import Path & MODL & file.Name
Next
End Sub
これをアドインにしてインストールして置くと便利。
但し、シートオブジェクトやブックオブジェクトに記述されているコードは対象外となるので、
そこらへんは手作業なのが玉に傷。
ネタ元はネットに散らばっていた情報ですので、ご利用は自己責任でお願いいたします・・・
0 件のコメント:
コメントを投稿