177

MS Excel (2003/2007) で使用したバージョン管理システムは何ですか? 何をお勧めしますか、なぜですか? 最高評価のバージョン管理システムで、どのような制限を見つけましたか?

これを概観するために、いくつかの使用例を次に示します。

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

22 に答える 22

66

TortiseBZR を介して手動でチェックイン/チェックアウトする、Bazaar を使用するスプレッドシートをセットアップしました。トピックが保存部分に役立ったことを考えると、ここに私の解決策を投稿したいと思いました.

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

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

BZR リポジトリ X:\Data\MySheet のディレクトリをセットアップしました。リポジトリには、MySheet.xls と、モジュールごとに 1 つの .vba ファイルがあります (例: Module1Macros)。私のスプレッドシートでは、「VersionControl」と呼ばれるエクスポート/インポート サイクルから除外される 1 つのモジュールを追加しました。エクスポートおよび再インポートする各モジュールは、「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] を右クリックし、[コードの表示] を選択します。[(一般)] ビューから [ワークブック] ビューに変更するには、コード ウィンドウの上部にある選択ボックスをプルダウンする必要がある場合があります。

「ワークブック」ビューの内容:

Private Sub Workbook_Open()

ImportCodeModules

End Sub

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

SaveCodeModules

End Sub

今後数週間でこのワークフローに落ち着く予定です。問題があれば投稿します。

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

于 2010-01-05T02:28:20.737 に答える
44

TortoiseSVNは、Subversionバージョン管理システム用の驚くほど優れたWindowsクライアントです。私が発見した機能の1つは、クリックしてExcelファイルのバージョン間の差分を取得すると、両方のバージョンがExcelで開き、変更されたセルが強調表示(赤)されることです。これは、ここで説明するvbsスクリプトの魔法によって行われます。

TortoiseSVNを使用していない場合でも、これが役立つ場合があります。

于 2010-01-07T15:52:46.910 に答える
9

データについて話しているのか、スプレッドシートに含まれるコードについて話しているのかによって異なります。私は Microsoft の Visual Sourcesafe が嫌いで、通常はお勧めしませんが、Access と Excel の両方と簡単に統合でき、モジュールのソース管理を提供します。

[実際、Access との統合には、バージョン管理できる個々のオブジェクトとして、クエリ、レポート、およびモジュールが含まれます]

MSDN のリンクはこちらです。

于 2008-09-25T05:44:58.343 に答える
7

これをうまく行うツールは知りませんが、さまざまな自家製のソリューションを見てきました。これらの共通のスレッドは、バージョン管理下でバイナリ データを最小化し、テキスト データを最大化して、従来の scc システムの能力を活用することです。これをする:

  • ワークブックを他のアプリケーションと同様に扱います。ロジック、構成、およびデータを分離します。
  • ワークブックからコードを分離します。
  • プログラムで UI を構築します。
  • ワークブックを再構築するビルド スクリプトを記述します。
于 2008-09-25T09:19:09.170 に答える
6

@Demosthenex の作業、@Tmdean と @Jon Crowell の貴重なコメントに取り組んでいます! (+1)

ワークブックの場所の横にある git\ dir にモジュール ファイルを保存します。好みに合わせて変更してください。

これはワークブック コードへの変更を追跡しません。したがって、それらを同期するのはあなた次第です。

Sub SaveCodeModules()

'This code Exports all VBA modules
Dim i As Integer, name As String

With ThisWorkbook.VBProject
    For i = .VBComponents.count To 1 Step -1
        If .VBComponents(i).Type <> vbext_ct_Document Then
            If .VBComponents(i).CodeModule.CountOfLines > 0 Then
                name = .VBComponents(i).CodeModule.name
                .VBComponents(i).Export Application.ThisWorkbook.Path & _
                                            "\git\" & name & ".vba"
            End If
        End If
    Next i
End With

End Sub

Sub ImportCodeModules()
Dim i As Integer
Dim ModuleName As String

