MS Excel için Sürüm Kontrolü yapmanın en iyi yolu


172

MS Excel (2003/2007) ile hangi sürüm kontrol sistemlerini kullandınız? Ne önerirsiniz ve neden? En yüksek puanlı sürüm kontrol sisteminizde ne gibi sınırlamalar buldunuz?

Bunu perspektife sokmak için, birkaç kullanım örneği:

  1. VBA modülleri için sürüm kontrolü
  2. bir Excel elektronik tablosu üzerinde birden fazla kişi çalışıyor ve birleştirmek ve entegre etmek istedikleri aynı çalışma sayfasında değişiklikler yapıyor olabilirler. Bu çalışma sayfasında formül, veri, grafik vb. Olabilir.
  3. kullanıcılar çok teknik değildir ve ne kadar az sürüm kontrol sistemi o kadar iyi kullanılır
  4. Alan kısıtı bir husustur. İdeal olarak, Excel elektronik tablosunun tamamı yerine yalnızca artımlı değişiklikler kaydedilir.

17
Google Apps / Dokümanlar, modelleme gibi daha gelişmiş işler yapmanız gereken MS Excel'in tam işlevselliğine sahip değildir.
TheObserver

25
@Richie Cotton. Bu pratik bir seçenek olsaydı (yani matlab / python kullanarak), o zaman TÜM finansal şirketler artık değişmiş olacaktı. Finansal modelleri analiz eden ancak programcı olmayan insanlara sormak, bütünüyle tehlike altındadır ve gerçekçi değildir.
Anonim Tip

1
stackoverflow.com/q/608872/107537 benzer soruya buradan bakın. Ancak çalışma sayfalarının kendilerine hitap etmez. Sadece VBA kodu.
Vijay

7
Kredi krizi için Excel modellemesini suçlayanlar, büyük olasılıkla dolandırıcıların kasıtlı olarak AAA olarak önemsiz satıyorlar. Bir yatırımın saçma olduğunu söylemek için bir e-tabloya ihtiyacınız yoktur. Bir finans adamı olarak, herhangi bir modele tam bağımlılığınızı söyleyebilirim, kıçınızı kaybetmenin kesin bir yolu. Dahası, herhangi bir model sadece onları inşa eden insanlar kadar iyidir. Einsteins'in işini yapmak için Morts'u işe alırsanız, kötü zaman geçireceksiniz.
Eric J

Çoğunlukla VBA makrolarında sürüm kontrolü yapmakla ilgileniyorsanız, cevabımı buraya bakın: stackoverflow.com/a/38297505/2146688
Chel

Yanıtlar:


64

Ben sadece TortiseBZR üzerinden manuel check-out ile, Bazaar kullanan bir elektronik tablo kurduk. Konunun kaydetme kısmında bana yardımcı olduğu düşünüldüğünde, çözümümü buraya göndermek istedim.

Benim için çözüm, tüm modülleri kaydettikçe dışa aktaran ve açık olarak modülleri kaldıran ve yeniden ithal eden bir e-tablo oluşturmaktı. Evet, bu mevcut e-tabloları dönüştürmek için potansiyel olarak tehlikeli olabilir.

Bu, modüllerdeki makroları Emacs (evet, emacs) veya Excel'de yerel olarak düzenlememe ve büyük değişikliklerden sonra BZR havuzumu işlememe izin veriyor. Tüm modüller metin dosyaları olduğundan, BZR'deki standart fark stili komutlar, Excel dosyasının kendisi dışındaki kaynaklarım için çalışır.

BZR depom X: \ Data \ MySheet için bir dizin ayarladım. Repoda MySheet.xls ve her modülüm için bir .vba dosyası var (örn: Module1Macros). Elektronik tabloma, "VersionControl" adlı dışa aktarma / içe aktarma döngüsünden muaf bir modül ekledim. Dışa aktarılacak ve yeniden içe aktarılacak her modül "Makrolar" ile bitmelidir.

