Cel mai bun mod de a face controlul versiunilor pentru MS Excel [închis] (Programare, Excel, Controlul Versiunilor)

TheObserver a intrebat.

Ce sisteme de control al versiunilor ați folosit cu MS Excel (2003/2007)? Ce ați recomanda și de ce? Ce limitări ați găsit la sistemul de control al versiunilor cel mai bine cotat?

Pentru a pune lucrurile în perspectivă, iată câteva cazuri de utilizare:

  1. controlul versiunilor pentru modulele VBA
  2. mai multe persoane lucrează la o foaie de calcul Excel și este posibil ca acestea să facă modificări la aceeași foaie de calcul, pe care doresc să le îmbine și să le integreze. Această foaie de calcul poate avea formule, date, diagrame etc.
  3. utilizatorii nu sunt prea tehnici și cu cât se utilizează mai puține sisteme de control al versiunilor, cu atât mai bine.
  4. constrângerile de spațiu sunt un aspect important. În mod ideal, se salvează doar modificările incrementale și nu întreaga foaie de calcul Excel.

Comentarii

    17

  • Google Apps/Docs nu dispune de funcționalitatea completă a MS Excel, de care aveți nevoie pentru a efectua lucrări mai avansate, cum ar fi modelarea. –  > Por TheObserver.
  • 26

  • @Richie Cotton. Dacă aceasta ar fi fost o opțiune practică (adică utilizarea matlab/python), atunci TOATE companiile financiare ar fi trecut deja la această opțiune. A le cere oamenilor care analizează modele financiare, dar care nu sunt programatori, să fie programatori este, în general, plin de pericole și, în mod real, nepractic. –  > Por Tip anonim.
  • stackoverflow.com/q/608872/107537 vezi o întrebare similară aici. Dar nu se referă la foile de lucru în sine. Doar codul VBA. –  > Por Vijay.
  • Cei care dau vina pe modelarea Excel pentru criza creditelor sunt, cel mai probabil, escrocii care vând în mod intenționat gunoaie ca fiind AAA. Nu ai nevoie de o foaie de calcul pentru a-ți spune că o investiție este de rahat. Fiind specialist în finanțe, pot să vă spun că dependența totală de orice model este o cale sigură de a vă pierde fundul. În plus, orice model este la fel de bun ca și oamenii care l-au construit. Dacă angajezi Morts pentru a face munca lui Einstein, vei avea o perioadă proastă. –  > Por Eric J.
  • Dacă te interesează mai ales să faci doar controlul versiunilor pe macro-urile VBA, vezi răspunsul meu aici: stackoverflow.com/a/38297505/2146688 –  > Por Chel.
22 răspunsuri
Demostrex

Tocmai am configurat o foaie de calcul care utilizează Bazaar, cu checkin / out manual prin TortiseBZR. Având în vedere că subiectul m-a ajutat cu partea de salvare, am vrut să postez soluția mea aici.

Soluția pentru mine a fost să creez o foaie de calcul care exportă toate modulele la salvare și elimină și reimportă modulele la deschidere. Da, acest lucru ar putea fi potențial periculos pentru convertirea foilor de calcul existente.

Acest lucru îmi permite să editez macrourile din module prin intermediul Emacs (da, Emacs) sau nativ în Excel, și să-mi comit depozitul BZR după modificări majore. Deoarece toate modulele sunt fișiere text, comenzile standard de tip diff din BZR funcționează pentru sursele mele, cu excepția fișierului Excel în sine.

Am configurat un director pentru depozitul meu BZR, X:DataMySheet. În repo se află MySheet.xls și un fișier .vba pentru fiecare dintre modulele mele (de exemplu: Module1Macros). În foaia mea de calcul am adăugat un modul care este scutit de ciclul de export/import numit „VersionControl”. Fiecare modul care urmează să fie exportat și reimportat trebuie să se termine în „Macros”.

Conținutul modulului „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:ToolsMyExcelMacros" & 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:DataMySheet" & ModuleName & ".vba"
           End If
        End If
    Next i
End With

End Sub