With ThisWorkbook.VBProject
    For i = .VBComponents.count To 1 Step -1

        ModuleName = .VBComponents(i).CodeModule.name

        If ModuleName <> "VersionControl" Then
            If .VBComponents(i).Type <> vbext_ct_Document Then
                .VBComponents.Remove .VBComponents(ModuleName)
                .VBComponents.Import Application.ThisWorkbook.Path & _
                                         "\git\" & ModuleName & ".vba"
            End If
        End If
    Next i
End With

End Sub

そして Workbook モジュールで:

Private Sub Workbook_Open()

    ImportCodeModules

End Sub

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

    SaveCodeModules

End Sub
于 2014-03-07T17:25:10.490 に答える
6

@Demosthenex の回答をさらに一歩進めると、Microsoft Excel オブジェクトとユーザーフォームのコードも追跡したい場合は、少しトリッキーになる必要があります。

最初にSaveCodeModules()、エクスポートする予定のさまざまな種類のコードを考慮して関数を変更しました。

Sub SaveCodeModules(dir As String)

'This code Exports all VBA modules
Dim moduleName As String
Dim vbaType As Integer

With ThisWorkbook.VBProject
    For i = 1 To .VBComponents.count
        If .VBComponents(i).CodeModule.CountOfLines > 0 Then
            moduleName = .VBComponents(i).CodeModule.Name
            vbaType = .VBComponents(i).Type

            If vbaType = 1 Then
                .VBComponents(i).Export dir & moduleName & ".vba"
            ElseIf vbaType = 3 Then
                .VBComponents(i).Export dir & moduleName & ".frm"
            ElseIf vbaType = 100 Then
                .VBComponents(i).Export dir & moduleName & ".cls"
            End If

        End If
    Next i
End With

End Sub

ユーザー フォームは、VBA コードと同様にエクスポートおよびインポートできます。唯一の違いは、フォームをエクスポートすると 2 つのファイルが作成されることです (ユーザー フォームごと.frmに とファイルを取得します)。.frxこれらの 1 つは作成したソフトウェアを保持し、もう 1 つはフォームのレイアウトを定義するバイナリ ファイルです (私はかなり確信しています)。

Microsoft Excel オブジェクト (MEO) ( 、 などを意味するSheet1)はSheet2、ファイルThisWorkbookとしてエクスポートでき.clsます。ただし、このコードをワークブックに戻したい場合、VBA モジュールと同じ方法でインポートしようとすると、そのシートがワークブックに既に存在する場合はエラーが発生します。

この問題を回避するために、.cls ファイルを Excel にインポートするのではなく、.clsファイルを文字列として Excel に読み込み、この文字列を空の MEO に貼り付けることにしました。ここに私の ImportCodeModules があります:

Sub ImportCodeModules(dir As String)

Dim modList(0 To 0) As String
Dim vbaType As Integer

' delete all forms, modules, and code in MEOs
With ThisWorkbook.VBProject
    For Each comp In .VBComponents

        moduleName = comp.CodeModule.Name

        vbaType = .VBComponents(moduleName).Type

        If moduleName <> "DevTools" Then
            If vbaType = 1 Or _
                vbaType = 3 Then

                .VBComponents.Remove .VBComponents(moduleName)

            ElseIf vbaType = 100 Then

                ' we can't simply delete these objects, so instead we empty them
                .VBComponents(moduleName).CodeModule.DeleteLines 1, .VBComponents(moduleName).CodeModule.CountOfLines

            End If
        End If
    Next comp
End With

' make a list of files in the target directory
Set FSO = CreateObject("Scripting.FileSystemObject")
Set dirContents = FSO.getfolder(dir) ' figure out what is in the directory we're importing

