Cách tốt nhất để thực hiện Kiểm soát phiên bản cho MS Excel


172

Những hệ thống kiểm soát phiên bản nào bạn đã sử dụng với MS Excel (2003/2007)? Bạn muốn giới thiệu cái gì và tại sao? Những hạn chế nào bạn đã tìm thấy với hệ thống kiểm soát phiên bản được xếp hạng hàng đầu của bạn?

Để đặt điều này trong quan điểm, đây là một vài trường hợp sử dụng:

  1. kiểm soát phiên bản cho các mô-đun VBA
  2. nhiều người đang làm việc trên bảng tính Excel và họ có thể đang thực hiện các thay đổi cho cùng một bảng tính mà họ muốn hợp nhất và tích hợp. Bảng tính này có thể có công thức, dữ liệu, biểu đồ, vv
  3. Người dùng không quá kỹ thuật và các hệ thống kiểm soát phiên bản càng ít được sử dụng thì càng tốt
  4. Hạn chế không gian là một cân nhắc. Lý tưởng nhất là chỉ thay đổi gia tăng được lưu chứ không phải toàn bộ bảng tính Excel.

17
Google Apps / Docs không có đầy đủ chức năng của MS Excel, mà bạn cần thực hiện các công việc nâng cao hơn như tạo mô hình.
TheObserver

25
@Richie Bông. Nếu đó là một lựa chọn thực tế (tức là sử dụng matlab / python) thì TẤT CẢ các công ty tài chính đã thay đổi ngay bây giờ. Yêu cầu những người phân tích các mô hình tài chính nhưng không phải là lập trình viên để trở thành lập trình viên thì hoàn toàn nguy hiểm và thực tế không thực tế.
Loại ẩn danh

1
stackoverflow.com/q/608872/107537 xem câu hỏi tương tự ở đây. Nhưng nó không giải quyết các bảng tính. Chỉ có mã VBA.
Vijay

7
Những người đổ lỗi cho việc lập mô hình Excel cho cuộc khủng hoảng tín dụng rất có thể là những kẻ lừa đảo cố tình bán rác như AAA. Bạn không cần một bảng tính để cho bạn biết một khoản đầu tư là tào lao. Là một người tài chính, tôi có thể nói với bạn sự phụ thuộc hoàn toàn vào bất kỳ mô hình nào là một cách chắc chắn để đánh mất mông của bạn. Hơn nữa, bất kỳ mô hình nào chỉ tốt như những người đã xây dựng chúng. Nếu bạn thuê Morts làm công việc của Einsteins, bạn sẽ có một khoảng thời gian tồi tệ.
Eric J

Nếu bạn hầu như chỉ quan tâm đến việc thực hiện kiểm soát phiên bản trên các macro VBA, hãy xem câu trả lời của tôi tại đây: stackoverflow.com/a/38297505/2146688
Chel

Câu trả lời:


64

Tôi vừa thiết lập một bảng tính sử dụng Bazaar, với việc đăng ký / đăng ký thủ công thông qua TortiseBZR. Cho rằng chủ đề đã giúp tôi với phần tiết kiệm, tôi muốn đăng giải pháp của mình lên đây.

Giải pháp cho tôi là tạo một bảng tính xuất tất cả các mô-đun khi lưu, đồng thời xóa và nhập lại các mô-đun khi mở. Có, điều này có thể nguy hiểm khi chuyển đổi bảng tính hiện có.

Điều này cho phép tôi chỉnh sửa các macro trong các mô-đun thông qua Emacs (có, emacs) hoặc nguyên bản trong Excel và cam kết kho lưu trữ BZR của tôi sau những thay đổi lớn. Bởi vì tất cả các mô-đun là tệp văn bản, các lệnh kiểu khác trong BZR hoạt động cho các nguồn của tôi ngoại trừ chính tệp Excel.

Tôi đã thiết lập một thư mục cho kho lưu trữ BZR của mình, X: \ Data \ MySheet. Trong repo là MySheet.xls và một tệp .vba cho mỗi mô-đun của tôi (ví dụ: Module1Macros). Trong bảng tính của mình, tôi đã thêm một mô-đun được miễn trừ khỏi chu trình xuất / nhập có tên là "VersionControl". Mỗi mô-đun được xuất và nhập lại phải kết thúc bằng "Macro".

Nội dung của mô-đun "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