În continuare, trebuie să configurăm cârlige de eveniment pentru deschiderea / salvarea pentru a rula aceste macro-uri. În vizualizatorul de cod, faceți clic dreapta pe „ThisWorkbook” și selectați „View Code”. Este posibil să trebuiască să trageți în jos caseta de selectare din partea de sus a ferestrei de cod pentru a trece de la vizualizarea „(General)” la vizualizarea „Workbook”.

Conținutul vizualizării „Workbook”:

Private Sub Workbook_Open()

ImportCodeModules

End Sub

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

SaveCodeModules

End Sub

Mă voi acomoda la acest flux de lucru în următoarele săptămâni și voi posta dacă voi avea probleme.

Vă mulțumim pentru partajarea codului VBComponent!

Comentarii

  • Când reimportați, puteți verifica și tipul de modul. ThisWorkbook.VBProject.VBComponents.Item(i).Type este 1 pentru un modul standard, 2 pentru un modul de clasă, 3 pentru un formular utilizator și 100 pentru un modul de document (fie registrul de lucru, fie o foaie). –  > Por Jon Crowell.
  • Există o eroare în codul de import. Din moment ce ștergeți și importați module, se schimbă ordinea modulelor, astfel încât de fiecare dată vă lipsesc câteva. Trebuie să modificați bucla For pentru a merge înapoi prin matrice. de exemplu, For i = .VBComponents.Count To 1 Step -1 –  > Por Tmdean.
  • În Excel 2013 este necesar să activați „Trust access to the VBA project object model” (Acces de încredere la modelul de obiect al proiectului VBA) în Trust Center, altfel veți primi o eroare 1004 foarte nefolositoare dacă încercați să executați acest cod. –  > Por Robin Green.
  • Acest script de mai sus este departe de a fi perfect. Subdiviziunea importCodeModules() este eronată și produce module duplicate. În plus, va trebui să editați fiecare registru de lucru în parte pentru a adăuga evenimentele open și before_save. Acest lucru este inacceptabil. După ce am căutat mult timp pe web, am găsit în sfârșit ceva care chiar funcționează, (care se referă la aici). Are import de cod, export, formatare de cod și multe altele. Exportul se întâmplă automat la salvare și nu este nevoie să editați niciun registru de lucru existent. –  > Por CodeKid.
  • E o descoperire excelentă! V-aș sugera să o folosiți mai degrabă decât scriptul meu de mai sus. L-am scris o dată și l-am folosit o vreme, mi-a satisfăcut nevoile. Pentru cineva care folosește zilnic Excel și VBA, un program sau un proiect dedicat acestui export ar fi mult mai potrivit. Vă mulțumim pentru partajare! –  > Por Demosthenex.
mcherm

TortoiseSVN este un client Windows uimitor de bun pentru sistemul de control al versiunilor Subversion. O caracteristică pe care tocmai am descoperit că o are este aceea că, atunci când faceți clic pentru a obține o diferență între versiunile unui fișier Excel, va deschide ambele versiuni în Excel și va evidenția (cu roșu) celulele care au fost modificate. Acest lucru se face prin magia unui script vbs, descris aici.

S-ar putea să vă fie util chiar dacă NU folosiți TortoiseSVN.

Comentarii

  • Este atât de uimitor să știi că TortoiseSVN poate compara ca o caracteristică încorporată ^^ –  > Por Nam G VU.
  • Este același lucru cu fișierul Word? –  > Por Nam G VU.
  • Tocmai am testat – acest lucru este disponibil și pentru fișierul Word. Cool ^^ –  > Por Nam G VU.
  • Nu pare să funcționeze pentru codul VB. Orice soluție pentru asta? –  > Por manpreet singh.
Bjorn Stiel

Permiteți-mi să rezum ceea ce ați dori să controlați prin versiune și de ce:

  1. Ce:

    • Cod (VBA)
    • Foi de calcul (formule)
    • Foi de calcul (valori)
    • Grafice
  2. De ce:

    • Jurnal de audit
    • Colaborare
    • Compararea versiunilor („diffing”)
    • Fuziunea

După cum au postat și alții aici, există câteva soluții pe lângă sistemele de control al versiunilor existente, cum ar fi:

  • Git
  • Mercurial
  • Subversion
  • Bazaar

