2009-05-11 57 views
8

Có cách nào sạch để trích xuất VBA từ bảng tính và lưu trữ nó trong một kho lưu trữ hay không.Trích xuất VBA từ bảng tính Excel

Bảng tính hầu như không bao giờ thay đổi nhưng VBA thực hiện. Lưu trữ toàn bộ bảng tính trong kho lưu trữ làm cho nó khó khăn để làm khác biệt trên các phiên bản VBA khác nhau để xem những gì mã đã thay đổi và những người thay đổi nó.

Chúng tôi sử dụng VBA 6,5/Excel 2003.

Trả lời

10

Các phiên bản trước của Excel và Access (trước 2003) được hỗ trợ VBA Source Code Phiên bản điều khiển thông qua một add-in. Tôi đã sử dụng tính năng này rất hiệu quả trong Office 2000.

Hỗ trợ trực quan SourceSafe (VSS) cho VBA là dropped with the release of Office 2003, nhưng bổ trợ được chuyển với Nhà phát triển Office XP rõ ràng works with Office 2003.

điều

cơ sở kiến ​​thức Microsoft:

Không mà bạn có thể sử dụng mã này để trích xuất mã VBA (từ here nhưng nó đã mất tích dọn dẹp đối tượng cuối cùng). Đọc trang web cho cẩn thận:

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

trình tốt. Việc bổ sung duy nhất tôi đã thực hiện trước khi tùy chỉnh thói quen này theo nhu cầu của tôi là thêm các dòng mã sau đây trước và sau khi mở. xl.EnableEvents = False WBook = xl.Workbooks.Open (Trim ("SomeFile.xlsm")) xl.EnableEvents = True – chaltahai

1
+0

Tôi nghĩ rằng liên kết đầu tiên chỉ áp dụng cho các phiên bản trước năm 2003 của Office –

+0

Thực ra, cả hai câu hỏi đều khá chung chung, nhưng tôi nghĩ rằng các câu trả lời khác nhau bao gồm tất cả các tùy chọn. – RedBlueThing

+0

@ anonymous-type np :) – RedBlueThing

1

Những câu trả lời khác cho câu hỏi này giải quyết nó khá tốt, nhưng nếu bạn mới bắt đầu viết mã, hãy xem xét VSTO. Nó cung cấp mã được quản lý cho Office, và tốt nhất của tất cả, bạn thậm chí có thể làm điều đó trong C# hoặc bất cứ ngôn ngữ .NET nào. Nó cũng làm việc với Excel 2003, đó là một tiền thưởng, trong trường hợp của bạn.

0

Bạn đã có câu trả lời tuyệt vời, nhưng cho phép tôi thêm một bên.

Bạn hoàn toàn có thể giữ tất cả mã VBA của mình trong bảng tính riêng biệt với (các) bảng tính có chứa dữ liệu. Nếu bạn làm điều này nó có thể làm cho so sánh của bạn dễ dàng hơn.

+0

Bất cứ ai có thể chỉ ra một ví dụ về điều này không? – nekomatic

+0

Hãy xem http://msdn.microsoft.com/en-us/library/aa221273%28office.11%29.aspx trong đó cho thấy cách tạo một sổ làm việc mới tách biệt khỏi sổ làm việc có chứa VBA. – JonnyBoats

+0

Xem thêm http://msdn.microsoft.com/en-us/library/aa221367%28office.11%29.aspx để biết cách mở sổ làm việc hiện có từ VBA. – JonnyBoats

Các vấn đề liên quan