' import modules, forms, and MEO code back into workbook
With ThisWorkbook.VBProject
    For Each moduleName In dirContents.Files

        ' I don't want to import the module this script is in
        If moduleName.Name <> "DevTools.vba" Then

            ' if the current code is a module or form
            If Right(moduleName.Name, 4) = ".vba" Or _
                Right(moduleName.Name, 4) = ".frm" Then

                ' just import it normally
                .VBComponents.Import dir & moduleName.Name

            ' if the current code is a microsoft excel object
            ElseIf Right(moduleName.Name, 4) = ".cls" Then
                Dim count As Integer
                Dim fullmoduleString As String
                Open moduleName.Path For Input As #1

                count = 0              ' count which line we're on
                fullmoduleString = ""  ' build the string we want to put into the MEO
                Do Until EOF(1)        ' loop through all the lines in the file

                    Line Input #1, moduleString  ' the current line is moduleString
                    If count > 8 Then            ' skip the junk at the top of the file

                        ' append the current line `to the string we'll insert into the MEO
                        fullmoduleString = fullmoduleString & moduleString & vbNewLine

                    End If
                    count = count + 1
                Loop

                ' insert the lines into the MEO
                .VBComponents(Replace(moduleName.Name, ".cls", "")).CodeModule.InsertLines .VBComponents(Replace(moduleName.Name, ".cls", "")).CodeModule.CountOfLines + 1, fullmoduleString

                Close #1

            End If
        End If

    Next moduleName
End With

End Sub

dirこれらの両方の関数への入力に混乱している場合、それは単なるコード リポジトリです。したがって、これらの関数を次のように呼び出します。

SaveCodeModules "C:\...\YourDirectory\Project\source\"
ImportCodeModules "C:\...\YourDirectory\Project\source\"
于 2015-05-08T15:37:54.107 に答える
3

できることの1つは、ワークブックに次のスニペットを含めることです。

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 "C:\Code\" & sName$ & ".vba"
            End If
        Next i
    End With
End Sub

このスニペットはインターネットで見つけました。

その後、Subversionを使用してバージョン管理を維持できます。たとえば、VBA内の「shell」コマンドでSubversionのコマンドラインインターフェイスを使用します。それはそれをするでしょう。私もこれを自分でやろうと思っています:)

于 2008-09-25T08:16:05.437 に答える
3

VBA コードのバージョン管理が組み込まれている、Rubberduckという優れたオープンソース ツールをお勧めします。試してみてください。

于 2016-08-09T19:08:15.373 に答える
2

通常のオフィスの非技術ユーザーがいるオフィス環境を検討している場合は、Sharepointよりも実行可能な代替手段です。バージョン管理を有効にして、チェックインとチェックアウトを行うドキュメントフォルダを設定できます。通常のオフィスユーザーにとってより使いやすいものになります。

于 2008-09-25T05:55:35.260 に答える
2

mattlant の返信に応えて - ドキュメント ライブラリでバージョン管理機能がオンになっている場合にのみ、sharepoint がバージョン管理として適切に機能します。さらに、相対パスで他のファイルを呼び出すコードは機能しないことに注意してください。最後に、ファイルが共有ポイントに保存されると、外部ファイルへのリンクが壊れます。

于 2008-09-29T04:16:55.860 に答える
1

実際、マクロ コードの変更を追跡して比較するためのソリューションはほんの一握りしかありません。それらのほとんどは、ここで既に名前が付けられています。私はウェブを閲覧していて、言及する価値のあるこの新しいツールに出くわしました:

VBA マクロ用の XLTools バージョン管理

  • Excel シートと VBA モジュールのバージョン管理
  • バージョンをコミットする前に変更をプレビューおよび比較する
  • 同じファイルに対する複数のユーザーの共同作業に最適 (誰が何をいつ変更したかを追跡)
  • バージョンを比較し、コードの変更を行ごとに強調表示する
  • 技術に精通していないユーザー、または Excel に精通していないユーザーに適しています
  • バージョン履歴は自分の PC の Git リポジトリに保存されます - どのバージョンも簡単に復元できます

