今回も引き続き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 件のコメント:
コメントを投稿