Tiếp theo, chúng ta phải thiết lập các hook sự kiện để mở / lưu để chạy các macro này. Trong trình xem mã, nhấp chuột phải vào "ThisWorkbook" và chọn "Xem mã". Bạn có thể phải kéo xuống hộp chọn ở đầu cửa sổ mã để thay đổi từ dạng xem "(Chung)" sang dạng xem "Sổ làm việc".

Nội dung của chế độ xem "Workbook":

Private Sub Workbook_Open()

ImportCodeModules

End Sub

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

SaveCodeModules

End Sub

Tôi sẽ giải quyết công việc này trong vài tuần tới và tôi sẽ đăng nếu tôi có bất kỳ vấn đề gì.

Cảm ơn đã chia sẻ mã VBComponent!


5
Khi bạn nhập lại, bạn cũng có thể kiểm tra loại mô-đun. ThisWorkbook.VBProject.VBComponents.Item (i) .Type là 1 cho mô-đun tiêu chuẩn, 2 cho mô-đun lớp, 3 cho mô-đun người dùng và 100 cho mô-đun tài liệu (sổ làm việc hoặc trang tính).
Jon Crowell

4
Có một lỗi trong mã nhập khẩu. Vì bạn đã xóa và nhập các mô-đun, nó sẽ thay đổi thứ tự của các mô-đun để bạn thiếu một vài lần. Bạn cần thay đổi vòng lặp For để đi ngược lại qua mảng. ví dụ: For i = .VBComponents.Count To 1 Bước -1
Tmdean

2
Trong Excel 2013, cần phải bật "Truy cập tin cậy vào mô hình đối tượng dự án VBA" trong Trung tâm tin cậy, nếu không, bạn sẽ gặp Lỗi 1004 rất không hữu ích nếu bạn cố chạy mã này.
Robin Green

8
Kịch bản này ở trên là xa hoàn hảo. Sub phụ importCodeModules () bị lỗi và tạo ra các mô-đun trùng lặp. Hơn nữa, bạn sẽ cần chỉnh sửa từng sổ làm việc để thêm các sự kiện mở và before_save. Điều này là không thể chấp nhận được. Sau khi tìm kiếm trên web trong một thời gian dài, cuối cùng tôi đã tìm thấy thứ gì đó thực sự hoạt động , (đề cập đến ở đây ). Nó có nhập mã, xuất, định dạng mã và nhiều hơn nữa. Việc xuất tự động xảy ra khi lưu và không cần chỉnh sửa bất kỳ sổ làm việc hiện có nào.
CodeKid

5
Đó là một phát hiện tuyệt vời! Tôi đề nghị sử dụng nó hơn là kịch bản của tôi ở trên. Tôi đã viết nó một lần và sử dụng nó trong một thời gian, nó đáp ứng nhu cầu của tôi. Đối với ai đó sử dụng Excel và VBA hàng ngày, một chương trình hoặc dự án dành riêng cho xuất khẩu đó sẽ phù hợp hơn nhiều. Cám ơn vì đã chia sẻ!
Demosthenex

42

TortoiseSVN là một máy khách Windows tốt đáng kinh ngạc cho hệ thống kiểm soát phiên bản Subversion. Một tính năng mà tôi vừa phát hiện ra đó là khi bạn nhấp để nhận khác biệt giữa các phiên bản của tệp Excel, nó sẽ mở cả hai phiên bản trong Excel và tô sáng (màu đỏ) các ô đã được thay đổi. Điều này được thực hiện thông qua sự kỳ diệu của một kịch bản vbs, được mô tả ở đây .

Bạn có thể thấy điều này hữu ích ngay cả khi KHÔNG sử dụng TortoiseSVN.


3
Thật tuyệt vời khi biết TortoiseSVN có thể so sánh như một tính năng tích hợp ^^
Nam G VU

2
Đây có phải là điều tương tự với tập tin Word?
Nam G VU

3
Tôi vừa mới thử nghiệm - điều này cũng có sẵn cho tập tin Word. Thật tuyệt ^^
Nam G VU

Nó dường như không hoạt động cho mã VB. Bất kỳ giải pháp cho điều đó?
manpreet singh

10

