Cara terbaik untuk melakukan Kontrol Versi untuk MS Excel


172

Sistem kontrol versi apa yang telah Anda gunakan dengan MS Excel (2003/2007)? Apa yang akan Anda rekomendasikan dan Mengapa? Keterbatasan apa yang Anda temukan dengan sistem kontrol versi teratas?

Untuk menempatkan ini dalam perspektif, berikut adalah beberapa kasus penggunaan:

  1. kontrol versi untuk modul VBA
  2. lebih dari satu orang sedang mengerjakan lembar kerja Excel dan mereka mungkin membuat perubahan pada lembar kerja yang sama, yang mereka ingin gabungkan dan integrasikan. Lembar kerja ini mungkin memiliki rumus, data, bagan, dll
  3. para pengguna tidak terlalu teknis dan semakin sedikit sistem kontrol versi yang digunakan, semakin baik
  4. Kendala ruang adalah pertimbangan. Idealnya hanya perubahan bertahap yang disimpan daripada seluruh spreadsheet Excel.

17
Google Apps / Documents tidak memiliki fungsionalitas penuh dari MS Excel, yang perlu Anda lakukan lebih lanjut seperti pemodelan.
TheObserver

25
@Richie Cotton. Jika itu adalah pilihan praktis (yaitu menggunakan matlab / python) maka SEMUA perusahaan keuangan akan berubah sekarang. Meminta orang yang menganalisis model finansial tetapi bukan pemrogram untuk menjadi pemrogram secara keseluruhan penuh dengan bahaya dan secara nyata tidak praktis.
Jenis Anonim

1
stackoverflow.com/q/608872/107537 lihat pertanyaan serupa di sini. Tapi itu tidak membahas lembar kerja sendiri. Hanya kode VBA.
Vijay

7
Mereka yang menyalahkan pemodelan Excel untuk kredit bermasalah kemungkinan besar penipu sengaja menjual sampah sebagai AAA. Anda tidak perlu spreadsheet untuk memberi tahu Anda bahwa investasi itu omong kosong. Menjadi seorang pria keuangan, saya dapat memberitahu Anda ketergantungan penuh pada model apa pun adalah cara yang pasti untuk kehilangan pantat Anda. Selain itu, model apa pun hanya sebagus orang yang membangunnya. Jika Anda menyewa Mort untuk melakukan pekerjaan Einstein, Anda akan memiliki waktu yang buruk.
Eric J

Jika Anda sebagian besar tertarik hanya melakukan kontrol versi pada makro VBA, lihat jawaban saya di sini: stackoverflow.com/a/38297505/2146688
Chel

Jawaban:


64

Saya baru saja menyiapkan spreadsheet yang menggunakan Bazaar, dengan checkin / keluar manual melalui TortiseBZR. Mengingat bahwa topik tersebut membantu saya dengan porsi penyimpanan, saya ingin memposting solusi saya di sini.

Solusi bagi saya adalah membuat spreadsheet yang mengekspor semua modul pada penyimpanan, dan menghapus dan mengimpor kembali modul pada saat terbuka. Ya, ini bisa berpotensi berbahaya untuk mengonversi spreadsheet yang ada.

Ini memungkinkan saya untuk mengedit makro dalam modul melalui Emacs (ya, emacs) atau asli di Excel, dan melakukan repositori BZR saya setelah perubahan besar. Karena semua modul adalah file teks, perintah gaya-diff standar dalam BZR berfungsi untuk sumber saya kecuali file Excel itu sendiri.

Saya telah menyiapkan direktori untuk repositori BZR saya, X: \ Data \ MySheet. Dalam repo adalah MySheet.xls dan satu file .vba untuk masing-masing modul saya (yaitu: Module1Macros). Dalam spreadsheet saya, saya telah menambahkan satu modul yang dikecualikan dari siklus ekspor / impor yang disebut "VersionControl". Setiap modul yang akan diekspor dan diimpor kembali harus diakhiri dengan "Makro".