"VersionControl" modülünün içeriği:

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

Sonra, bu makroları çalıştırmak / açmak için olay kancalarını ayarlamamız gerekiyor. Kod görüntüleyicide "ThisWorkbook" u sağ tıklayın ve "Kodu Görüntüle" yi seçin. "(Genel)" görünümden "Çalışma Kitabı" görünümüne geçmek için kod penceresinin üstündeki seçim kutusunu aşağı çekmeniz gerekebilir.

"Çalışma Kitabı" görünümünün içeriği:

Private Sub Workbook_Open()

ImportCodeModules

End Sub

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

SaveCodeModules

End Sub

Önümüzdeki birkaç hafta boyunca bu iş akışına katılacağım ve herhangi bir sorunum olursa göndereceğim.

VBComponent kodunu paylaştığınız için teşekkür ederiz!


5
Yeniden içe aktarırken, modül türünü de kontrol edebilirsiniz. ThisWorkbook.VBProject.VBComponents.Item (i) .Tipi, standart bir modül için 1, sınıf modülü için 2, kullanıcı formu için 3 ve belge modülü (çalışma kitabı veya çalışma sayfası) için 100'dür.
Jon Crowell

4
İçe aktarma kodunda bir hata var. Modülleri sildiğiniz ve içe aktardığınız için, modüllerin sırasını değiştirir, böylece her seferinde birkaç eksik kalırsınız. Dizide geriye gitmek için For döngüsünü değiştirmeniz gerekir. Örneğin, i = .VBComponents. 1 Adım -1'e kadar
Tmdean

2
Excel 2013'te Güven Merkezi'nde "VBA proje nesnesi modeline güven erişimi" ni etkinleştirmeniz gerekir, aksi takdirde bu kodu çalıştırmayı denerseniz çok yardımcı olmayan bir Hata 1004 alırsınız.
Robin Green

8
Yukarıdaki senaryo mükemmel olmaktan uzak. İmportCodeModules () alt aracı hatalıdır ve yinelenen modüller üretir. Ayrıca, açık ve kaydetme öncesi etkinliklerini eklemek için her çalışma kitabını düzenlemeniz gerekir. Bu kabul edilemez. Uzun uzun süre internette arama yaptıktan sonra nihayet o şey buldum gerçekten çalışıyor (atıfta burada ). Kod içe aktarma, dışa aktarma, kod biçimlendirme ve daha fazlasına sahiptir. Dışa aktarma, kayıt sırasında otomatik olarak gerçekleşir ve mevcut çalışma kitaplarını düzenlemenize gerek yoktur.
CodeKid

5
Mükemmel bir keşif! Yukarıdaki senaryom yerine bunu kullanmanızı öneririm. Bir kez yazdım ve bir süre kullandım, ihtiyaçlarımı karşıladı. Günlük olarak Excel ve VBA kullanan biri için, bu dışa aktarmaya adanmış bir program veya proje çok daha uygun olacaktır. Paylaşım için teşekkürler!
Demosthenex

42

TortoiseSVN , Subversion sürüm kontrol sistemi için şaşırtıcı derecede iyi bir Windows istemcisidir. Az önce keşfettiğim bir özellik, bir Excel dosyasının sürümleri arasında bir fark elde etmek için tıkladığınızda, Excel'de her iki sürümü de açacak ve değiştirilen hücreleri vurgulayacaktır. Bu, burada açıklanan bir vbs komut dosyasının büyüsü ile yapılır .

TortoiseSVN kullanmadığınızda bile bunu yararlı bulabilirsiniz.


3
TortoiseSVN'nin yerleşik bir özellik olarak karşılaştırabileceğini bilmek çok şaşırtıcı ^^
Nam G VU

2
Bu Word dosyası ile aynı şey mi?
Nam G VU