VBA コードのバージョンを並べて表示し、変更を視覚化

于 2016-04-12T17:00:40.507 に答える
1

私もこれを調べてきました。最新の Team Foundation Server 2010 には Excel アドインが含まれている可能性があります。

ここに手がかりがあります:

http://team-foundation-server.blogspot.com/2009/07/tf84037-there-was-problem-initializing.html

于 2010-10-27T22:35:11.150 に答える
1

SVN や CVS などの標準のバージョン管理ツールを使用します。制限は、目的が何であるかによって異なります。リポジトリのサイズがわずかに増加したことを除けば、問題は発生しませんでした

于 2008-09-25T05:44:40.560 に答える
0

バージョン管理のために Microsoft の Excel XML を zip コンテナー (.xlsx および .xslm) で使用しようとして、vba が vbaProject.bin に格納されていることがわかったかもしれません (これはバージョン管理には役に立ちません)。

解決策は簡単です。

  1. LibreOffice Calc で Excel ファイルを開きます。
  2. LibreOffice Calc で
    1. ファイル
    2. 名前を付けて保存
    3. タイプとして保存: ODF スプレッドシート (.ods)
  3. LibreOffice Calc を閉じる
  4. 新しいファイルのファイル拡張子の名前を .ods から .zip に変更します
  5. GIT が管理する領域にスプレッドシート用のフォルダーを作成する
  6. zipをGITフォルダーに抽出します
  7. GIT にコミットする

スプレッドシートの次のバージョンでこれを繰り返すときは、フォルダーのファイルが zip コンテナー内のファイルと完全に一致していることを確認する必要があります (削除されたファイルを残さないでください)。

于 2012-07-06T06:48:22.107 に答える
0

非常に優れた Excel ファイル比較機能を備えたBeyond Compareというプログラムもあります。これを簡単に示す中国語のスクリーンショットを見つけました。

Beyond Compare - 2 つの Excel ファイルの比較 (中国語)
元の画像ソース

彼らのページには30日間の試用版があります

于 2012-01-04T14:46:11.080 に答える
-1

ほとんどのVCSで動作するはずです(SVN、CVS、Darcs、TFSなどを選択する他の基準によって異なります)が、実際には完全なファイルになります(バイナリ形式であるため)。つまり、「何が変わったのか」という質問です。答えるのはそれほど簡単ではありません。

人々がログメッセージを完成させても、ログメッセージに頼ることはできますが、Office 2007の新しいXMLベースの形式を試して、可視性を高めることもできます(ただし、大量のXMLに加えて、XMLファイルをAFAIKすることは困難です。はディスク上で圧縮されているため、テキスト差分を正しく機能させるには、解凍するためにpre-commitフックが必要になります)。

于 2008-09-25T05:52:30.883 に答える
-1

VBA を使用してリビジョン管理されたスプレッドシートを作成しました。これは、複数の人が部品表またはスケジュールで作業していて、ある時点で前のリビジョンからの追加、削除、および更新を示すスナップショット リビジョンを作成するエンジニアリング レポートに適しています。

注: これは、私のサイトからダウンロードするためにサインインする必要があるマクロを有効にしたワークブックです (OpenID を使用できます)。

すべてのコードがロック解除されます。

改訂管理スプレッドシート

于 2012-01-05T06:36:21.760 に答える
-1

必要な統合のレベルによって異なります。単純な使用には問題ないように思われる Subversion/TortoiseSVN を使用しました。キーワードも追加しましたが、ファイルが破損するリスクがあるようです。Subversion には、キーワード置換を固定長にするオプションがあり、私が理解している限り、固定長が偶数で奇数でない場合に機能します。いずれにせよ、有用な種類の差分機能は得られません。「差分」を実行する商用製品があると思います。ものをプレーンテキストに変換して比較することに基づいて差分を作成するものを見つけましたが、あまり良くありませんでした。

于 2008-09-25T05:45:05.473 に答える