Isi modul "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

Selanjutnya, kita harus mengatur kait acara untuk buka / simpan untuk menjalankan makro ini. Di penampil kode, klik kanan pada "ThisWorkbook" dan pilih "View Code". Anda mungkin harus menarik ke bawah kotak pilih di bagian atas jendela kode untuk berubah dari tampilan "(Umum)" ke tampilan "Buku Kerja".

Isi tampilan "Buku Kerja":

Private Sub Workbook_Open()

ImportCodeModules

End Sub

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

SaveCodeModules

End Sub

Saya akan menyelesaikan alur kerja ini selama beberapa minggu ke depan, dan saya akan memposting jika saya memiliki masalah.

Terima kasih telah berbagi kode VBComponent!


5
Saat Anda mengimpor kembali, Anda juga dapat memeriksa jenis modul. ThisWorkbook.VBProject.VBComponents.Item (i) .Type adalah 1 untuk modul standar, 2 untuk modul kelas, 3 untuk bentuk pengguna, dan 100 untuk modul dokumen (baik buku kerja atau lembar).
Jon Crowell

4
Ada bug dalam kode impor. Karena Anda dihapus dan mengimpor modul, modul itu mengubah urutan modul sehingga Anda kehilangan beberapa kali. Anda perlu mengubah loop For untuk mundur melalui array. mis. Untuk i = .VBComponents.Count To 1 Step -1
Tmdean

2
Di Excel 2013, Anda perlu mengaktifkan "Percayai akses ke model objek proyek VBA" di Pusat Kepercayaan, jika tidak, Anda mendapatkan Kesalahan 1004 yang sangat tidak membantu jika Anda mencoba menjalankan kode ini.
Robin Green

8
Skrip di atas masih jauh dari sempurna. Sub importCodeModules () buggy dan menghasilkan modul duplikat. Selain itu, Anda harus mengedit setiap buku kerja tunggal untuk menambahkan acara yang terbuka dan yang sebelumnya. Ini tidak bisa diterima. Setelah mencari web untuk waktu yang lama akhirnya saya menemukan sesuatu yang benar - benar berfungsi , (yang merujuk ke sini ). Ini memiliki impor kode, ekspor, pemformatan kode dan banyak lagi. Ekspor terjadi secara otomatis pada save dan tidak perlu mengedit buku kerja yang ada.
CodeKid

5
Itu penemuan yang luar biasa! Saya sarankan menggunakan itu daripada skrip saya di atas. Saya menulisnya sekali dan menggunakannya sebentar, memenuhi kebutuhan saya. Untuk seseorang yang menggunakan Excel dan VBA setiap hari, program atau proyek yang didedikasikan untuk ekspor itu akan jauh lebih tepat. Terima kasih telah berbagi!
Demosthenex

42

TortoiseSVN adalah klien Windows yang sangat baik untuk sistem kontrol versi Subversion. Satu fitur yang baru saja saya temukan yang dimilikinya adalah ketika Anda mengklik untuk mendapatkan perbedaan antara versi file Excel, itu akan membuka kedua versi di Excel dan menyorot (merah) sel-sel yang diubah. Ini dilakukan melalui keajaiban skrip vbs, yang dijelaskan di sini .

Anda mungkin menemukan ini berguna bahkan jika TIDAK menggunakan TortoiseSVN.


3
Sangat luar biasa untuk mengetahui bahwa TortoiseSVN dapat membandingkan sebagai fitur bawaan ^^
Nam G VU

2
Apakah ini sama dengan file Word?
Nam G VU

3
Saya baru saja menguji - ini juga tersedia untuk file Word. Keren ^^
Nam G VU

Tampaknya tidak berfungsi untuk kode VB. Ada solusi untuk itu?
manpreet singh

10