Hãy để tôi tóm tắt những gì bạn muốn kiểm soát phiên bản và tại sao:

  1. Gì:

    • Mã (VBA)
    • Bảng tính (Công thức)
    • Bảng tính (Giá trị)
    • Biểu đồ
    • ...
  2. Tại sao:

    • Sổ ghi chép đánh giá
    • Hợp tác
    • So sánh phiên bản ("khác biệt")
    • Sáp nhập

Như những người khác đã đăng ở đây, có một vài giải pháp trên các hệ thống kiểm soát phiên bản hiện có như:

  • Git
  • Không kiên định
  • Lật đổ
  • Chợ

Nếu mối quan tâm duy nhất của bạn là mã VBA trong sổ làm việc của bạn, thì cách tiếp cận Demosthenex ở trên đề xuất hoặc VbaGit ( https://github.com/brucemcpherson/VbaGit ) hoạt động rất tốt và tương đối đơn giản để thực hiện. Ưu điểm là bạn có thể dựa vào các hệ thống kiểm soát phiên bản đã được chứng minh tốt và chọn một hệ thống theo nhu cầu của bạn (hãy xem https://help.github.com/articles/what-are-the-differences-b between-svn- and -git / để so sánh ngắn gọn giữa Git và Subversion).

Nếu bạn không chỉ lo lắng về mã mà còn về dữ liệu trong các trang tính của mình (giá trị "mã hóa cứng" và kết quả công thức), bạn có thể sử dụng một chiến lược tương tự cho việc đó: Sắp xếp các nội dung của trang tính của bạn thành một số định dạng văn bản (thông qua Range.Value) và sử dụng một hệ thống kiểm soát phiên bản hiện có. Đây là một bài đăng blog rất hay về điều này: https://wiki.ucl.ac.uk/display/~ucftpw2/2013/10/18/Using+git+for+version+control+of+s lâysheet+models+-+part + 1 + của + 3

Tuy nhiên, so sánh bảng tính là một vấn đề thuật toán không tầm thường. Có một số công cụ xung quanh, chẳng hạn như So sánh Bảng tính của Microsoft ( https://support.office.com/en-us/article/Overview-of-S Lansheet-Compare-13fafa61-62aa-451b-8674-242ce5f2c986), Exceldiff ( http://exceldiff.arstdesign.com/ ) và DiffEngineX ( https://www.florencesoft.com/compare-excel-workbooks-differences.html ). Nhưng đó là một thách thức khác để tích hợp những so sánh này với một hệ thống kiểm soát phiên bản như Git.

Cuối cùng, bạn phải giải quyết một quy trình công việc phù hợp với nhu cầu của bạn. Để biết quy trình làm việc Git cho Excel đơn giản, được tùy chỉnh, hãy xem https://www.xltrail.com/blog/git-workflow-for-excel .


Cập nhật 2020: nâng cấp cho đề xuất của bạn về xltrail.com/git-xl một tiện ích mở rộng git nguồn mở tạo ra nguồn vba khác nhau giữa các cam kết, mặc dù có giới hạn, giúp tôi tiết kiệm từ nhập và xuất dễ bị lỗi
chingNotCHing

9

Nó phụ thuộc vào việc bạn đang nói về dữ liệu hay mã chứa trong bảng tính. Mặc dù tôi không thích Visual Sourceafe của Microsoft và thường không khuyến nghị nó, nhưng nó tích hợp dễ dàng với cả Access và Excel và cung cấp kiểm soát nguồn của các mô-đun.

[Trong thực tế, việc tích hợp với Access, bao gồm các truy vấn, báo cáo và mô-đun dưới dạng các đối tượng riêng lẻ có thể được phiên bản]

Liên kết MSDN ở đây .


4
Một trong những bí mật được giữ tốt hơn - tôi không biết VSS có thể làm điều đó. +1
Mối quan tâmOfTunbridgeWells

Tôi cũng không biết điều đó. Nhưng dù sao, VSS là một đống s..t và tôi sẽ tránh xa nó.
GUI Junkie

Tôi đã rất phấn khích và dành một giờ để lùng sục mạng vì điều này, nhưng có vẻ như MS đã ngừng hỗ trợ nó trong Excel 2003. Bạn có thể gặp may nếu đó là Access VBA mà bạn đang làm việc, nhưng tôi không nhìn.
thu hoạch316

1
bạn có thể sử dụng bổ trợ phiên bản dành cho nhà phát triển Office?: brandon.fuller.name/archives/2003/11/07/10.26.30
Mitch Wheat

7

Tôi không biết về một công cụ làm tốt điều này nhưng tôi đã thấy một loạt các giải pháp cây nhà lá vườn. Chủ đề chung của những điều này là để giảm thiểu dữ liệu nhị phân dưới sự kiểm soát phiên bản và tối đa hóa dữ liệu văn bản để tận dụng sức mạnh của các hệ thống scc thông thường. Để làm điều này:

  • Đối xử với sổ làm việc như bất kỳ ứng dụng khác. Phân tách logic, cấu hình và dữ liệu.
  • Mã riêng biệt từ bảng tính.
  • Xây dựng giao diện người dùng theo chương trình.
  • Viết một kịch bản xây dựng để xây dựng lại bảng tính.

Tại sao phải trải qua tất cả những điều vô nghĩa này khi tất cả những gì bạn cần là một điều khiển nguồn xử lý các đối tượng nhị phân? SVN có thể làm điều này.
không xác định

15
Bởi vì bạn không thể hợp nhất các đối tượng nhị phân
igelineau

6

Làm việc khi @Demosthenex hoạt động, @Tmdean và @Jon Crowell bình luận vô giá! (+1 chúng)

Tôi lưu các tệp mô-đun trong git \ dir bên cạnh vị trí sổ làm việc. Thay đổi điều đó theo ý thích của bạn.

Điều này sẽ KHÔNG theo dõi các thay đổi đối với mã Workbook. Vì vậy, tùy thuộc vào bạn để đồng bộ hóa chúng.

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

Và sau đó trong mô-đun Workbook:

Private Sub Workbook_Open()

    ImportCodeModules

End Sub

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

    SaveCodeModules

End Sub

6

Đưa câu trả lời của @Demosthenex tiến thêm một bước, nếu bạn cũng muốn theo dõi mã trong các Đối tượng Microsoft Excel và UserForms, bạn phải có một chút khó khăn.

Đầu tiên tôi đã thay đổi SaveCodeModules()chức năng của mình để giải thích cho các loại mã khác nhau mà tôi dự định xuất:

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

UserForms có thể được xuất và nhập giống như mã VBA. Sự khác biệt duy nhất là hai tệp sẽ được tạo khi xuất một biểu mẫu (bạn sẽ nhận được một .frmvà một .frxtệp cho mỗi UserForm). Một trong số này chứa phần mềm bạn đã viết và phần còn lại là tệp nhị phân (tôi khá chắc chắn) xác định bố cục của biểu mẫu.

Microsoft Excel Objects (MEOs) (có nghĩa là Sheet1, Sheet2, ThisWorkbookvv) có thể được xuất ra dưới dạng một .clstập tin. Tuy nhiên, khi bạn muốn lấy lại mã này vào sổ làm việc của mình, nếu bạn cố nhập nó giống như cách bạn sử dụng mô-đun VBA, bạn sẽ gặp lỗi nếu bảng đó đã tồn tại trong sổ làm việc.

Để giải quyết vấn đề này, tôi quyết định không thử nhập tệp .cls vào Excel mà thay vào đó là đọc .clstệp vào excel dưới dạng chuỗi, sau đó dán chuỗi này vào MEO trống. Đây là ImportCodeModules của tôi:

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

Trong trường hợp bạn bối rối bởi dirđầu vào của cả hai chức năng này, đó chỉ là kho lưu trữ mã của bạn! Vì vậy, bạn sẽ gọi các chức năng này như:

SaveCodeModules "C:\...\YourDirectory\Project\source\"
ImportCodeModules "C:\...\YourDirectory\Project\source\"

Lưu ý nhanh: Tôi chưa gặp may mắn khi thực hiện kiểm soát phiên bản thực với UserForms do các tệp nhị phân. Nếu bạn tạo nhiều nhánh trong repo git của mình, bạn có thể không hợp nhất chúng nếu bạn đang làm việc với UserForms
dslosky

5

Tôi sử dụng git và hôm nay tôi đã chuyển cái này (git-xlsx-textconv) sang Python, vì dự án của tôi dựa trên mã Python và nó tương tác với các tệp Excel. Điều này hoạt động với ít nhất các tệp .xlsx , nhưng tôi nghĩ nó cũng hoạt động với .xls . Đây là liên kết github. Tôi đã viết hai phiên bản, một phiên bản có mỗi hàng trên một dòng riêng và một phiên bản trong đó mỗi ô nằm trên một dòng riêng (phiên bản sau được viết vì git diff không muốn bọc các dòng dài theo mặc định, ít nhất là ở đây trên Windows).

Đây là tệp .gitconfig của tôi (điều này cho phép tập lệnh khác nhau nằm trong repo dự án của tôi):

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

nếu bạn muốn tập lệnh có sẵn cho nhiều repos khác nhau, thì hãy sử dụng cái gì đó như thế này:

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

tập tin .gitattribut của tôi :

*.xlsx diff=xlsx

3

Một điều bạn có thể làm là có đoạn trích sau trong Sổ làm việc của bạn:

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

Tôi tìm thấy đoạn trích này trên Internet.

Sau đó, bạn có thể sử dụng Subversion để duy trì kiểm soát phiên bản. Ví dụ: bằng cách sử dụng giao diện dòng lệnh của Subversion với lệnh 'shell' trong VBA. Điều đó sẽ làm điều đó. Tôi thậm chí còn nghĩ đến việc tự làm điều này :)


Tôi nghĩ rằng đây là một cách tiếp cận tuyệt vời. Kiểm soát nguồn của mã Excel chỉ có thể xảy ra khi phân tách. Điều này cũng sẽ suy ra một cách tiếp cận xây dựng. Code Cleaner có thể làm điều này chẳng hạn (phần mềm miễn phí tôi tin) appspro.com/Utilities/CodeCleaner.htm nhưng bằng nhau mã của bạn là tương đương.
polyglot

Tôi đã cố gắng sửa đổi điều này để hoạt động bằng Microsoft® Excel® cho Mac 2011 Phiên bản 14.4.1. Dòng gọi phương thức Xuất lặng lẽ không làm gì cả (bất kể các thư mục OS X được định dạng tốt mà tôi đã sử dụng).
DA Vincent

3

Tôi muốn giới thiệu một công cụ nguồn mở tuyệt vời có tên Rubberduck có phiên bản kiểm soát mã VBA được tích hợp. Hãy thử!


2

Nếu bạn đang xem xét một thiết lập văn phòng với những người dùng không phải là kỹ thuật văn phòng thông thường thì Sharepoint là một lựa chọn khả thi. Bạn có thể thiết lập các thư mục tài liệu với kiểm soát phiên bản được kích hoạt và đăng ký và kiểm tra. Làm cho nó miễn phí cho người dùng văn phòng thường xuyên.


2

để đáp lại câu trả lời của mattlant - sharepoint sẽ hoạt động tốt như điều khiển phiên bản chỉ khi tính năng kiểm soát phiên bản được bật trong thư viện tài liệu. ngoài ra, hãy lưu ý rằng bất kỳ mã nào gọi các tệp khác bằng các đường dẫn tương đối sẽ không hoạt động. và cuối cùng mọi liên kết đến các tệp bên ngoài sẽ bị hỏng khi một tệp được lưu trong sharepoint.


1

Sử dụng bất kỳ công cụ kiểm soát phiên bản tiêu chuẩn nào như SVN hoặc CVS. Hạn chế sẽ phụ thuộc vào mục tiêu. Ngoài sự gia tăng nhỏ về kích thước của kho lưu trữ, tôi không gặp phải bất kỳ vấn đề nào


1

Bạn nên thử DiffEngineX. Nó có thể được gọi theo chương trình và cũng từ dòng lệnh lấy đối số dòng lệnh. Nó không chỉ so sánh các ô bảng tính Excel, mà cả các macro Visual Basic được nhúng trong sổ làm việc. Cũng so sánh các tên và nhận xét được xác định trong Excel, điều mà rất nhiều công cụ phần mềm miễn phí bỏ lỡ. Nó có thể được tải xuống từ

http://www.florencesoft.com/excel-differences-doad.html

Tôi chắc chắn hệ thống kiểm soát phiên bản của bạn có tùy chọn hoặc hộp để bạn có thể tự động gọi DiffEngineX bằng sổ làm việc Excel gốc và đã sửa đổi.


12
Bạn nên đề cập trong câu trả lời của bạn rằng bạn đang liên kết với sản phẩm thương mại này.
Hans Olsson


1

Sau khi tìm kiếm từ lâu và thử nhiều công cụ khác nhau, tôi đã tìm thấy câu trả lời của mình cho vấn đề kiểm soát phiên bản vba tại đây: https://stackoverflow.com/a/25984759/2780179

Đây là một addin excel đơn giản mà mã có thể được tìm thấy ở đây

Không có mô-đun trùng lặp sau khi nhập khẩu. Nó tự động xuất mã của bạn, ngay khi bạn lưu sổ làm việc, mà không sửa đổi bất kỳ sổ làm việc hiện có . Nó đi kèm với một định dạng mã vba.


1

Trên thực tế chỉ có một số giải pháp để theo dõi và so sánh các thay đổi trong mã macro - hầu hết các giải pháp đã được đặt tên ở đây. Tôi đã duyệt web và tìm thấy công cụ mới đáng nói này:

Kiểm soát phiên bản XLTools cho các macro VBA

  • kiểm soát phiên bản cho các bảng Excel và các mô-đun VBA
  • xem trước và thay đổi khác trước khi cam kết một phiên bản
  • tuyệt vời cho công việc cộng tác của một số người dùng trên cùng một tệp (theo dõi ai đã thay đổi những gì / khi / nhận xét)
  • so sánh các phiên bản và đánh dấu các thay đổi trong từng dòng mã
  • phù hợp với người dùng không am hiểu về công nghệ hoặc hiểu biết về Excel cho vấn đề đó
  • lịch sử phiên bản được lưu trữ trong kho Git trên PC của bạn - mọi phiên bản đều có thể được phục hồi dễ dàng

Các phiên bản mã VBA cạnh nhau, các thay đổi được hiển thị


0

Bạn có thể đã thử sử dụng Excel Excel của Microsoft trong bộ chứa zip (.xlsx và .xslm) để kiểm soát phiên bản và thấy vba được lưu trữ trong vbaProject.bin (vô dụng đối với kiểm soát phiên bản).

Giải pháp rất đơn giản.

  1. Mở tệp excel bằng LibreOffice Calc
  2. Trong LibreScript Calc
    1. Tập tin
    2. Lưu thành
    3. Lưu dưới dạng: Bảng tính ODF (.ods)
  3. Đóng LibreScript Calc
  4. đổi tên phần mở rộng tệp của tệp mới từ .ods thành .zip
  5. tạo thư mục cho bảng tính trong khu vực duy trì GIT
  6. giải nén zip vào thư mục GIT của nó
  7. cam kết với GIT

Khi bạn lặp lại điều này với phiên bản tiếp theo của bảng tính, bạn sẽ phải đảm bảo rằng bạn tạo các tệp của thư mục khớp chính xác với các tệp trong thùng chứa zip (và không để lại bất kỳ tệp nào bị xóa).


2
Cách tiếp cận này đầy rủi ro mặc dù. Nếu sau đó bạn sử dụng một tính năng trong Excel không được triển khai trong Libre hoặc không "ánh xạ" thành Libre và quay lại chính xác, phương pháp này sẽ bị hỏng. Điều này sẽ hoạt động, tôi chắc chắn, đối với các bảng tính đơn giản, nhưng phải hết sức cẩn thận. PW
Phil Whittington

0

Ngoài ra còn có một chương trình gọi là Beyond So sánh có so sánh tệp Excel khá đẹp. Tôi tìm thấy một ảnh chụp màn hình bằng tiếng Trung cho thấy ngắn gọn điều này:

Ngoài so sánh - so sánh hai tệp excel (tiếng Trung)
Nguồn hình ảnh gốc

Có 30 ngày dùng thử trên trang của họ


0

Tôi tìm thấy một giải pháp rất đơn giản cho câu hỏi này đáp ứng nhu cầu của tôi. Tôi thêm một dòng vào cuối tất cả các macro của mình để xuất một *.txttệp với toàn bộ mã macro mỗi khi nó được chạy. Mật mã:

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

(Tìm thấy trên Hướng dẫn của Tom , cũng bao gồm một số thiết lập mà bạn có thể cần để thực hiện công việc này.)

Vì tôi sẽ luôn chạy macro bất cứ khi nào tôi làm việc với mã, tôi đảm bảo rằng git sẽ nhận các thay đổi. Phần khó chịu duy nhất là nếu tôi cần kiểm tra phiên bản cũ hơn, tôi phải sao chép / dán thủ công từ *.txtbảng tính.


-1

Nó phụ thuộc vào mức độ tích hợp mà bạn muốn, tôi đã sử dụng Subversion / TortoiseSVN có vẻ tốt cho việc sử dụng đơn giản. Tôi cũng đã thêm vào các từ khóa nhưng dường như có nguy cơ tham nhũng tập tin. Có một tùy chọn trong Subversion để làm cho các thay thế từ khóa cố định và theo như tôi hiểu thì nó sẽ hoạt động nếu độ dài cố định là chẵn nhưng không lẻ. Trong mọi trường hợp bạn không nhận được bất kỳ loại chức năng khác hữu ích, tôi nghĩ rằng có những sản phẩm thương mại sẽ làm 'khác biệt'. Tôi đã tìm thấy một cái gì đó khác biệt dựa trên việc chuyển đổi nội dung sang văn bản thuần túy và so sánh nó, nhưng nó không được tốt lắm.


-1

Nó nên hoạt động với hầu hết các VCS (tùy thuộc vào các tiêu chí khác mà bạn có thể chọn SVN, CVS, Darcs, TFS, v.v.), tuy nhiên, đây thực sự sẽ là tệp hoàn chỉnh (vì đây là định dạng nhị phân), có nghĩa là câu hỏi "thay đổi gì" không dễ để trả lời

Bạn vẫn có thể dựa vào thông điệp tường trình nếu mọi người hoàn thành chúng, nhưng bạn cũng có thể thử các định dạng dựa trên XML mới từ Office 2007 để có được khả năng hiển thị nhiều hơn (mặc dù vẫn khó có thể lướt qua hàng tấn XML, cộng với AFAIK tệp XML được nén trên đĩa, vì vậy bạn sẽ cần một hook pre-commit để giải nén nó để văn bản diff hoạt động chính xác).


-1

Tôi đã viết một bảng tính kiểm soát sửa đổi bằng VBA. Nó được định hướng nhiều hơn cho các báo cáo kỹ thuật nơi bạn có nhiều người làm việc trên Bill Of Material hoặc Lịch trình và sau đó tại một thời điểm nào đó bạn muốn tạo một bản sửa đổi ảnh chụp nhanh hiển thị thêm, xóa và cập nhật từ phiên bản trước.

Lưu ý: đó là một sổ làm việc được bật macro mà bạn cần đăng nhập để tải xuống từ trang web của tôi (bạn có thể sử dụng OpenID)

Tất cả các mã được mở khóa.

Rev Bảng tính được kiểm soát


-1

Công ty của tôi thực hiện một số lượng đáng kể công việc trong việc tự động hóa các giải pháp Microsoft Office vì vậy tôi đã viết một .DLL sẽ xuất nguồn của giải pháp mỗi khi lưu mẫu. Nó tạo một thư mục có tên Source là con của thư mục lưu mẫu và bên dưới Source nó tạo một thư mục có cùng tên với Dự án VBA. Trong thư mục dự án, nó xuất tất cả mã nguồn cho các mô-đun, lớp và biểu mẫu người dùng. Sự sắp xếp này đã được chọn để giúp dễ dàng quản lý nguồn cho các bộ sưu tập mẫu lớn. DLL có thể mở khóa các dự án bị khóa để có quyền truy cập vào dự án VBA nếu bạn có sẵn tệp cấu hình cục bộ hoặc tệp cấu hình toàn cầu. Với công cụ này được sử dụng, các nhà phát triển có thể làm việc trên các mẫu theo nội dung trái tim của họ và sử dụng công cụ kiểm soát sửa đổi yêu thích của họ để quản lý công việc của họ.


Chad - Tôi khuyên bạn nên đọc bài đăng này, trong đó gần đây tôi đã nhận thức được: stackoverflow.com/help/promotion . Câu trả lời của bạn dường như vi phạm "Đừng nói - hiển thị!" Nguyên tắc. Bạn nói về công ty của bạn và một giải pháp mà bạn đã đưa ra và tạo một số tài liệu tham khảo về DLL, nhưng bạn không cho chúng tôi thấy bạn đã làm như thế nào hoặc thậm chí cung cấp quyền truy cập vào DLL. Như vậy, câu trả lời này không nằm trong tinh thần của trang web này.
Colm Bhandal
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.