2009-02-12 19 views
6

Khi tôi hiểu nó khi tôi tạo một trang tính Excel với mã VBA mã VBA được lưu dưới dạng nhị phân với trang tính. Do đó, tôi không thể đặt mã vào kiểm soát nguồn theo cách hữu ích, có nhiều nhà phát triển làm việc về các vấn đề, khác biệt rất khó, v.v.Có giải pháp chiến thuật (đọc 'hack') để tránh có mã VBA và trang tính Excel dưới dạng tệp nhị phân không?

Có cách nào vòng này mà không chuyển sang VSTO, COM addins, v.v ... không? Ví dụ. cho bảng để tải tất cả là VBA trong thời gian chạy từ một dịch vụ web, ổ đĩa chia sẻ, vv? Bất kỳ ý tưởng đánh giá cao.

Cảm ơn.

+3

Chỉ cần lưu ý - sổ làm việc thay đổi chương trình mã VBA của họ thường bị gắn cờ là vi-rút ... –

Trả lời

11

Tôi đã viết một loại hệ thống xây dựng cho Excel nhập mã VBA từ tệp nguồn (có thể nhập khẩu vào kiểm soát nguồn, khác biệt, vv). Nó hoạt động bằng cách tạo một tệp Excel mới có chứa mã được nhập, vì vậy nó có thể không hoạt động trong trường hợp của bạn.

Việc xây dựng vĩ mô trông như thế này, tôi lưu nó trong một tập tin gọi là Build.xls:

Sub Build() 
    Dim path As String 
    path = "excelfiles" 

    Dim vbaProject As VBIDE.VBProject 
    Set vbaProject = ThisWorkbook.VBProject 

    ChDir "C:\Excel" 
    ' Below are the files that are imported 
    vbaProject.VBComponents.Import (path & "\something.frm") 
    vbaProject.VBComponents.Import (path & "\somethingelse.frm") 

    Application.DisplayAlerts = False 
    ActiveWorkbook.SaveAs "Output.xls" 
    Application.DisplayAlerts = True 

    Application.Quit 
End Sub 

Bây giờ, những thứ VBIDE có nghĩa là bạn phải nhập khẩu một tài liệu tham khảo được gọi là “Microsoft Visual Basic cho các ứng dụng Khả năng mở rộng 5.3 ", tôi nghĩ

Tất nhiên bạn vẫn có vấn đề với việc phải bắt đầu Excel để xây dựng này có thể được cố định với một kịch bản VB nhỏ:..

currentPath = CreateObject("Scripting.FileSystemObject") _ 
    .GetAbsolutePathName(".") 
filePath = currentPath & "\" & "Build.xls" 

Dim objXL 
Set objXL = CreateObject("Excel.Application") 
With objXL 
    .Workbooks.Open(filePath) 
    .Application.Run "Build.Build" 
End With 
Set objXL = Nothing 

Ru nning kịch bản trên nên bắt đầu xây dựng tệp Excel mà kết quả đầu ra bảng kết quả. Bạn có thể phải thay đổi một số điều để làm cho nó di chuyển trong hệ thống tập tin. Hi vọng điêu nay co ich!

1

Câu hỏi thú vị ... chúng tôi cũng gặp sự cố với kiểm soát nguồn VBA nhưng chưa bao giờ thực sự có xung quanh để giải quyết vấn đề.

Có phải điều này Microsoft KB article khớp với tiêu chí của bạn không? Mã được đặt trong một tập tin .BAS có thể ở một vị trí quân sự (và tách biệt với .xls).

Như tôi đã nói tôi chưa bao giờ thực sự cố gắng làm điều này nhưng có vẻ như đây có thể là một cách tiếp cận.

+0

FWIW "chúng tôi cũng gặp sự cố với điều khiển nguồn VBS" nên đã đọc "chúng tôi cũng gặp sự cố với điều khiển nguồn VBA" – shearichard

3

Tôi thực sự khuyên bạn không nên thử tải VBA khi chạy. VBIDE tự động là flaky lúc tốt nhất và tôi nghĩ rằng bạn sẽ chạy vào khá nhiều bảo trì và hỗ trợ nhức đầu.

Giải pháp của tôi cho điều này là xuất mã peridocally để kiểm soát nguồn dưới dạng tệp văn bản. Tôi cũng sẽ xóa tất cả các mã khỏi xls (xóa hoàn toàn Biểu mẫu, Mô-đun và Mô-đun Lớp và xóa mã trong mô-đun Bảng tính và Sổ làm việc) và chỉ đặt xls này vào điều khiển nguồn.

Việc xây dựng lại từ điều khiển nguồn sẽ buộc phải sử dụng xls 'stub', nhập tất cả Biểu mẫu, Mô-đun và Mô-đun lớp và sao chép và dán vào tất cả mã vào mô-đun Bảng tính và Sổ làm việc.

Trong khi điều này là một quá trình đau đớn, nó đã cho phép kiểm soát mã nguồn phù hợp với tất cả các khả năng bình thường của phân biệt, phân nhánh, vv Thật không may, hầu hết là thủ công. Tôi đã viết một add-in mà tự động một số trong số này, nhưng nó đã nhanh chóng bị tấn công với nhau giải pháp, tức là khá buggy và yêu cầu can thiệp bằng tay. Nếu tôi đã bao giờ quay lại để xem xét lại nó và bắt đầu từ đầu, tôi sẽ cho bạn biết ;-)

0

Tôi cũng khuyên bạn không nên tải khi chạy và tìm tiện ích make.Sau khi tất cả, nếu mã của bạn là dưới sự kiểm soát nguồn sau đó bạn chỉ cần cập nhật sổ làm việc của bạn sau khi cam kết.

Thật không may, không có tiện ích như vậy, hoặc ít nhất không phải là tiện ích mà tôi có thể tìm thấy.

0

Tôi nghĩ rằng so với các lựa chọn thay thế (tức là liên tục xây dựng lại các tệp sổ làm việc Excel) thì sẽ ít phức tạp hơn khi chuyển sang VSTO hoặc COM Addins, sử dụng VBA cho công việc tạo mẫu ánh sáng. Bạn cũng có được lợi ích bổ sung không có dễ dàng mã "hack" nguồn (tức là bạn cần nhiều hơn để đoán mật khẩu dự án VBA)

+0

đây là câu trả lời hay nhất cho một câu hỏi phức tạp. –

0

Con đường ngắn nhất về phía trước đang sử dụng SourceTools.xla addin từ http://www.codeproject.com/KB/office/SourceTools.aspx

cách tiếp cận khác là viết một công cụ tương tự bằng cách sử dụng các ràng buộc COM cho ngôn ngữ lập trình yêu thích của bạn. Một đồng nghiệp của tôi có thể tạo ra một trong Python có thể xuất mọi thứ bao gồm mã VBA, nội dung và công thức bảng và thậm chí cả tài liệu tham khảo VBA vào tệp văn bản và có thể lắp ráp sổ làm việc ra khỏi chúng. Đó cũng là trước định dạng XLSX.

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