Biarkan saya meringkas apa yang ingin Anda kontrol versi dan mengapa:

  1. Apa:

    • Kode (VBA)
    • Spreadsheet (Rumus)
    • Spreadsheets (Nilai)
    • Bagan
    • ...
  2. Mengapa:

    • Log audit
    • Kolaborasi
    • Perbandingan versi ("diffing")
    • Penggabungan

Seperti yang telah diposting orang lain di sini, ada beberapa solusi di atas sistem kontrol versi yang ada seperti:

  • Git
  • Lincah
  • Subversi
  • Pasar

Jika satu-satunya masalah Anda adalah kode VBA di buku kerja Anda, maka pendekatan yang diusulkan Demosthenex di atas atau VbaGit ( https://github.com/brucemcpherson/VbaGit ) berfungsi dengan sangat baik dan relatif mudah diterapkan. Keuntungannya adalah bahwa Anda dapat mengandalkan sistem kontrol versi yang telah terbukti dan memilih satu sesuai dengan kebutuhan Anda (lihat di https://help.github.com/articles/what-are-the-the-differences-between-svn-and -git / untuk perbandingan singkat antara Git dan Subversion).

Jika Anda tidak hanya khawatir tentang kode tetapi juga tentang data di sheet Anda (nilai-nilai "hardcoded" dan hasil rumus), Anda dapat menggunakan strategi serupa untuk itu: Serialise konten sheet Anda ke dalam beberapa format teks (melalui Range.Value) dan menggunakan sistem kontrol versi yang ada. Berikut ini adalah posting blog yang sangat bagus tentang ini: https://wiki.ucl.ac.uk/display/~ucftpw2/2013/10/18/Menggunakan+git+untuk versiversion+control+ of+ spreadsheet+models+-+part + 1 + dari + 3

Namun, perbandingan spreadsheet adalah masalah algoritme non-sepele. Ada beberapa alat di sekitar, seperti Microsoft's Spreadsheet Compare ( https://support.office.com/en-us/article/Overview-of-S spreadsheet-Compare- 13fafa61-62aa-451b-8674-242ce5f2c986), Exceldiff ( http://exceldiff.arstdesign.com/ ) dan DiffEngineX ( https://www.florencesoft.com/compare-excel-workbooks-differences.html ). Tapi itu tantangan lain untuk mengintegrasikan perbandingan ini dengan sistem kontrol versi seperti Git.

Akhirnya, Anda harus puas dengan alur kerja yang sesuai dengan kebutuhan Anda. Untuk alur kerja Git untuk Excel yang sederhana dan disesuaikan, lihat di https://www.xltrail.com/blog/git-workflow-for-excel .


Pemutakhiran 2020: ditingkatkan untuk saran xltrail.com/git-xl, ekstensi git open source yang menghasilkan perbedaan sumber vba antara komitmen, meskipun terbatas, menyelamatkan saya dari impor dan ekspor rawan kesalahan
chingNotCHing

9

Itu tergantung apakah Anda berbicara tentang data, atau kode yang terkandung dalam spreadsheet. Meskipun saya sangat tidak menyukai Visual Sourcesafe dari Microsoft dan biasanya tidak akan merekomendasikannya, itu memang terintegrasi dengan baik dengan Access dan Excel, dan menyediakan kontrol sumber modul.

[Sebenarnya integrasi dengan Access, termasuk permintaan, laporan, dan modul sebagai objek individual yang dapat diversi]

Tautan MSDN ada di sini .


4
Salah satu rahasia yang lebih baik disimpan - saya tidak tahu VSS bisa melakukan itu. +1
ConcernedOfTunbridgeWells

Saya juga tidak tahu itu. Tapi bagaimanapun, VSS adalah satu tumpukan s .. t dan saya akan menjauh darinya.
GUI Junkie

Saya menjadi bersemangat dan menghabiskan satu jam menjelajahi internet untuk ini, tetapi tampaknya MS berhenti mendukungnya di Excel 2003. Anda mungkin beruntung jika itu adalah Access VBA yang bekerja dengan Anda, tetapi saya tidak melihatnya.
harvest316

1
Anda mungkin dapat menggunakan add-in edisi pengembang Office ?: brandon.fuller.name/archives/2003/11/07/10.26.30
Mitch Wheat

7

Saya tidak mengetahui alat yang melakukan ini dengan baik, tetapi saya telah melihat berbagai solusi buatan sendiri. Utas umum dari ini adalah untuk meminimalkan data biner di bawah kontrol versi dan memaksimalkan data tekstual untuk meningkatkan kekuatan sistem scc konvensional. Untuk melakukan ini:

  • Perlakukan buku kerja seperti aplikasi lainnya. Logika terpisah, konfigurasi dan data.
  • Pisahkan kode dari buku kerja.
  • Bangun UI secara terprogram.
  • Tulis skrip pembuatan untuk merekonstruksi buku kerja.

Mengapa harus melalui semua omong kosong ini padahal yang Anda butuhkan hanyalah kontrol sumber yang menangani objek biner? SVN dapat melakukan ini.
Coder Tidak Diketahui

15
Karena Anda tidak dapat menggabungkan objek biner
igelineau

6

Mengerjakan komentar @Demosthenex, @Tmdean dan @Jon Crowell komentar yang sangat berharga! (Memberi +1 pada mereka)

Saya menyimpan file modul di git \ dir di sebelah lokasi buku kerja. Ubah itu sesuai keinginan Anda.

Ini TIDAK akan melacak perubahan pada kode Buku Kerja. Jadi terserah Anda untuk menyinkronkannya.

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

Dan kemudian dalam modul Workbook:

Private Sub Workbook_Open()

    ImportCodeModules

End Sub

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

    SaveCodeModules

End Sub

6

Mengambil jawaban @Demosthenex selangkah lebih maju, jika Anda juga ingin melacak kode di Microsoft Excel Objects dan UserForms Anda harus sedikit rumit.

Pertama saya mengubah SaveCodeModules()fungsi saya untuk menjelaskan berbagai jenis kode yang saya rencanakan untuk diekspor:

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 dapat diekspor dan diimpor seperti kode VBA. Satu-satunya perbedaan adalah bahwa dua file akan dibuat ketika formulir diekspor (Anda akan mendapatkan .frmdan .frxfile untuk setiap UserForm). Salah satunya memegang perangkat lunak yang Anda tulis dan yang lainnya adalah file biner yang (saya cukup yakin) mendefinisikan tata letak formulir.

Microsoft Excel Objects (Meos) (artinya Sheet1, Sheet2,ThisWorkbook dll) dapat diekspor sebagai .clsfile yang. Namun, saat Anda ingin mendapatkan kode ini kembali ke buku kerja Anda, jika Anda mencoba untuk mengimpornya dengan cara yang sama Anda akan modul VBA, Anda akan mendapatkan kesalahan jika lembar itu sudah ada di buku kerja.

Untuk mengatasi masalah ini, saya memutuskan untuk tidak mencoba mengimpor file .cls ke Excel, tetapi untuk membaca .clsfile menjadi excel sebagai string, kemudian tempelkan string ini ke MEO kosong. Inilah ImportCodeModules saya:

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

Jika Anda bingung dengan dirinput kedua fungsi ini, itu hanyalah repositori kode Anda! Jadi, Anda akan memanggil fungsi-fungsi ini seperti:

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

Catatan singkat: Saya belum beruntung melakukan kontrol versi benar dengan UserForms karena file biner. Jika Anda membuat banyak cabang di git repo Anda, Anda mungkin tidak dapat menggabungkannya jika Anda bekerja dengan UserForms
dslosky

5

Saya menggunakan git , dan hari ini saya porting ini (git-xlsx-textconv) ke Python, karena proyek saya didasarkan pada kode Python, dan itu berinteraksi dengan file Excel. Ini berfungsi setidaknya untuk file .xlsx , tapi saya pikir ini juga akan berfungsi untuk .xls . Inilah tautan github. Saya menulis dua versi, satu dengan setiap baris pada barisnya masing-masing, dan yang lain di mana setiap sel pada barisnya sendiri (yang terakhir ditulis karena git beda tidak suka untuk membungkus garis panjang secara default, setidaknya di sini di Windows).

Ini adalah file .gitconfig saya (ini memungkinkan skrip yang berbeda berada di repo proyek saya):

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

jika Anda ingin skrip tersedia untuk banyak repo yang berbeda, maka gunakan sesuatu seperti ini:

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

.gitattributes sayafile :

*.xlsx diff=xlsx

3

Satu hal yang dapat Anda lakukan adalah memiliki cuplikan berikut di Buku Kerja Anda:

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

Saya menemukan cuplikan ini di Internet.

Setelah itu, Anda bisa menggunakan Subversion untuk mempertahankan kontrol versi. Misalnya dengan menggunakan antarmuka baris perintah Subversion dengan perintah 'shell' dalam VBA. Itu akan berhasil. Saya bahkan berpikir untuk melakukan ini sendiri :)