Dacă singura dvs. preocupare este codul VBA din registrele de lucru, atunci abordarea pe care o propune Demosthenex mai sus sau VbaGit (https://github.com/brucemcpherson/VbaGit) funcționează foarte bine funcționând și sunt relativ simplu de implementat. Avantajele constau în faptul că vă puteți baza pe sisteme de control al versiunilor bine dovedite și puteți alege unul în funcție de nevoile dumneavoastră (aruncați o privire la https://help.github.com/articles/what-are-the-differences-between-svn-and-git/ pentru o scurtă comparație între Git și Subversion).

Dacă nu vă faceți griji doar pentru cod, ci și pentru datele din foile dvs. de calcul (valori „hardcoded” și rezultate ale formulelor), puteți utiliza o strategie similară pentru acestea: Serializați conținutul foilor dvs. într-un anumit format de text (prin Range.Value) și utilizați un sistem de control al versiunilor existent. Iată o postare foarte bună pe blog despre acest lucru: https://wiki.ucl.ac.uk/display/~ucftpw2/2013/10/18/10/18/Using+git+for+version+control+of+spreadsheet+models+-+part+1+of+3

Cu toate acestea, compararea foilor de calcul este o problemă algoritmică non-trivială. Există câteva instrumente, cum ar fi Spreadsheet Compare de la Microsoft (https://support.office.com/en-us/article/Overview-of-Spreadsheet-Compare-13fafa61-62aa-451b-8674-242ce5f2c986), Exceldiff (http://exceldiff.arstdesign.com/) și DiffEngineX (https://www.florencesoft.com/compare-excel-workbooks-differences.html). Dar este o altă provocare să integrezi aceste comparații cu un sistem de control al versiunilor precum Git.

În cele din urmă, trebuie să vă decideți asupra unui flux de lucru care să se potrivească nevoilor dumneavoastră. Pentru un flux de lucru Git simplu și adaptat pentru Excel, aruncați o privire la https://www.xltrail.com/blog/git-workflow-for-excel.

Comentarii

  • Actualizare 2020: upvoted pentru sugestia dvs. de xltrail.com/git-xl o extensie git open source care produce diff de surse vba între comenzi, deși limitată, mă salvează de la importuri și exporturi predispuse la erori –  > Por chingNotCHing.
Mitch Wheat

Depinde dacă este vorba despre date sau despre codul conținut într-o foaie de calcul. Deși am o aversiune puternică față de Visual Sourcesafe de la Microsoft și, în mod normal, nu l-aș recomanda, acesta se integrează cu ușurință atât cu Access, cât și cu Excel, și oferă controlul sursei modulelor.

[De fapt, integrarea cu Access, include interogări, rapoarte și module ca obiecte individuale care pot fi versificate].

Linkul MSDN este aici.

Comentarii

  • Unul dintre cele mai bine păstrate secrete – nu știam că VSS poate face asta. +1 –  > Por ConcernedOfTunbridgeWells.
  • Nici eu nu știam asta. Dar, oricum, VSS este o grămadă de s..t și eu aș sta departe de el. –  > Por GUI Junkie.
  • M-am entuziasmat și am petrecut o oră căutând acest lucru pe net, dar se pare că MS a încetat să îl mai susțină în Excel 2003. S-ar putea să aveți noroc dacă lucrați cu Access VBA, dar eu nu m-am uitat. –  > Por harvest316.
  • s-ar putea să puteți utiliza add-in-ul Office developer edition?: brandon.fuller.name/archives/2003/11/07/10.26.30 –  > Por Mitch Wheat.
Hobbo

Nu am cunoștință de un instrument care să facă acest lucru bine, dar am văzut o varietate de soluții dezvoltate acasă. Elementul comun al acestora este de a minimiza datele binare sub controlul versiunilor și de a maximiza datele textuale pentru a valorifica puterea sistemelor convenționale de scc. Pentru a face acest lucru:

  • Tratați registrul de lucru ca pe orice altă aplicație. Separați logica, configurația și datele.
  • Separați codul de registrul de lucru.
  • Construiți interfața de utilizare în mod programatic.
  • Scrieți un script de construire pentru a reconstrui registrul de lucru.

Comentarii

  • De ce să treci prin toate aceste prostii când tot ce ai nevoie este un control al sursei care gestionează obiecte binare? SVN poate face acest lucru. –  > Por Programator necunoscut.
  • 17

  • Pentru că nu poți fuziona obiecte binare –  > Por igelineau.
przemo_li

Lucrând la munca lui @Demosthenex, @Tmdean și @Jon Crowell comentarii neprețuite! (+1 le)

Salvez fișierele de module în git dir alături de locația cărții de lucru. Schimbați asta după cum vă place.

Acest lucru NU va urmări modificările aduse codului Workbook. Deci depinde de tine să le sincronizezi.

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

Și apoi în modulul Workbook:

Private Sub Workbook_Open()

    ImportCodeModules

End Sub

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

    SaveCodeModules

End Sub

dslosky

Luând răspunsul lui @Demosthenex ‘s un pas mai departe, dacă doriți să urmăriți, de asemenea, codul din Microsoft Excel Objects și UserForms trebuie să deveniți puțin mai complicat.

În primul rând, mi-am modificat SaveCodeModules() pentru a ține cont de diferitele tipuri de cod pe care intenționez să le export:

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 pot fi exportate și importate la fel ca și codul VBA. Singura diferență este că vor fi create două fișiere atunci când un formular este exportat (veți obține un fișier .frm și un fișier .frx pentru fiecare UserForm). Unul dintre acestea conține programul pe care l-ați scris, iar celălalt este un fișier binar care (sunt destul de sigur) definește aspectul formularului.

Obiecte Microsoft Excel (MEO) (adică Sheet1, Sheet2, ThisWorkbook etc.) pot fi exportate ca fișier .cls fișier. Cu toate acestea, atunci când doriți să readuceți acest cod în registrul de lucru, dacă încercați să îl importați în același mod în care ați importa un modul VBA, veți primi o eroare dacă foaia respectivă există deja în registrul de lucru.

Pentru a ocoli această problemă, am decis să nu încerc să import fișierul .cls în Excel, ci să citesc fișierul .cls în Excel sub forma unui șir de caractere, apoi să lipesc acest șir în MEO gol. Iată modulul meu ImportCodeModules:

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

În cazul în care sunteți confuz din cauza dir intrare la ambele funcții, acesta este doar depozitul de coduri! Așadar, ați apela aceste funcții în felul următor:

SaveCodeModules "C:...YourDirectoryProjectsource

ImportCodeModules "C:...YourDirectoryProjectsource

Comentarii

  • O notă rapidă: Nu am avut noroc să fac un adevărat control al versiunilor cu UserForms din cauza fișierelor binare. Dacă creați mai multe ramuri în repo-ul dvs. git, este posibil să nu le puteți fuziona dacă lucrați cu UserForms –  > Por dslosky.
nmz787

Eu folosesc git, iar astăzi am portat asta (git-xlsx-textconv) în Python, deoarece proiectul meu se bazează pe cod Python, iar acesta interacționează cu fișiere Excel. Acest lucru funcționează pentru cel puțin .xlsx dar cred că va funcționa și pentru .xls de asemenea. Iată linkul github. Am scris două versiuni, una cu fiecare rând pe propria linie și alta în care fiecare celulă este pe propria linie (aceasta din urmă a fost scrisă deoarece git diff nu-i place să înfășoare liniile lungi în mod implicit, cel puțin aici pe Windows).

Aceasta este versiunea mea .gitconfig (acest lucru permite ca scriptul diff să locuiască în repo-ul proiectului meu):

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

dacă doriți ca scriptul să fie disponibil pentru mai multe depozite diferite, atunci utilizați ceva de genul acesta:

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

my .gitattributes fișier:

*.xlsx diff=xlsx

GUI Junkie

Un lucru pe care l-ați putea face este să aveți următorul fragment în cartea de lucru:

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

Am găsit acest fragment pe internet.

Ulterior, ați putea utiliza Subversion pentru a menține controlul versiunilor. De exemplu, prin utilizarea interfeței de linie de comandă a Subversion cu comanda „shell” din VBA. Asta ar fi de ajuns. Mă gândesc chiar să fac asta și eu 🙂

Comentarii

  • Cred că aceasta este o abordare excelentă. Controlul sursei codului Excel poate avea loc numai cu descompunerea. Acest lucru ar deduce o abordare de tip build, de asemenea. Code Cleaner poate face acest lucru, de exemplu (cred că este freeware) appspro.com/Utilities/CodeCleaner.htm dar, în egală măsură, codul dumneavoastră este echivalent. –  > Por polyglot.
  • Am încercat să modific acest lucru pentru a funcționa folosind Microsoft® Excel® pentru Mac 2011 versiunea 14.4.1. Linia care apelează metoda Export nu face liniștit nimic (indiferent de directoarele OS X bine formate pe care le-am folosit). –  > Por D A Vincent.
Yuxiang Wang

Aș dori să vă recomand un excelent instrument open-source numit Rubberduck care are încorporat controlul versiunilor de cod VBA. Încercați-l!

mattlant

Dacă aveți în vedere un mediu de birou cu utilizatori obișnuiți, care nu sunt tehnicieni, Sharepoint este o alternativă viabilă. Puteți configura dosare de documente cu controlul versiunilor activat și cu verificări și descărcări. Aceasta îl face mai ușor de utilizat pentru utilizatorii obișnuiți de birou.

SpyJournal

ca răspuns la răspunsul lui mattlant – sharepoint va funcționa bine ca un control al versiunilor numai dacă funcția de control al versiunilor este activată în biblioteca de documente. în plus, fiți conștienți de faptul că orice cod care apelează alte fișiere prin căi relative nu va funcționa. și, în cele din urmă, orice link-uri către fișiere externe se vor întrerupe atunci când un fișier este salvat în sharepoint.

Dheer

Utilizați oricare dintre instrumentele standard de control al versiunilor, cum ar fi SVN sau CVS. Limitările ar depinde de obiectivul urmărit. În afară de o mică creștere a dimensiunii depozitului, nu am întâmpinat nicio problemă.

Jim Slavens

Am analizat și eu acest aspect. Se pare că cea mai recentă versiune Team Foundation Server 2010 ar putea avea un Excel Add-In.

Iată un indiciu:

http://team-foundation-server.blogspot.com/2009/07/tf84037-there-was-problem-initializing.html

Comentarii

  • TFS utilizează foarte mult Excel în raportarea elementelor de lucru, ceea ce nu are legătură cu introducerea fișierelor Excel în controlul sursei, din păcate. –  > Por Brad R.
CodeKid

După ce am căutat mult timp și am încercat multe instrumente diferite, am găsit răspunsul meu la problema controlului versiunilor vba aici: https://stackoverflow.com/a/25984759/2780179

Este un simplu addin Excel pentru care codul poate fi găsit aici:

Nu există module duplicate după import. Îți exportă codul automat, imediat ce salvezi registrul de lucru, fără a modifica nicio carte de lucru existentă.vine împreună cu un formator de cod vba.

eriklind

De fapt, există doar o mână de soluții pentru a urmări și compara modificările în codul macro – majoritatea au fost deja numite aici. Am navigat pe web și am dat peste acest nou instrument care merită menționat:

XLTools Version Control pentru macro VBA.

  • controlul versiunilor pentru foi Excel și module VBA
  • previzualizare și diferențiere a modificărilor înainte de a confirma o versiune
  • excelent pentru lucrul colaborativ al mai multor utilizatori pe același fișier (urmăriți cine a schimbat ce/când/comentariile)
  • comparați versiunile și evidențiați modificările în cod, linie cu linie
  • potrivit pentru utilizatorii care nu se pricep la tehnologie sau la Excel, de altfel
  • istoricul versiunilor este stocat în depozitul Git de pe propriul PC – orice versiune poate fi recuperată cu ușurință

versiunile de cod VBA alăturate, modificările sunt vizualizate

Dave Saunders

Este posibil să fi încercat să folosiți Excel XML de la Microsoft în container zip (.xlsx și .xslm) pentru controlul versiunilor și să fi constatat că vba a fost stocat în vbaProject.bin (care este inutil pentru controlul versiunilor).

Soluția este simplă.

  1. Deschideți fișierul Excel cu LibreOffice Calc
  2. În LibreOffice Calc
    1. Fișier
    2. Salvați ca
    3. Salvați ca tip: Foaie de calcul ODF (.ods)
  3. Închideți LibreOffice Calc
  4. redenumiți extensia de fișier a noului fișier din .ods în .zip
  5. creați un dosar pentru foaia de calcul într-o zonă menținută de GIT
  6. extrageți fișierul zip în dosarul GIT al acestuia
  7. confirmați în GIT

Când repetați acest lucru cu următoarea versiune a foii de calcul, va trebui să vă asigurați că faceți ca fișierele din dosar să corespundă exact cu cele din containerul zip (și nu lăsați în urmă niciun fișier șters).

Comentarii

  • Totuși, această abordare este plină de riscuri. Dacă utilizați ulterior o funcție din Excel care fie nu este implementată în Libre, fie nu este „mapată” corect în Libre și înapoi, această abordare se va întrerupe. Acest lucru va funcționa, sunt sigur, pentru foi de calcul simple, dar trebuie să se acorde o atenție extremă. PW –  > Por Phil Whittington.
mana

Există, de asemenea, un program numit Beyond Compare care are o comparație destul de bună a fișierelor Excel. Am găsit o captură de ecran în chineză care arată pe scurt acest lucru:


Sursa imaginii originale

Există o perioadă de probă de 30 de zile pe site-ul lor pagina

LShaver

Am găsit o soluție foarte simplă la această întrebare care îmi satisface nevoile. Adaug o linie în partea de jos a tuturor macrourilor mele care exportă o linie *.txt fișier cu întregul cod al macrocomenzii de fiecare dată când este rulată. Codul:

ActiveWorkbook.VBProject.VBComponents("moduleName").Export"C:PathToSpreadsheetmoduleName.txt"

(Găsit pe Tutoriale ale lui Tom, care acoperă, de asemenea, unele configurări de care este posibil să aveți nevoie pentru a face acest lucru să funcționeze).

Deoarece voi rula întotdeauna macroul ori de câte ori lucrez la cod, am garanția că git va prelua modificările. Singura parte enervantă este că, dacă am nevoie să verific o versiune anterioară, trebuie să copiez/lipesc manual de la *.txt în foaia de calcul.

Ian Hopkinson

Depinde de nivelul de integrare pe care îl doriți, eu am folosit Subversion/TortoiseSVN, care pare să fie bun pentru o utilizare simplă. Am adăugat, de asemenea, cuvinte cheie, dar pare să existe riscul de corupere a fișierelor. Există o opțiune în Subversion pentru a face ca substituțiile cuvintelor cheie să aibă o lungime fixă și, din câte am înțeles, va funcționa dacă lungimea fixă este pară, dar nu și impară. În orice caz, nu obțineți niciun fel de funcționalitate utilă de diff, cred că există produse comerciale care vor face „diff”. Am găsit ceva care face diferențe pe baza convertirii lucrurilor în text simplu și a comparării, dar nu era foarte frumos.

Pantera cenușie

Ar trebui să funcționeze cu majoritatea VCS-urilor (în funcție de alte criterii, ați putea alege SVN, CVS, Darcs, TFS, etc.), însă va fi de fapt fișierul complet (deoarece este un format binar), ceea ce înseamnă că întrebarea „ce s-a schimbat” nu este atât de ușor de răspuns.

Vă puteți baza în continuare pe mesajele de jurnal dacă oamenii le completează, dar ați putea încerca, de asemenea, noile formate bazate pe XML de la Office 2007 pentru a obține mai multă vizibilitate (deși ar fi în continuare greu de selectat printre tonele de XML, în plus, AFAIK, fișierul XML este comprimat pe disc, astfel încât ați avea nevoie de un cârlig precommit pentru a-l descompune pentru ca diferențierea textului să funcționeze corect).

Nate

Am scris o foaie de calcul cu revizuire controlată folosind VBA. este orientată mai mult pentru rapoarte de inginerie în care aveți mai multe persoane care lucrează la o listă de materiale sau la un program și apoi, la un moment dat, doriți să creați o revizuire instantanee care să arate adăugările, eliminările și actualizările din revizia anterioară.

Notă: este un registru de lucru activat de macro-uri pe care trebuie să vă conectați pentru a-l descărca de pe site-ul meu (puteți utiliza OpenID)

Tot codul este deblocat.

Foaie de calcul controlată de Rev