web-dev-qa-db-ja.com

MS Excelのバージョン管理を行う最良の方法

MS Excel(2003/2007)で使用しているバージョン管理システムは何ですか?何をお勧めしますか、なぜですか?トップレベルのバージョン管理システムにはどのような制限がありますか?

これを理解するために、いくつかのユースケースを以下に示します。

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

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

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

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

BZRリポジトリのディレクトリX:\ Data\MySheetをセットアップしました。リポジトリには、MySheet.xlsと各モジュール用の1つの.vbaファイルがあります(例:Module1Macros)。スプレッドシートに、「VersionControl」と呼ばれるエクスポート/インポートサイクルから除外されるモジュールを1つ追加しました。エクスポートおよび再インポートする各モジュールは、「マクロ」で終わる必要があります。

「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コードを共有してくれてありがとう!

63
Demosthenex

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

TortoiseSVNを使用していない場合でも、これは便利です。

41
mcherm

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

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

MSDNリンクは こちら です。

9
Mitch Wheat

バージョン管理の対象とその理由を要約します。

  1. 何:

    • コード(VBA)
    • スプレッドシート(​​式)
    • スプレッドシート(​​値)
    • チャート
    • ...
  2. なぜ:

    • 監査ログ
    • コラボレーション
    • バージョン比較(「差分」)
    • マージ

他の人がここに投稿したように、次のような既存のバージョン管理システムの上にいくつかのソリューションがあります。

  • Git
  • マーキュリアル
  • 転覆
  • バザール

ブック内のVBAコードのみが懸念事項である場合、上記のDemosthenexが提案するアプローチまたはVbaGit( https://github.com/brucemcpherson/VbaGit )は非常にうまく機能し、比較的簡単に実装できます。利点は、実績のあるバージョン管理システムに依存し、ニーズに応じて選択できることです( https://help.github.com/articles/what-are-the-differences-betweenをご覧ください) -svn-and-git / GitとSubversionの簡単な比較用)。

コードだけでなく、シートのデータ(「ハードコーディングされた」値と式の結果)についても心配する場合は、同様の戦略を使用できます。シートのコンテンツをテキスト形式にシリアル化します(Range.Valueを使用)。既存のバージョン管理システムを使用します。これに関する非常に良いブログ投稿があります: https://wiki.ucl.ac.uk/display/~ucftpw2/2013/10/18/Using+git+for+version+control+of+spreadsheet+ models +-+ part + 1 + of +

ただし、スプレッドシートの比較は重要なアルゴリズムの問​​題です。 MicrosoftのSpreadsheet Compareなどのいくつかのツールがあります( https://support.office.com/en-us/article/Overview-of-Spreadsheet-Compare-13fafa61-62aa-451b-8674-242ce5f2c986 )、Exceldiff( http://exceldiff.arstdesign.com/ )およびDiffEngineX( https://www.florencesoft.com/compare-Excel-workbooks-differences。 html )。しかし、これらの比較をGitのようなバージョン管理システムと統合することは別の課題です。

最後に、ニーズに合ったワークフローに落ち着かなければなりません。 Excel用のシンプルでカスタマイズされたGitワークフローについては、 https://www.xltrail.com/blog/git-workflow-for-Excel をご覧ください。

7
Bjoern Stiel

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

  • ブックを他のアプリケーションと同様に扱います。ロジック、構成、データを分離します。
  • ブックからコードを分離します。
  • プログラムでUIを構築します。
  • ブックを再構築するビルドスクリプトを記述します。
7
Hobbo

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

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

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

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

そして、ワークブックモジュールで:

Private Sub Workbook_Open()

    ImportCodeModules

End Sub

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

    SaveCodeModules

End Sub
6
przemo_li

@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)(Sheet1Sheet2ThisWorkbookなどを意味する)は、.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\"
6
dslosky

私はgitを使用し、今日は this(git-xlsx-textconv) をPythonに移植しました。プロジェクトがPythonに基づいているためです_コード、およびExcelファイルと対話します。これは少なくとも。xlsxファイルで機能しますが、。xlsでも機能すると思います。 こちら githubリンク。私は2つのバージョンを書きました。1つは行ごとに行があり、もう1つは行ごとに行があります(後者はgit diffがラップしたくないので書きました)デフォルトでは長い行、少なくともここではWindowsで)。

これは私の。gitconfigファイルです(これにより、異なるスクリプトをプロジェクトのリポジトリに置くことができます):

[diff "xlsx"]
    binary = true
    textconv = python `git rev-parse --show-toplevel`/src/util/git-xlsx-textconv.py

スクリプトを多くの異なるリポジトリで使用できるようにするには、次のようなものを使用します。