Saya pikir ini adalah pendekatan yang sangat baik. Kontrol sumber kode Excel hanya dapat terjadi dengan dekomposisi. Ini akan menyimpulkan pendekatan pembangunan juga. Pembersih kode dapat melakukan ini misalnya (freeware saya percaya) appspro.com/Utilities/CodeCleaner.htm tetapi sama-sama kode Anda setara.
polyglot

Saya mencoba memodifikasi ini agar berfungsi menggunakan Microsoft® Excel® untuk Mac 2011 Versi 14.4.1. Baris yang memanggil metode Ekspor diam-diam tidak melakukan apa-apa (terlepas dari direktori OS X yang saya gunakan).
DA Vincent

3

Saya ingin merekomendasikan alat open-source yang hebat yang disebut Rubberduck yang memiliki kontrol versi kode VBA built in. Cobalah!


2

Jika Anda melihat pengaturan kantor dengan pengguna kantor biasa non teknis daripada Sharepoint adalah alternatif yang layak. Anda dapat mengatur folder dokumen dengan kontrol versi diaktifkan dan checkin dan checkout. Jadikan freindlier untuk pengguna kantor biasa.


2

sebagai respons terhadap balasan mattlant - sharepoint akan berfungsi dengan baik sebagai kontrol versi hanya jika fitur kontrol versi dihidupkan di pustaka dokumen. juga perlu diperhatikan bahwa kode apa pun yang memanggil file lain dengan jalur relatif tidak akan berfungsi. dan akhirnya semua tautan ke file eksternal akan terputus ketika file disimpan di sharepoint.


