2009-05-11 21 views
8

スプレッドシートからVBAを抽出してリポジトリに保存する明確な方法はありますか。ExcelスプレッドシートからVBAを抽出

スプレッドシートはほとんど変更されませんが、VBAは変更されません。スプレッドシート全体をリポジトリに格納すると、異なるVBAリビジョンにまたがってdiffを実行して、どのコードが変更され、誰が変更したのかを確認することが困難になります。

は、我々は、アドインを経由してVBAソースコードのバージョン管理をサポートExcelと(前2003)アクセスのVBA 6.5 /エクセル2003

答えて

10

以前のバージョンを使用します。

VBAのVisual SourceSafe(VSS)サポートはdropped with the release of Office 2003でしたが、Office XP Developerに同梱されていたアドインは明らかにworks with Office 2003でした。

のマイクロソフトサポート技術情報の記事:

あなたはhereから(VBAコードを抽出するために、このコードを使用することができることを失敗するが、それは行方不明になりました最終的なオブジェクトクリーンアップ)。警告のためのWebページを読む:同様の質問の

option explicit 

Const vbext_ct_ClassModule = 2 
Const vbext_ct_Document = 100 
Const vbext_ct_MSForm = 3 
Const vbext_ct_StdModule = 1 

Main 

Sub Main 
    Dim xl 
    Dim fs 
    Dim WBook 
    Dim VBComp 
    Dim Sfx 
    Dim ExportFolder 

    If Wscript.Arguments.Count <> 1 Then 
     MsgBox "As the only argument, give the FULL path to an XLS file to extract all the VBA from it." 
    Else 

     Set xl = CreateObject("Excel.Application") 
     Set fs = CreateObject("Scripting.FileSystemObject") 

     xl.Visible = true 

     Set WBook = xl.Workbooks.Open(Trim(wScript.Arguments(0))) 

     ExportFolder = WBook.Path & "\" & fs.GetBaseName(WBook.Name) 

     fs.CreateFolder(ExportFolder) 

     For Each VBComp In WBook.VBProject.VBComponents 
      Select Case VBComp.Type 
       Case vbext_ct_ClassModule, vbext_ct_Document 
        Sfx = ".cls" 
       Case vbext_ct_MSForm 
        Sfx = ".frm" 
       Case vbext_ct_StdModule 
        Sfx = ".bas" 
       Case Else 
        Sfx = "" 
      End Select 
      If Sfx <> "" Then 
       On Error Resume Next 
       Err.Clear 
       VBComp.Export ExportFolder & "\" & VBComp.Name & Sfx 
       If Err.Number <> 0 Then 
        MsgBox "Failed to export " & ExportFolder & "\" & VBComp.Name & Sfx 
       End If 
       On Error Goto 0 
      End If 
     Next 

     xl.Quit 

     Set fs = Nothing 
     Set xl = Nothing 

    End If 
End Sub 
+0

作品も(クロスリンクこれらのトピックおよび/または解答?への道があります)。私の必要性に合わせてこのルーチンをカスタマイズする前に私が作成した唯一の追加は、前後に次のコード行を追加することです。 xl.EnableEvents = False WBook = xl.Workbooks.Open(Trim( "SomeFile.xlsm")) xl。EnableEvents = True – chaltahai

1
+0

最初のリンクは2003年以前のバージョンのOfficeにのみ適用されると思います –

+0

実際、両方の質問はかなり一般的ですが、私はさまざまな答えがすべてのオプションをカバーしていると思います。 – RedBlueThing

+0

@ anonymous-type np :) – RedBlueThing

1

この質問に対する他の回答はかなりよく、それに対処し、コードを書こうとしているのであれば、VSTO。それはOffice用のマネージドコードを提供し、何よりもC#や.NET言語があなたの好奇心を掻き立てることでさえも可能です。また、あなたのケースでは、ボーナスであるExcel 2003でも動作します。

0

あなたは既に素晴らしい答えを持っていますが、私は脇に追加することができます。

データを含むスプレッドシートとは別のスプレッドシートにすべてのVBAコードを保存することは可能です。これを行うと比較が楽になるかもしれません。

+0

誰でもこの例を教えてください。 – nekomatic

+0

http://msdn.microsoft.com/en-us/library/aa221273%28office.11​​%29.aspxを参照してください。これは、VBAを含むワークブックとは別の新しいワークブックを作成する方法を示しています。 – JonnyBoats

+0

VBAから既存のブックを開く方法については、http://msdn.microsoft.com/en-us/library/aa221367%28office.11​​%29.aspxも参照してください。 – JonnyBoats

関連する問題