MS Excel(2003/2007)で使用しているバージョン管理システムは何ですか?何をお勧めしますか、なぜですか?トップレベルのバージョン管理システムにはどのような制限がありますか?
これを理解するために、いくつかのユースケースを以下に示します。
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コードを共有してくれてありがとう!
TortoiseSVN は、Subversionバージョン管理システム用の驚くほど優れたWindowsクライアントです。先ほど発見した機能の1つは、クリックしてExcelファイルのバージョン間の差分を取得すると、Excelで両方のバージョンを開き、変更されたセルを強調表示(赤)することです。これは、 here で説明されているvbsスクリプトの魔法によって行われます。
TortoiseSVNを使用していない場合でも、これは便利です。
データについて話しているのか、スプレッドシートに含まれているコードについて話しているのかによって異なります。私はMicrosoftのVisual Sourcesafeが非常に嫌いで、通常は推奨しませんが、AccessとExcelの両方と簡単に統合でき、モジュールのソース管理を提供します。
[実際、Accessとの統合には、バージョン管理可能な個別のオブジェクトとしてクエリ、レポート、およびモジュールが含まれます]
MSDNリンクは こちら です。
バージョン管理の対象とその理由を要約します。
何:
なぜ:
他の人がここに投稿したように、次のような既存のバージョン管理システムの上にいくつかのソリューションがあります。
ブック内の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 をご覧ください。
私はこれをうまく行うツールを知りませんが、私はさまざまな自家製のソリューションを見てきました。これらの共通のスレッドは、バージョン管理下のバイナリデータを最小化し、テキストデータを最大化して、従来のsccシステムの能力を活用することです。これをする:
@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
@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\"
私は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
できることの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のコマンドラインインターフェイスを使用します。それでいいでしょう。私も自分でこれを行うことを考えています:)
通常のオフィスの非技術ユーザーがいるオフィスの設定を見ている場合、Sharepointは実行可能な代替手段です。バージョン管理を有効にして、チェックインとチェックアウトを行うドキュメントフォルダーをセットアップできます。通常のオフィスユーザーにとっては、より使いやすくなります。
Rubberduck という優れたオープンソースツールをお勧めします。これには、VBAコードのバージョン管理が組み込まれています。試してみてください。
mattlantの返信に応じて-ドキュメントライブラリでバージョン管理機能がオンになっている場合にのみ、SharePointはバージョン管理として機能します。さらに、相対パスで他のファイルを呼び出すコードは機能しないことに注意してください。最後に、ファイルがsharepointに保存されると、外部ファイルへのリンクがすべて解除されます。
SVNやCVSなどの標準バージョン管理ツールを使用します。制限は、目的によって異なります。リポジトリのサイズのわずかな増加は別として、私は問題に直面しませんでした
実際には、マクロコードの変更を追跡して比較するためのほんの一握りのソリューションがあります。それらのほとんどはすでにここで名前が付けられています。私はウェブをブラウジングしていて、言及する価値のあるこの新しいツールに出会いました。
年齢を検索し、さまざまなツールを試した後、ここでvbaバージョン管理の問題に対する私の答えを見つけました: https://stackoverflow.com/a/25984759/2780179
コードを見つけることができる単純なExcelアドイン here
インポート後に重複したモジュールはありません。ワークブックを保存するとすぐに、コードが自動的にエクスポートされます。既存のワークブックを変更せずに。 vbaコードフォーマッタが付属しています。
私もこれを調べてきました。最新のTeam Foundation Server 2010にはExcelアドインが含まれている可能性があるようです。
ここに手がかりがあります:
http://team-foundation-server.blogspot.com/2009/07/tf84037-there-was-problem-initializing.html
DiffEngineXを試してください。プログラムで呼び出すことも、コマンドライン引数を使用してコマンドラインから呼び出すこともできます。 Excelスプレッドシートのセルだけでなく、ブックに埋め込まれたVisual Basicマクロも比較します。また、Excelが定義した名前とコメントを比較しますが、これらは多くのフリーウェアツールが見逃しています。からダウンロードできます
http://www.florencesoft.com/Excel-differences-download.html
バージョン管理システムにはオプションまたはボックスがあるので、元のExcelブックと変更されたExcelブックでDiffEngineXを自動的に呼び出すことができます。
バージョン管理にZipコンテナ(.xlsxおよび.xslm)でMicrosoftのExcel XMLを使用してみて、vbaがvbaProject.bin(バージョン管理には役に立たない)に格納されていることがわかったかもしれません。
解決策は簡単です。
スプレッドシートの次のバージョンでこれを繰り返す場合、フォルダーのファイルがZipコンテナー内のファイルと完全に一致するようにする必要があります(削除されたファイルを残さないでください)。
私のニーズを満たすこの質問に対する非常に簡単な解決策を見つけました。すべてのマクロの最後に1行を追加し、実行するたびにマクロコード全体を含む*.txt
ファイルをエクスポートします。コード:
ActiveWorkbook.VBProject.VBComponents("moduleName").Export"C:\Path\To\Spreadsheet\moduleName.txt"
( Tom's Tutorials にあります。これは、これを機能させるために必要なセットアップもカバーしています。)
コードで作業しているときは常にマクロを実行するので、gitが変更を取得することが保証されます。唯一の迷惑な部分は、以前のバージョンをチェックアウトする必要がある場合、*.txt
からスプレッドシートに手動でコピー/貼り付けする必要があることです。
OPの質問のポイント1と4だけを解決するGitHubプロジェクトを次に示します。 https://github.com/ColmBhandal/VbaMisc 。 VBAモジュールのみのVCソリューションです。 GitHubに表示されるプロジェクト構造を複製し、VCの下に配置するモジュールをExportImportモジュールで定義されたwhiteListに追加することにより、任意のプロジェクトに簡単に調整できます。そのモジュールは、VBAモジュールのホワイトリストのエクスポートとインポートを制御し、潜在的に自身を含む。使用方法については、GitHubリポジトリをご覧ください。
私の会社はMicrosoft Officeソリューションの自動化にかなりの量の作業を行っているため、テンプレートが保存されるたびにソリューションのソースをエクスポートする.DLLを作成しました。テンプレートが保存されているフォルダーの子としてSourceという名前のフォルダーを作成し、ソースの下にVBAプロジェクトと同じ名前のフォルダーを作成します。プロジェクトフォルダーでは、モジュール、クラス、ユーザーフォームのすべてのソースコードをエクスポートします。この配置は、テンプレートの大規模なコレクションのソースを簡単に管理できるようにするために選択されました。ローカル構成ファイルまたはグローバル構成ファイルを使用できる場合、DLLはロックされたプロジェクトのロックを解除してVBAプロジェクトにアクセスできます。このツールを使用すると、開発者は自分の心のコンテンツに合わせてテンプレートを作成し、お気に入りのリビジョン管理ツールを使用して作業を管理できます。主に環境でGitを使用し、完全なテンプレートバイナリファイルとVBAリソースをリビジョン管理下に置いています。