1

Gunakan alat kontrol versi standar seperti SVN atau CVS. Keterbatasan akan tergantung pada apa tujuannya. Terlepas dari peningkatan kecil dalam ukuran repositori, saya tidak menghadapi masalah apa pun


1

Anda harus mencoba DiffEngineX. Ia dapat dipanggil secara terprogram dan juga dari baris perintah dengan argumen baris perintah. Itu tidak hanya membandingkan sel-sel lembar kerja Excel, tetapi juga makro Visual Basic yang tertanam di buku kerja. Juga membandingkan nama dan komentar terdefinisi Excel, yang kehilangan banyak alat freeware. Itu dapat diunduh dari

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

Saya yakin sistem kontrol versi Anda memiliki opsi atau kotak sehingga Anda dapat secara otomatis memanggil DiffEngineX dengan buku kerja Excel Anda yang asli dan yang dimodifikasi.


12
Anda harus menyebutkan dalam jawaban Anda bahwa Anda berafiliasi dengan produk komersial ini.
Hans Olsson


1

Setelah mencari lama dan mencoba berbagai alat, saya menemukan jawaban saya untuk masalah kontrol versi vba di sini: https://stackoverflow.com/a/25984759/2780179

Ini adalah addin excel sederhana yang kodenya dapat ditemukan di sini