3
Sadece test ettim - bu Word dosyası için de mevcut. Serin ^^
Nam G VU

VB kodu için çalışmıyor gibi görünüyor. Bunun için bir çözüm var mı?
manpreet singh

10

Sürüm kontrolü neyi istediğinizi ve nedenini özetleyeyim:

  1. Ne:

    • Kod (VBA)
    • E-tablolar (Formüller)
    • E-tablolar (Değerler)
    • Grafikler
    • ...
  2. Neden:

    • Denetim günlüğü
    • İşbirliği
    • Sürüm karşılaştırması ("farklı")
    • birleştirme

Diğerlerinin burada yayınladığı gibi, mevcut sürüm kontrol sistemlerinin üstünde aşağıdaki gibi birkaç çözüm var:

  • Git
  • cıvalı
  • yıkılma
  • Çarşı

Tek endişeniz çalışma kitaplarınızdaki VBA koduysa, yukarıdaki Demosthenex yaklaşımı veya VbaGit ( https://github.com/brucemcpherson/VbaGit ) yaklaşımı çok iyi çalışır ve uygulanması nispeten kolaydır. Avantajları, kanıtlanmış sürüm kontrol sistemlerine güvenebileceğiniz ve ihtiyaçlarınıza göre birini seçebilmenizdir ( https://help.github.com/articles/what-are-the-differences-between-svn-and adresine bir göz atın. -git / Git ve Subversion arasında kısa bir karşılaştırma için).

Yalnızca kod hakkında değil, aynı zamanda sayfalarınızdaki verilerle de ("kodlanmış" değerler ve formül sonuçları) ilgili endişeleriniz varsa, bunun için benzer bir strateji kullanabilirsiniz: Sayfalarınızın içeriğini bir metin biçiminde seri haline getirin (Range.Value aracılığıyla) ve mevcut bir sürüm kontrol sistemini kullanın. İşte bununla ilgili çok iyi bir blog yazısı: https://wiki.ucl.ac.uk/display/~ucftpw2/2013/10/18/Using+git+for+version+control+of+spreadsheet+models+-+part + 1 + ait + 3

Ancak, e-tablo karşılaştırması önemsiz olmayan bir algoritmik sorundur. Microsoft'un Elektronik Tablo Karşılaştırması ( https://support.office.com/en-us/article/Overview-of-Spreadsheet-Compare-13fafa61-62aa-451b-8674-242ce5f2c986 ), Exceldiff ( http://exceldiff.arstdesign.com/ ) ve DiffEngineX ( https://www.florencesoft.com/compare-excel-workbooks-differences.html ). Ancak bu karşılaştırmayı Git gibi bir sürüm kontrol sistemiyle entegre etmek başka bir zorluktur.

Son olarak, ihtiyaçlarınıza uygun bir iş akışına karar vermelisiniz. Excel için basit, özel bir Git iş akışı için https://www.xltrail.com/blog/git-workflow-for-excel adresine bakın .


2020 Güncelleme: xltrail.com/git-xl önerisi için onaylandı vba kaynağı üreten bir açık kaynak git uzantısı taahhütler arasında fark olsa da, sınırlı olsa da, beni hata eğilimli ithalat ve ihracattan
kurtarıyor

9

Veriler hakkında mı yoksa bir e-tabloda bulunan koddan mı bahsedeceğinize bağlıdır. Microsoft'un Visual Sourcesafe'inden hoşlanmıyorum ve normalde bunu tavsiye etmememe rağmen, hem Access hem de Excel ile kolayca entegre olur ve modüllerin kaynak kontrolünü sağlar.

[Aslında Access ile entegrasyon, sorgulanabilen tek tek nesneler olarak sorguları, raporları ve modülleri içerir]

MSDN bağlantısı burada .


4
Daha iyi saklanan sırlardan biri - VSS'nin bunu yapabileceğini bilmiyordum. +1
ConcernedOfTunbridgeWells

Ben de bilmiyordum. Neyse, VSS bir yığın s..t ve ben ondan uzak kalmak istiyorum.
GUI Junkie

Tüm heyecanlandım ve bunun için net bir saat harcadım, ancak MS'in Excel 2003'te desteklemeyi bıraktığı anlaşılıyor. Access VBA ile çalışıyorsanız şanslı olabilirsiniz, ama bakmadım.
hasat 311

1
Office geliştirici sürümü eklentisini kullanabilirsiniz ?: brandon.fuller.name/archives/2003/11/07/10.26.30
Mitch Wheat

7

Bunu iyi yapan bir aracın farkında değilim ama çeşitli ev yapımı çözümler gördüm. Bunların ortak konusu, sürüm kontrolü altındaki ikili verileri en aza indirgemek ve geleneksel scc sistemlerinin gücünden yararlanmak için metin verilerini en üst düzeye çıkarmaktır. Bunu yapmak için:

  • Çalışma kitabını başka herhangi bir uygulama gibi ele alın. Ayrı mantık, yapılandırma ve veri.
  • Kodu çalışma kitabından ayırın.
  • Kullanıcı arabirimini programlı olarak oluşturun.
  • Çalışma kitabını yeniden oluşturmak için bir yapı komut dosyası yazın.

İhtiyacınız olan tek şey ikili nesneleri işleyen bir kaynak kontrolü olduğunda neden tüm bu saçmalıklardan geçelim? SVN bunu yapabilir.
Bilinmeyen Kodlayıcı

15
Çünkü ikili nesneleri birleştiremezsiniz
igelineau

6

@Demosthenex çalışması, @Tmdean ve @Jon Crowell üzerinde çalışan çok değerli yorumlar! (+ 1'leyin)

Modül dosyalarını çalışma kitabının yanındaki git \ dir klasörüne kaydediyorum. Bunu beğeninize göre değiştirin.

Bu, Çalışma Kitabı kodundaki değişiklikleri izlemez. Yani onları senkronize etmek size kalmış.

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

Ve sonra Çalışma Kitabı modülünde:

Private Sub Workbook_Open()

    ImportCodeModules

End Sub

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

    SaveCodeModules

End Sub

6

@Demosthenex'in yanıtını bir adım daha ileri götürürseniz, Microsoft Excel Nesnelerinizdeki ve UserForms'unuzdaki kodu da takip etmek istiyorsanız biraz zorlanmanız gerekir.

İlk SaveCodeModules()olarak ihracat yapmayı planladığım farklı kod türlerini hesaba katmak için işlevimi değiştirdim :

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, VBA kodu gibi dışa ve içe aktarılabilir. Tek fark, bir form dışa aktarıldığında iki dosyanın oluşturulmasıdır ( her UserForm için bir .frmve bir .frxdosya alırsınız ). Bunlardan biri yazdığınız yazılımı tutar, diğeri ise (eminim) formun düzenini tanımlayan bir ikili dosyadır.

Microsoft Excel (Meos) (anlam Nesneleri Sheet1, Sheet2, ThisWorkbookvs) bir olarak ihraç edilebilir .clsdosyası. Ancak, bu kodu çalışma kitabınıza geri almak istediğinizde, aynı VBA modülüyle aynı şekilde içe aktarmaya çalışırsanız, bu sayfa çalışma kitabında zaten varsa bir hata alırsınız.

Bu soruna geçici bir çözüm bulmak için, .cls dosyasını Excel'e aktarmamaya karar verdim, ancak dosyayı excel'e .clsbir dize olarak okumaya karar verdim , sonra bu dizeyi boş MEO'ya yapıştırın. İşte benim 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

dirBu işlevlerin her ikisinin de girdisi ile karıştırılırsanız , bu sadece kod deponuzdur! Yani, bu işlevleri şöyle çağırırsınız:

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

Kısa bir not: İkili dosyalar nedeniyle UserForms ile gerçek sürüm denetimi yaparken hiç şansım olmadı. Git
deponuzda

5

Git kullanıyorum ve bugün (git-xlsx-textconv) Python'a taşındım , çünkü projem Python kodunu temel alıyor ve Excel dosyalarıyla etkileşiyor. Bu en azından .xlsx dosyaları için çalışır , ancak bence .xls için de işe yarayacaktır . İşte github bağlantısı. Her biri kendi satırında ve diğeri her hücrenin kendi satırında olduğu iki sürüm yazdım (ikincisi yazılmıştır çünkü git diff varsayılan olarak uzun satırları en azından Windows'ta sarmak istemez).

Bu benim .gitconfig dosyam (bu farklı betiğin projemin deposunda kalmasını sağlar):

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

komut dosyasının birçok farklı depo için kullanılabilir olmasını istiyorsanız, bunun gibi bir şey kullanın:

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

benim .gitattributes dosyam :

*.xlsx diff=xlsx

3

Yapabileceğiniz bir şey, Çalışma Kitabınızda aşağıdaki snippet'e sahip olmaktır:

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

Bu pasajı internette buldum.

Daha sonra, sürüm kontrolünü korumak için Subversion'u kullanabilirsiniz. Örneğin, Subversion komut satırı arabirimini VBA içindeki 'shell' komutuyla kullanmak. Bunu yapardı. Bunu kendim bile yapmayı düşünüyorum :)


Bence bu mükemmel bir yaklaşım. Excel kodunun kaynak denetimi yalnızca ayrışma ile gerçekleşebilir. Bu da bir inşa yaklaşımı anlamına gelir. Kod Temizleyici örneğin bunu yapabilir (freeware inanıyorum) appspro.com/Utilities/CodeCleaner.htm ama eşit derecede kod eşdeğerdir.
polyglot

Mac 2011 için Microsoft® Excel® Sürüm 14.4.1'i kullanmak için bunu değiştirmeye çalıştım. Verme yöntemini sessizce çağıran satır hiçbir şey yapmaz (kullandığım iyi biçimlendirilmiş OS X dizinlerine bakılmaksızın).
DA Vincent


2

Sharepoint'ten daha teknik olmayan normal ofis kullanıcılarına sahip bir ofis ortamına bakıyorsanız uygun bir alternatiftir. Sürüm kontrolü etkin, check-in ve check-out ile belge klasörleri ayarlayabilirsiniz. Normal ofis kullanıcıları için daha serbest hale getirir.


2

mattlant'ın yanıtına yanıt olarak - paylaşım noktası, yalnızca belge kitaplığında sürüm kontrolü özelliği açıksa sürüm kontrolü olarak iyi çalışır. ek olarak, göreli yollarla diğer dosyaları çağıran herhangi bir kodun çalışmayacağını unutmayın. ve son olarak, dosya paylaşma noktasına kaydedildiğinde harici dosyalara olan bağlantılar kesilir.


1

SVN veya CVS gibi standart sürüm kontrol araçlarından herhangi birini kullanın. Sınırlamalar, amacın ne olduğuna bağlı olacaktır. Deponun boyutunda küçük bir artış dışında, herhangi bir sorunla karşılaşmadım


1

DiffEngineX'i denemelisiniz. Programlı olarak ve komut satırı argümanları alan komut satırından da çağrılabilir. Yalnızca Excel elektronik tablo hücrelerini değil, çalışma kitaplarına katıştırılmış Visual Basic makrolarını da karşılaştırır. Ayrıca, birçok ücretsiz aracın kaçırdığı Excel tanımlı adları ve yorumları da karşılaştırır. Şuradan indirilebilir

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

Eminim sürüm kontrol sisteminizde bir seçenek veya kutu vardır, böylece orijinal ve değiştirilmiş Excel çalışma kitaplarınızla otomatik olarak DiffEngineX'i arayabilirsiniz.


12
Cevabınızda, bu ticari ürüne bağlı olduğunuzu belirtmelisiniz.
Hans Olsson


1

Yaşları araştırdıktan ve birçok farklı aracı denedikten sonra, vba sürüm kontrolü sorununa cevabımı burada buldum: https://stackoverflow.com/a/25984759/2780179

Kodun burada bulunabileceği basit bir excel eklentisi

İçe aktarma işleminden sonra yinelenen modül yok. Mevcut çalışma kitaplarınızı değiştirmeden çalışma kitabınızı kaydettiğiniz anda kodunuzu otomatik olarak dışa aktarır . Bir vba kod formatlayıcı ile birlikte gelir.


1

Aslında, makro kodundaki değişiklikleri izlemek ve karşılaştırmak için sadece bir avuç çözüm var - bunların çoğu zaten burada adlandırıldı. Web'e göz atıyorum ve bahsetmeye değer bu yeni araçla karşılaştım:

VBA makroları için XLTools Sürüm Kontrolü

  • Excel sayfaları ve VBA modülleri için sürüm kontrolü
  • bir sürümü çalıştırmadan önce değişiklikleri önizleme ve fark etme
  • aynı dosya üzerinde birden fazla kullanıcının ortak çalışması için harika
  • sürümleri karşılaştırın ve koddaki satır satır değişiklikleri vurgulayın
  • teknoloji meraklısı olmayan kullanıcılar veya Excel meraklısı kullanıcılar için uygun
  • sürüm geçmişi kendi bilgisayarınızda Git deposunda saklanır - herhangi bir sürüm kolayca kurtarılabilir

VBA kodu sürümleri yan yana, değişiklikler görselleştirildi


0

Microsoft'un Excel XML'sini zip kapsayıcısında (.xlsx ve .xslm) sürüm denetimi için kullanmayı denemiş olabilirsiniz ve vba'nın vbaProject.bin'de (sürüm denetimi için işe yaramaz) depolandığını fark etmiş olabilirsiniz.

Çözüm basit.

  1. Excel dosyasını LibreOffice Calc ile açın
  2. LibreOffice Calc bölgesinde
    1. Dosya
    2. Farklı kaydet
    3. Kayıt türü: ODF Elektronik Tablosu (.ods)
  3. LibreOffice Calc'ı kapatın
  4. yeni dosyanın dosya uzantısını .ods yerine .zip olarak yeniden adlandırın
  5. GIT tarafından tutulan bir alanda e-tablo için klasör oluşturma
  6. zip dosyasını GIT klasörüne çıkarın
  7. GIT taahhüdü

Bunu e-tablonun bir sonraki sürümü ile tekrarladığınızda, klasör dosyalarının zip kapsayıcısındaki dosyalarla tam olarak eşleştiğinden emin olun (ve silinen dosyaları geride bırakmayın).


2
Ancak bu yaklaşım riskle doludur. Daha sonra Excel'de Libre'de uygulanmayan veya Libre ile "eşleşmeyen" ve düzgün bir şekilde geri dönmeyen bir özellik kullanırsanız, bu yaklaşım bozulur. Eminim, basit elektronik tablolar için bu işe yarayacaktır, ancak aşırı dikkat gösterilmelidir. PW
Phil Whittington


0

Bu soruya ihtiyaçlarımı karşılayan çok basit bir çözüm buldum. Makrolarımın *.txther birine, her çalıştırıldığında tüm makro kodunu içeren bir dosyayı veren bir satır ekliyorum . Kod:

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

( Tom'un Tutorials'da bulunur , bu da bunu çalıştırabilmeniz için bazı kurulumları içerir.)

Kod üzerinde çalıştığımda her zaman makroyu çalıştıracağım için, git'in değişiklikleri alacağından eminim. Tek sinir bozucu kısmı, önceki bir sürümü kontrol etmem gerekirse, manuel *.txtolarak e-tabloya kopyalayıp yapıştırmam gerektiğidir.


-1

İstediğiniz entegrasyon düzeyine bağlıdır, basit kullanım için iyi görünen Subversion / TortoiseSVN'yi kullandım. Ayrıca anahtar kelimeler ekledim ama dosya bozulması riski var gibi görünüyor. Subversion'da, anahtar kelime ikamelerini sabit uzunlukta yapmak için bir seçenek var ve anladığım kadarıyla, sabit uzunluk çift olsa da garip değilse işe yarayacaktır. Her durumda yararlı bir fark işlevselliği elde edemezsiniz, bence 'diff' yapacak ticari ürünler var. Ben şeyler düz metne dönüştürme ve karşılaştırma dayalı diff bir şey buldum, ama çok hoş değildi.


-1

Çoğu VCS ile çalışmalıdır (diğer ölçütlere bağlı olarak SVN, CVS, Darcs, TFS, vb.), Ancak aslında tam dosya olacaktır (çünkü bir ikili biçimdir), yani "değişen" sorusu cevaplamak o kadar kolay değil.

Hala günlük mesajları güvenebilirsiniz eğer insanlar onları tamamlamak, ama aynı zamanda yine XML dosyası AFAIK XML ton üzerinden ot zor, artı olsa da (bazı daha iyi gözlemlemek için Office 2007 yeni XML tabanlı biçimleri deneyebilirsiniz diskte sıkıştırılmış olduğundan, metin farkının düzgün çalışması için sıkıştırılmış bir kancaya ihtiyacınız olacaktır).


-1

VBA kullanarak revizyon kontrollü bir elektronik tablo yazdım. Daha çok, Malzeme Listesinde veya Programında çalışan birden fazla kişinin bulunduğu mühendislik raporlarına yöneliktir ve daha sonra bir önceki devirde ekler, del ve güncellemeler gösteren bir anlık görüntü revizyonu oluşturmak istediğinizde.

Not: Sitemden indirmek için oturum açmanız gereken makro özellikli bir çalışma kitabıdır (OpenID kullanabilirsiniz)

Tüm kodların kilidi açılır.

Rev Kontrollü Elektronik Tablo


-1

Şirketim, Microsoft Office çözümlerini otomatikleştirmek için önemli miktarda çalışma yapıyor, bu yüzden bir şablon her kaydedildiğinde bir çözümün kaynağını dışa aktaracak bir .DLL yazdım. Şablonun kaydedildiği klasörün alt öğesi olarak Kaynak adlı bir klasör oluşturur ve Kaynak altında VBA Projesi ile aynı ada sahip bir klasör oluşturur. Proje klasöründe, modüller, sınıflar ve kullanıcı formları için tüm kaynak kodunu dışa aktarır. Bu düzenleme, büyük şablon koleksiyonlarının kaynağını yönetmeyi kolaylaştırmak için seçildi. Yerel bir yapılandırma dosyanız veya genel bir yapılandırma dosyanız varsa DLL, VBA projesine erişmek için kilitli projelerin kilidini açabilir. Kullanımda olan bu araçla, geliştiriciler kalbi içeriğinde şablonlar üzerinde çalışabilir ve çalışmalarını yönetmek için en sevdikleri revizyon kontrol aracını kullanabilirler.


Chad - Yakın zamanda haberdar olduğum bu yayını okumanızı tavsiye ederim: stackoverflow.com/help/promotion . Cevabınız "Söyle - göster!" Şirketiniz ve bulduğunuz bir çözüm hakkında konuşuyorsunuz ve bir DLL'e referanslar yapıyorsunuz, ancak bunu nasıl yaptığınızı veya hatta DLL'e erişim sağladığınızı bize göstermiyorsunuz. Bu nedenle, bu cevap bu web sitesinin ruhunda değildir.
Colm Bhandal
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.