[diff "xlsx"]
    binary = true
    textconv = python C:/Python27/Scripts/git-xlsx-textconv.py

my。gitattributesファイル:

*.xlsx diff=xlsx
3
nmz787

できることの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のコマンドラインインターフェイスを使用します。それでいいでしょう。私も自分でこれを行うことを考えています:)

3
GUI Junkie

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

2
mattlant

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

2
Yuxiang Wang

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

1
SpyJournal

SVNやCVSなどの標準バージョン管理ツールを使用します。制限は、目的によって異なります。リポジトリのサイズのわずかな増加は別として、私は問題に直面しませんでした

1
Dheer

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

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

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

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

1
eriklind

年齢を検索し、さまざまなツールを試した後、ここでvbaバージョン管理の問題に対する私の答えを見つけました: https://stackoverflow.com/a/25984759/2780179

コードを見つけることができる単純なExcelアドイン here

インポート後に重複したモジュールはありません。ワークブックを保存するとすぐに、コードが自動的にエクスポートされます。既存のワークブックを変更せずに。 vbaコードフォーマッタが付属しています。

1
CodeKid

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

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

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

1
Jim Slavens

DiffEngineXを試してください。プログラムで呼び出すことも、コマンドライン引数を使用してコマンドラインから呼び出すこともできます。 Excelスプレッドシートのセルだけでなく、ブックに埋め込まれたVisual Basicマクロも比較します。また、Excelが定義した名前とコメントを比較しますが、これらは多くのフリーウェアツールが見逃しています。からダウンロードできます

http://www.florencesoft.com/Excel-differences-download.html

バージョン管理システムにはオプションまたはボックスがあるので、元のExcelブックと変更されたExcelブックでDiffEngineXを自動的に呼び出すことができます。

1
Marisa Poulian

バージョン管理にZipコンテナ(.xlsxおよび.xslm)でMicrosoftのExcel XMLを使用してみて、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コンテナー内のファイルと完全に一致するようにする必要があります(削除されたファイルを残さないでください)。

0
Dave Saunders

私のニーズを満たすこの質問に対する非常に簡単な解決策を見つけました。すべてのマクロの最後に1行を追加し、実行するたびにマクロコード全体を含む*.txtファイルをエクスポートします。コード:

ActiveWorkbook.VBProject.VBComponents("moduleName").Export"C:\Path\To\Spreadsheet\moduleName.txt"

Tom's Tutorials にあります。これは、これを機能させるために必要なセットアップもカバーしています。)

コードで作業しているときは常にマクロを実行するので、gitが変更を取得することが保証されます。唯一の迷惑な部分は、以前のバージョンをチェックアウトする必要がある場合、*.txtからスプレッドシートに手動でコピー/貼り付けする必要があることです。

0
LShaver

また、Beyond Compareと呼ばれるプログラムがあり、これには非常に素晴らしいExcelファイル比較があります。これを簡単に示す中国語のスクリーンショットを見つけました。

Beyond Compare - comparing two Excel files (Chinese)
元の画像ソース

page で30日間のトライアルがあります

0
mana

OPの質問のポイント1と4だけを解決するGitHubプロジェクトを次に示します。 https://github.com/ColmBhandal/VbaMisc 。 VBAモジュールのみのVCソリューションです。 GitHubに表示されるプロジェクト構造を複製し、VCの下に配置するモジュールをExportImportモジュールで定義されたwhiteListに追加することにより、任意のプロジェクトに簡単に調整できます。そのモジュールは、VBAモジュールのホワイトリストのエクスポートとインポートを制御し、潜在的に自身を含む。使用方法については、GitHubリポジトリをご覧ください。

0
Colm Bhandal

私の会社はMicrosoft Officeソリューションの自動化にかなりの量の作業を行っているため、テンプレートが保存されるたびにソリューションのソースをエクスポートする.DLLを作成しました。テンプレートが保存されているフォルダーの子としてSourceという名前のフォルダーを作成し、ソースの下にVBAプロジェクトと同じ名前のフォルダーを作成します。プロジェクトフォルダーでは、モジュール、クラス、ユーザーフォームのすべてのソースコードをエクスポートします。この配置は、テンプレートの大規模なコレクションのソースを簡単に管理できるようにするために選択されました。ローカル構成ファイルまたはグローバル構成ファイルを使用できる場合、DLLはロックされたプロジェクトのロックを解除してVBAプロジェクトにアクセスできます。このツールを使用すると、開発者は自分の心のコンテンツに合わせてテンプレートを作成し、お気に入りのリビジョン管理ツールを使用して作業を管理できます。主に環境でGitを使用し、完全なテンプレートバイナリファイルとVBAリソースをリビジョン管理下に置いています。

0
Chad Knudson