Tidak ada modul duplikat setelah mengimpor. Ini mengekspor kode Anda secara otomatis, segera setelah Anda menyimpan buku kerja Anda, tanpa mengubah buku kerja yang ada . Itu datang bersama dengan formatter kode vba.


1

Sebenarnya hanya ada beberapa solusi untuk melacak dan membandingkan perubahan dalam kode makro - sebagian besar sudah disebutkan di sini. Saya telah menjelajahi web dan menemukan alat baru ini yang layak disebut:

Kontrol Versi XLTools untuk makro VBA

  • kontrol versi untuk lembar Excel dan modul VBA
  • pratinjau dan perubahan yang berbeda sebelum melakukan versi
  • bagus untuk kerja kolaboratif dari beberapa pengguna pada file yang sama (trek yang mengubah apa / kapan / komentar)
  • bandingkan versi dan sorot perubahan dalam kode baris demi baris
  • cocok untuk pengguna yang tidak paham teknologi, atau paham Excel
  • riwayat versi disimpan dalam repositori Git di PC Anda sendiri - versi apa pun dapat dengan mudah dipulihkan

Versi kode VBA berdampingan, perubahan divisualisasikan


0

Anda mungkin telah mencoba menggunakan Microsoft Excel XML dalam wadah zip (.xlsx dan .xslm) untuk kontrol versi dan menemukan bahwa vba disimpan di vbaProject.bin (yang tidak berguna untuk kontrol versi).

Solusinya sederhana.

  1. Buka file excel dengan LibreOffice Calc
  2. Dalam LibreOffice Calc
    1. Mengajukan
    2. Simpan sebagai
    3. Simpan sebagai tipe: ODF Spreadsheet (.ods)
  3. Tutup LibreOffice Calc
  4. ganti nama ekstensi file file baru dari .ods menjadi .zip
  5. buat folder untuk spreadsheet di area yang dikelola GIT
  6. ekstrak zip ke folder GIT itu
  7. berkomitmen untuk GIT

Ketika Anda mengulanginya dengan versi spreadsheet berikutnya Anda harus memastikan bahwa Anda membuat file folder persis sama dengan yang ada di wadah zip (dan jangan tinggalkan file yang dihapus).


2
Namun pendekatan ini penuh dengan risiko. Jika Anda kemudian menggunakan fitur di Excel yang tidak diterapkan di Libre atau yang tidak "memetakan" ke Libre dan kembali dengan benar, pendekatan ini akan rusak. Saya yakin ini akan berfungsi untuk spreadsheet sederhana, tetapi harus sangat hati-hati. PW
Phil Whittington

0

Ada juga program yang disebut Beyond Compare yang memiliki perbandingan file Excel yang cukup bagus. Saya menemukan tangkapan layar dalam bahasa Cina yang menunjukkan secara singkat ini:

Beyond Compare - membandingkan dua file excel (Cina)
Sumber gambar asli

Ada uji coba 30 hari di halaman mereka


0

Saya menemukan solusi yang sangat sederhana untuk pertanyaan ini yang memenuhi kebutuhan saya. Saya menambahkan satu baris ke bagian bawah semua makro saya yang mengekspor *.txtfile dengan seluruh kode makro setiap kali dijalankan. Kode:

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

(Ditemukan di Tutorial Tom , yang juga mencakup beberapa pengaturan yang mungkin Anda perlukan agar ini berfungsi.)

Karena saya akan selalu menjalankan makro setiap kali saya mengerjakan kode, saya dijamin bahwa git akan mengambil perubahan. Satu-satunya bagian yang mengganggu adalah bahwa jika saya perlu checkout versi sebelumnya, saya harus secara manual menyalin / menempelkannya *.txtke dalam spreadsheet.


