1. ホーム
  2. excel

[解決済み] MS Excelでバージョン管理をする最適な方法【非公開

2022-04-28 19:03:08

質問

MS Excel (2003/2007)で使用したことのあるバージョン管理システムは何ですか?また、その理由は何ですか?また、その理由も教えてください。

これを踏まえて、いくつかのユースケースを紹介します。

  1. VBAモジュールのバージョン管理
  2. 複数の人が1つのExcelスプレッドシートで作業しており、同じワークシートに変更を加え、それをマージして統合したい場合があります。このワークシートには、計算式、データ、チャートなどが含まれている可能性があります。
  3. ユーザーはあまり専門的ではなく、使用するバージョン管理システムは少ない方が良い。
  4. スペースの制約を考慮する。Excelのスプレッドシート全体ではなく、増分的な変更のみが保存されるのが理想的です。

解決方法は?

Bazaarを使用し、TortiseBZRを使用して手動でチェックイン/アウトするスプレッドシートをセットアップしたところです。保存の部分でこのトピックに助けられたので、私の解決策をここに投稿したいと思います。

私の解決策は、保存時にすべてのモジュールをエクスポートし、開くときにモジュールを削除して再インポートするスプレッドシートを作成することでした。はい、これは既存のスプレッドシートを変換する際に潜在的に危険である可能性があります。

これによって、モジュール内のマクロの編集を Emacs (そう、emacs)またはExcelネイティブで、大きな変更の後に私のBZRリポジトリをコミットします。すべてのモジュールはテキストファイルなので、BZR の標準的な diff スタイルのコマンドは、Excel ファイルそのものを除いて、私のソースに対して機能します。

BZRのリポジトリにX: \DataMySheetというディレクトリを設定しました。このリポジトリにはMySheet.xlsと、モジュールごとに1つの.vbaファイル(例: Module1Macros)が入っています。私のスプレッドシートには、エクスポート/インポート サイクルから除外されるモジュールとして "VersionControl" が追加されています。エクスポートと再インポートされる各モジュールは、"Macros" で終わらなければなりません。

VersionControl"モジュールの内容です。

Sub SaveCodeModules()

'This code Exports all VBA modules
Dim i%, sName$

With ThisWorkbook.VBProject
    For i% = 1 To .VBComponents.Count
        If .VBComponents(i%).CodeModule.CountOfLines > 0 Then
            sName$ = .VBComponents(i%).CodeModule.Name
            .VBComponents(i%).Export "X:\Tools\MyExcelMacros\" & sName$ & ".vba"
        End If
    Next i
End With

End Sub

Sub ImportCodeModules()

With ThisWorkbook.VBProject
    For i% = 1 To .VBComponents.Count

        ModuleName = .VBComponents(i%).CodeModule.Name

        If ModuleName <> "VersionControl" Then
            If Right(ModuleName, 6) = "Macros" Then
                .VBComponents.Remove .VBComponents(ModuleName)
                .VBComponents.Import "X:\Data\MySheet\" & ModuleName & ".vba"
           End If
        End If
    Next i
End With

End Sub

次に、これらのマクロを実行するために、開く/保存のイベントフックを設定する必要があります。コードビューアで、"ThisWorkbook"を右クリックし、"View Code"を選択します。コードウィンドウの上部にあるセレクトボックスをプルダウンして、quot;(一般)ビューからquot;Workbook"ビューに変更する必要がある場合があります。

Workbook"ビューの内容です。

Private Sub Workbook_Open()

ImportCodeModules

End Sub

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)

SaveCodeModules

End Sub

これから数週間かけてこのワークフローに慣れるつもりですが、何か問題があれば投稿します。

VBComponentのコードを共有していただきありがとうございます