-1

Tergantung pada tingkat integrasi yang Anda inginkan, saya telah menggunakan Subversion / TortoiseSVN yang tampaknya baik untuk penggunaan sederhana. Saya juga menambahkan kata kunci tetapi tampaknya ada risiko korupsi file. Ada opsi di Subversion untuk membuat penggantian kata kunci panjang tetap dan sejauh yang saya mengerti itu akan berfungsi jika panjang tetapnya genap tetapi tidak aneh. Dalam hal apa pun Anda tidak mendapatkan fungsionalitas dif yang berguna, saya pikir ada produk komersial yang akan melakukan 'diff'. Saya memang menemukan sesuatu yang tidak berdasarkan konversi barang menjadi teks biasa dan membandingkannya, tapi itu tidak terlalu bagus.


-1

Ini harus bekerja dengan sebagian besar VCS (tergantung pada kriteria lain Anda dapat memilih SVN, CVS, Darcs, TFS, dll), namun itu sebenarnya akan menjadi file lengkap (karena ini adalah format biner), yang berarti bahwa pertanyaan "apa yang diubah" adalah tidak begitu mudah dijawab.

Anda masih dapat mengandalkan pesan log jika orang melengkapinya, tetapi Anda juga dapat mencoba format berbasis XML baru dari Office 2007 untuk mendapatkan lebih banyak visibilitas (meskipun masih sulit untuk menyiangi melalui banyak XML, ditambah AFAIK file XML) zip pada disk, jadi Anda akan memerlukan kait pra-komit untuk unzip agar diff teks berfungsi dengan benar).


-1

Saya menulis revisi spreadsheet terkontrol menggunakan VBA. Ini lebih diarahkan untuk laporan teknik di mana Anda memiliki banyak orang yang mengerjakan Bill Of Material atau Schedule dan kemudian pada suatu saat Anda ingin membuat revisi snapshot yang menunjukkan penambahan, del, dan pembaruan dari rev sebelumnya.

Catatan: ini adalah buku kerja berkemampuan makro yang harus Anda masuk untuk mengunduh dari situs saya (Anda dapat menggunakan OpenID)

Semua kode tidak terkunci.

Rev Spreadsheet Terkendali


-1

Perusahaan saya melakukan banyak pekerjaan dalam mengotomatisasi solusi Microsoft Office, jadi saya menulis .DLL yang akan mengekspor sumber solusi setiap kali templat disimpan. Itu membuat folder bernama Sumber sebagai anak dari folder di mana template disimpan, dan di bawah Sumber itu membuat folder dengan nama yang sama dengan Proyek VBA. Dalam folder proyek itu mengekspor semua kode sumber untuk modul, kelas, dan formulir pengguna. Pengaturan ini dipilih untuk memudahkan mengelola sumber untuk koleksi template yang besar. DLL dapat membuka kunci proyek yang dikunci untuk mendapatkan akses ke proyek VBA jika Anda memiliki file konfigurasi lokal atau file konfigurasi global yang tersedia. Dengan alat ini digunakan, para pengembang dapat mengerjakan templat sesuai isi hati mereka dan menggunakan alat kontrol revisi favorit mereka untuk mengelola pekerjaan mereka.


Chad - Saya sarankan membaca posting ini, yang saya baru-baru ini dibuat sadar: stackoverflow.com/help/promotion . Jawaban Anda tampaknya melanggar "Jangan katakan - tunjukkan!" Anda berbicara tentang perusahaan Anda dan solusi yang Anda buat, dan membuat sejumlah referensi ke DLL, tetapi Anda tidak menunjukkan kepada kami bagaimana Anda melakukannya atau bahkan menyediakan akses ke DLL. Dengan demikian, jawaban ini tidak sesuai semangat situs web ini.
Colm Bhandal
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.