วิธีที่ดีที่สุดในการควบคุมเวอร์ชันสำหรับ MS Excel


172

คุณใช้ระบบควบคุมรุ่นใดกับ MS Excel (2003/2007) คุณจะแนะนำอะไรและทำไม คุณพบข้อ จำกัด อะไรบ้างกับระบบควบคุมเวอร์ชันยอดนิยมของคุณ

หากต้องการระบุในมุมมองต่อไปนี้เป็นกรณีการใช้งานสองกรณี:

  1. การควบคุมเวอร์ชันสำหรับโมดูล VBA
  2. มีมากกว่าหนึ่งคนกำลังทำงานกับสเปรดชีต Excel และพวกเขาอาจทำการเปลี่ยนแปลงในแผ่นงานเดียวกันซึ่งพวกเขาต้องการผสานและรวมเข้าด้วยกัน แผ่นงานนี้อาจมีสูตรข้อมูลแผนภูมิ ฯลฯ
  3. ผู้ใช้ไม่ได้มีความรู้ด้านเทคนิคมากเกินไปและระบบควบคุมเวอร์ชันที่น้อยกว่าก็ใช้งานได้ดีกว่า
  4. ข้อ จำกัด ของพื้นที่คือการพิจารณา เป็นการดีที่จะบันทึกเฉพาะการเปลี่ยนแปลงที่เพิ่มขึ้นแทนที่จะบันทึกสเปรดชีต Excel ทั้งหมด

17
Google Apps / เอกสารไม่มีฟังก์ชันการทำงานเต็มรูปแบบของ MS Excel ซึ่งคุณต้องทำงานขั้นสูงเช่นการสร้างแบบจำลอง
TheObserver

25
@Richie Cotton ถ้านั่นเป็นตัวเลือกที่ใช้งานได้จริง (เช่นใช้ matlab / python) บริษัท การเงินทั้งหมดก็จะเปลี่ยนไปในตอนนี้ การถามผู้คนที่วิเคราะห์แบบจำลองทางการเงิน แต่ไม่ใช่โปรแกรมเมอร์ที่จะเป็นโปรแกรมเมอร์นั้นเต็มไปด้วยอันตรายและไม่สามารถใช้งานได้จริง
ประเภทที่ไม่ระบุชื่อ

1
stackoverflow.com/q/608872/107537ดูคำถามที่คล้ายกันที่นี่ แต่มันไม่ได้อยู่ที่แผ่นงานเอง เฉพาะรหัส VBA
วีเจย์

7
ผู้ที่กล่าวโทษการสร้างแบบจำลองของ Excel สำหรับปัญหาสินเชื่อส่วนใหญ่มีแนวโน้มว่าผู้หลอกลวงจะขายขยะโดยเจตนาโดย AAA คุณไม่จำเป็นต้องใช้สเปรดชีตเพื่อบอกคุณว่าการลงทุนนั้นไม่น่าสนใจ ในฐานะที่เป็นนักการเงินฉันสามารถบอกคุณได้ว่าการพึ่งพาตัวเองในทุกรูปแบบเป็นวิธีที่แน่นอนในการสูญเสียตูดของคุณ ยิ่งกว่านั้นโมเดลใด ๆ ก็ดีพอ ๆ กับคนที่สร้างมันขึ้นมา หากคุณจ้าง Morts เพื่อทำงานของ Einsteins คุณจะมีเวลาไม่ดี
Eric J

หากคุณสนใจที่จะทำการควบคุมเวอร์ชันบนมาโคร VBA เป็นส่วนใหญ่ให้ดูคำตอบของฉันที่นี่: stackoverflow.com/a/38297505/2146688
Chel

คำตอบ:


64

ฉันเพิ่งตั้งสเปรดชีตที่ใช้ Bazaar ด้วยการเช็คอินด้วยตนเอง / ผ่าน TortiseBZR เนื่องจากหัวข้อช่วยฉันด้วยส่วนที่บันทึกไว้ฉันต้องการโพสต์โซลูชันของฉันที่นี่

ทางออกสำหรับฉันคือการสร้างสเปรดชีตที่ส่งออกโมดูลทั้งหมดเมื่อบันทึกและลบและนำเข้าโมดูลที่เปิดใหม่ ใช่สิ่งนี้อาจเป็นอันตรายสำหรับการแปลงสเปรดชีตที่มีอยู่

สิ่งนี้ทำให้ฉันสามารถแก้ไขมาโครในโมดูลผ่านEmacs (ใช่, emacs) หรือกำเนิดใน Excel และยืนยันที่เก็บ BZR ของฉันหลังจากการเปลี่ยนแปลงครั้งใหญ่ เนื่องจากโมดูลทั้งหมดเป็นไฟล์ข้อความคำสั่ง diff-style มาตรฐานใน BZR ทำงานสำหรับแหล่งที่มาของฉันยกเว้นไฟล์ Excel เอง

ฉันตั้งค่าไดเรกทอรีสำหรับที่เก็บ BZR ของฉัน X: \ Data \ MySheet ใน repo คือ MySheet.xls และไฟล์. vba หนึ่งไฟล์สำหรับแต่ละโมดูลของฉัน (เช่น: Module1Macros) ในสเปรดชีตของฉันฉันได้เพิ่มหนึ่งโมดูลที่ได้รับการยกเว้นจากวงจรการส่งออก / นำเข้าที่เรียกว่า "VersionControl" แต่ละโมดูลที่จะส่งออกและนำเข้าจะต้องสิ้นสุดใน "มาโคร"

เนื้อหาของโมดูล "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

ต่อไปเราต้องตั้งค่า hooks event เพื่อเปิด / บันทึกเพื่อเรียกใช้มาโครเหล่านี้ ในโปรแกรมดูรหัสให้คลิกขวาที่ "ThisWorkbook" และเลือก "ดูรหัส" คุณอาจต้องดึงกล่องเลือกที่ด้านบนสุดของหน้าต่างรหัสเพื่อเปลี่ยนจากมุมมอง "(ทั่วไป)" เป็นมุมมอง "สมุดงาน"

เนื้อหาของมุมมอง "สมุดงาน":

Private Sub Workbook_Open()

ImportCodeModules

End Sub

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

SaveCodeModules

End Sub

ฉันจะนั่งลงในเวิร์กโฟลว์นี้ในอีกไม่กี่สัปดาห์ข้างหน้าและฉันจะโพสต์หากฉันมีปัญหาใด ๆ

ขอขอบคุณที่แบ่งปันรหัส VBComponent!


5
เมื่อคุณนำเข้าอีกครั้งคุณสามารถตรวจสอบประเภทโมดูลได้ ThisWorkbook.VBProject.VBComponents.Item (i) .Type คือ 1 สำหรับโมดูลมาตรฐาน, 2 สำหรับโมดูลคลาส, 3 สำหรับ userform และ 100 สำหรับโมดูลเอกสาร (ทั้งเวิร์กบุ๊กหรือแผ่นงาน)
Jon Crowell

4
มีข้อบกพร่องในรหัสนำเข้า เนื่องจากคุณถูกลบและนำเข้าโมดูลมันจะเปลี่ยนลำดับของโมดูลเพื่อให้คุณพลาดแต่ละครั้ง คุณต้องเปลี่ยน For loop เพื่อย้อนกลับไปยังอาร์เรย์ เช่นสำหรับ i = .VBComponents.Count ถึง 1 Step -1
Tmdean

2
ใน Excel 2013 มีความจำเป็นต้องเปิดใช้งาน "ความน่าเชื่อถือการเข้าถึงโมเดลวัตถุโครงการ VBA" ในศูนย์ความเชื่อถือมิฉะนั้นคุณจะได้รับข้อผิดพลาดที่ไม่ช่วยเหลือมาก 1004 ถ้าคุณพยายามเรียกใช้รหัสนี้
Robin Green

8
สคริปต์ข้างต้นนี้ยังไม่สมบูรณ์นัก ย่อย importCodeModules () เป็น buggy และสร้างโมดูลที่ซ้ำกัน นอกจากนี้คุณจะต้องแก้ไขเวิร์กบุ๊กทุกเล่มเพื่อเพิ่มกิจกรรมเปิดและก่อนบันทึกเหตุการณ์ นี่เป็นสิ่งที่ยอมรับไม่ได้ หลังจากค้นหาเว็บเป็นเวลานานในที่สุดฉันก็ได้พบสิ่งที่ใช้งานได้จริง (ซึ่งอ้างถึงที่นี่ ) มีการนำเข้ารหัสส่งออกจัดรูปแบบรหัสและอื่น ๆ การส่งออกจะเกิดขึ้นโดยอัตโนมัติเมื่อบันทึกและไม่จำเป็นต้องแก้ไขสมุดงานที่มีอยู่
CodeKid

5
นั่นเป็นการค้นพบที่ยอดเยี่ยม! ฉันขอแนะนำให้ใช้สิ่งนั้นมากกว่าสคริปต์ด้านบน ฉันเขียนมันครั้งหนึ่งและใช้มันซักพักมันก็ตอบสนองความต้องการของฉัน สำหรับคนที่ใช้ Excel และ VBA ทุกวันโปรแกรมหรือโครงการที่ทุ่มเทให้กับการส่งออกนั้นจะเหมาะสมกว่า ขอบคุณสำหรับการแบ่งปัน!
Demosthenex

42

TortoiseSVNเป็นไคลเอนต์ Windows ที่ดีอย่างน่าอัศจรรย์สำหรับระบบควบคุมเวอร์ชันการโค่นล้ม ฟีเจอร์หนึ่งที่ฉันเพิ่งค้นพบว่ามันมีอยู่ก็คือเมื่อคุณคลิกเพื่อรับส่วนต่างระหว่างไฟล์ Excel เวอร์ชันนั้นมันจะเปิดทั้งสองเวอร์ชันใน Excel และไฮไลต์ (สีแดง) เซลล์ที่มีการเปลี่ยนแปลง นี้จะกระทำผ่านความมหัศจรรย์ของสคริปต์ vbs ที่อธิบายไว้ที่นี่

คุณอาจพบว่ามีประโยชน์แม้ว่าจะไม่ได้ใช้ TortoiseSVN


3
น่าอัศจรรย์มากที่รู้ว่า TortoiseSVN สามารถเปรียบเทียบเป็นคุณสมบัติในตัวได้ ^^
Nam G VU

2
นี่เป็นสิ่งเดียวกันกับไฟล์ Word หรือไม่?
Nam G VU

3
ฉันเพิ่งทดสอบ - ไฟล์ Word นี้ยังใช้ได้ Cool ^^
Nam G VU

ดูเหมือนจะไม่ทำงานกับรหัส VB มีทางออกอะไรบ้าง?
manpreet singh

10

ฉันขอสรุปสิ่งที่คุณต้องการควบคุมเวอร์ชันและสาเหตุ:

  1. อะไร:

    • รหัส (VBA)
    • สเปรดชีต (สูตร)
    • สเปรดชีต (ค่า)
    • ชาร์ต
    • ...
  2. ทำไม:

    • บันทึกการตรวจสอบ
    • การทำงานร่วมกัน
    • การเปรียบเทียบรุ่น ("การกระจาย")
    • การผสม

ตามที่คนอื่น ๆ โพสต์ไว้ที่นี่มีวิธีแก้ไขปัญหาสองสามข้อที่ด้านบนของระบบควบคุมเวอร์ชันที่มีอยู่เช่น:

  • Git
  • หลายใจ
  • การโค่นล้ม
  • ตลาด

หากข้อกังวลเพียงอย่างเดียวของคุณคือรหัส VBA ในสมุดงานของคุณดังนั้นแนวทาง Demosthenex ที่เสนอข้างต้นหรือ VbaGit ( https://github.com/brucemcpherson/VbaGit ) ทำงานได้ดีมากและใช้งานง่าย ข้อดีคือคุณสามารถพึ่งพาระบบควบคุมเวอร์ชันที่ผ่านการพิสูจน์แล้วและเลือกหนึ่งระบบตามความต้องการของคุณ (ดูที่https://help.github.com/articles/what-are-the-differences-between-svn-and -git /สำหรับการเปรียบเทียบสั้น ๆ ระหว่าง Git และการโค่นล้ม)

ถ้าคุณไม่เพียง แต่กังวลเกี่ยวกับโค้ด แต่ยังเกี่ยวกับข้อมูลในชีตของคุณ ("hardcoded" ค่าและผลลัพธ์ของสูตร) ​​คุณสามารถใช้กลยุทธ์ที่คล้ายกันสำหรับสิ่งต่อไปนี้: เรียงลำดับเนื้อหาของชีตของคุณในรูปแบบข้อความ (ผ่าน Range.Value) และใช้ระบบควบคุมเวอร์ชันที่มีอยู่ นี่คือโพสต์บล็อกที่ดีมากเกี่ยวกับเรื่องนี้: https://wiki.ucl.ac.uk/display/~ucftpw2/2013/10/18/Using+git+for+version+control+of+spreadsheet+models+-+part + 1 + ของ + 3

อย่างไรก็ตามการเปรียบเทียบสเปรดชีตเป็นปัญหาขั้นตอนวิธีที่ไม่สำคัญ มีเครื่องมือไม่กี่รอบเช่นการเปรียบเทียบสเปรดชีตของ Microsoft ( https://support.office.com/en-us/article/Overview-of-Spreadsheet-Compare-13fafa61-62aa-451b-8674-242ce5f2c986 ), Exceldiff ( http://exceldiff.arstdesign.com/ ) และ DiffEngineX ( https://www.florencesoft.com/compare-excel-workbooks-differences.html ) แต่มันเป็นความท้าทายอีกประการหนึ่งที่จะรวมการเปรียบเทียบเหล่านี้เข้ากับระบบควบคุมเวอร์ชันเช่น Git

ในที่สุดคุณต้องจัดการกับเวิร์กโฟลว์ที่เหมาะสมกับความต้องการของคุณ สำหรับการที่ง่ายและปรับแต่ง Git สำหรับขั้นตอนการทำงานของ Excel มีลักษณะที่https://www.xltrail.com/blog/git-workflow-for-excel


2020 Update: อัปโหลดแล้วสำหรับคำแนะนำของคุณเกี่ยวกับxltrail.com/git-xlส่วนขยาย git แบบโอเพ่นซอร์สที่ผลิตแหล่ง vba ที่แตกต่างกันระหว่างข้อเสนอแม้ว่าจะมีข้อ จำกัด ก็ตามช่วยฉันจากการนำเข้าและส่งออกที่ผิดพลาดได้ง่าย
chingNotCHing

9

ขึ้นอยู่กับว่าคุณกำลังพูดถึงข้อมูลหรือรหัสที่มีอยู่ในสเปรดชีต ในขณะที่ฉันไม่ชอบ Visual Sourcesafe ของ Microsoft และโดยทั่วไปจะไม่แนะนำให้ใช้ แต่จะรวมเข้ากับ Access และ Excel ได้อย่างง่ายดายและให้การควบคุมแหล่งที่มาของโมดูล

[อันที่จริงแล้วการรวมเข้ากับ Access รวมถึงการสืบค้นรายงานและโมดูลเป็นวัตถุเดี่ยว ๆ ที่สามารถเป็นเวอร์ชั่นได้]

การเชื่อมโยงของ MSDN เป็นที่นี่


4
หนึ่งในความลับที่เก็บไว้ที่ดีกว่า - ฉันไม่รู้ว่า VSS สามารถทำเช่นนั้นได้ +1
กังวล OffunbridgeWells

ฉันไม่รู้เหมือนกัน แต่อย่างไรก็ตามวีเอสเอสเป็นหนึ่งกอง .. และฉันจะอยู่ห่างจากมัน
GUI Junkie

ฉันตื่นเต้นและใช้เวลาหนึ่งชั่วโมงในการกำจัดสิ่งนี้ แต่ดูเหมือนว่า MS หยุดสนับสนุนใน Excel 2003 คุณอาจโชคดีถ้า Access VBA ที่คุณทำงานด้วย แต่ฉันไม่ได้มอง
harvest316

1
คุณอาจจะสามารถใช้ Add-in รุ่นนักพัฒนา Office ได้หรือไม่: brandon.fuller.name/archives/2003/11/07/10.26.30
Mitch Wheat

7

ฉันไม่ได้ตระหนักถึงเครื่องมือที่ทำได้ดี แต่ฉันได้เห็นวิธีแก้ไขปัญหาที่หลากหลาย เธรดทั่วไปของสิ่งเหล่านี้คือการลดข้อมูลไบนารีภายใต้การควบคุมเวอร์ชันและเพิ่มข้อมูลต้นฉบับเดิมให้มากที่สุดเพื่อใช้ประโยชน์จากระบบ scc ทั่วไป เพื่อทำสิ่งนี้:

  • ปฏิบัติต่อสมุดงานเหมือนกับแอปพลิเคชันอื่น แยกตรรกะการกำหนดค่าและข้อมูล
  • แยกรหัสจากสมุดงาน
  • สร้าง UI โดยทางโปรแกรม
  • เขียนสคริปต์การสร้างเพื่อสร้างสมุดงานใหม่

ทำไมต้องผ่านเรื่องไร้สาระทั้งหมดนี้เมื่อทุกสิ่งที่คุณต้องการคือการควบคุมแหล่งที่มาที่จัดการวัตถุไบนารี? SVN สามารถทำได้
Coder ที่ไม่รู้จัก

15
เนื่องจากคุณไม่สามารถรวมวัตถุไบนารีได้
igelineau

6

การทำงานกับ @Demosthenex ทำงาน @Tmdean และ @Jon Crowell ความคิดเห็นอันล้ำค่า! (+1 พวกเขา)

ฉันบันทึกไฟล์โมดูลใน git \ dir ข้างตำแหน่งสมุดงาน เปลี่ยนความชอบของคุณ

สิ่งนี้จะไม่ติดตามการเปลี่ยนแปลงของรหัสสมุดงาน ดังนั้นมันขึ้นอยู่กับคุณที่จะซิงโครไนซ์มัน

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

แล้วในโมดูลสมุดงาน:

Private Sub Workbook_Open()

    ImportCodeModules

End Sub

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

    SaveCodeModules

End Sub

6

หากคุณต้องการติดตามโค้ดใน Microsoft Excel Objects และ UserForms ของคุณคุณจะต้องใช้เล่ห์เหลี่ยมนิดหน่อย

ก่อนอื่นฉันเปลี่ยนSaveCodeModules()ฟังก์ชั่นของฉันเป็นรหัสประเภทต่าง ๆ ที่ฉันวางแผนจะส่งออก:

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 ข้อแตกต่างเพียงอย่างเดียวคือไฟล์สองไฟล์จะถูกสร้างขึ้นเมื่อฟอร์มถูกส่งออก (คุณจะได้รับ.frmและ.frxไฟล์สำหรับแต่ละ UserForm) หนึ่งในนั้นมีซอฟต์แวร์ที่คุณเขียนและอีกอันเป็นไฟล์ไบนารีซึ่ง (ฉันค่อนข้างแน่ใจ) กำหนดเค้าโครงของแบบฟอร์ม

Microsoft Excel วัตถุ (Meos) (หมายถึงSheet1, Sheet2, ThisWorkbookฯลฯ ) สามารถส่งออกเป็น.clsไฟล์ อย่างไรก็ตามเมื่อคุณต้องการนำรหัสนี้กลับไปยังสมุดงานของคุณหากคุณพยายามนำเข้ามันในลักษณะเดียวกับที่คุณทำกับโมดูล VBA คุณจะได้รับข้อผิดพลาดหากแผ่นงานนั้นมีอยู่แล้วในสมุดงาน

เพื่อแก้ไขปัญหานี้ฉันตัดสินใจที่จะไม่ลองนำเข้าไฟล์. cls ไปยัง Excel แต่เพื่ออ่าน.clsไฟล์ใน excel เป็นสตริงแทนจากนั้นวางสตริงนี้ลงใน MEO ที่ว่างเปล่า นี่คือ 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

ในกรณีที่คุณสับสนกับdirอินพุตของทั้งสองฟังก์ชั่นนั่นเป็นเพียงที่เก็บรหัสของคุณ! ดังนั้นคุณจะเรียกฟังก์ชันเหล่านี้เช่น:

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

ข้อควรทราบ: ฉันไม่มีโชคในการควบคุมเวอร์ชันจริงกับ UserForms เนื่องจากไฟล์ไบนารี หากคุณสร้างสาขาหลายแห่งใน repo git ของคุณคุณอาจไม่สามารถรวมสาขาเหล่านั้นได้หากคุณทำงานกับ UserForms
dslosky

5

ฉันใช้gitและวันนี้ฉันส่ง port นี้ (git-xlsx-textconv)ไปยัง Python เนื่องจากโครงการของฉันใช้รหัส Python และมันโต้ตอบกับไฟล์ Excel สิ่งนี้ใช้ได้กับไฟล์. xlsxอย่างน้อยแต่ฉันคิดว่ามันจะใช้ได้กับ. xlsด้วย นี่คือลิงค์ GitHub ฉันเขียนสองรุ่นโดยหนึ่งมีแต่ละแถวในบรรทัดของตัวเองและอีกอันที่แต่ละเซลล์อยู่ในบรรทัดของตัวเอง (หลังถูกเขียนเพราะgit diffไม่ชอบที่จะใส่บรรทัดยาวเป็นค่าเริ่มต้นอย่างน้อยที่นี่บน Windows)

นี่คือไฟล์. gitconfigของฉัน(นี่ทำให้สคริปต์แตกต่างอยู่ใน repo ของโครงการของฉัน):

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

หากคุณต้องการให้สคริปต์พร้อมใช้งานสำหรับ repos ที่แตกต่างกันจำนวนมากใช้สิ่งนี้:

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

ไฟล์. gitattributesของฉัน:

*.xlsx diff=xlsx

3

สิ่งหนึ่งที่คุณสามารถทำได้คือการมีตัวอย่างต่อไปนี้ในสมุดงานของคุณ:

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

ฉันพบข้อมูลโค้ดนี้ทางอินเทอร์เน็ต

หลังจากนั้นคุณสามารถใช้การโค่นล้มเพื่อรักษาการควบคุมเวอร์ชัน ตัวอย่างเช่นโดยใช้อินเตอร์เฟสบรรทัดคำสั่งของการโค่นล้มด้วยคำสั่ง 'เชลล์' ภายใน VBA ที่จะทำมัน ฉันยังคิดที่จะทำสิ่งนี้ด้วยตัวเอง :)


ฉันคิดว่านี่เป็นวิธีการที่ยอดเยี่ยม การควบคุมซอร์สของโค้ด Excel สามารถเกิดขึ้นได้กับการแบ่งแยกเท่านั้น นี่จะอนุมานวิธีการสร้างด้วย Code Cleaner สามารถทำเช่นนี้ได้ (ฟรีแวร์ฉันเชื่อว่า) appspro.com/Utilities/CodeCleaner.htmแต่โค้ดของคุณเท่าเทียมกัน
พูดได้หลายภาษา

ฉันพยายามแก้ไขสิ่งนี้เพื่อให้ทำงานได้โดยใช้Microsoft®Excel®สำหรับ Mac 2011 เวอร์ชัน 14.4.1 บรรทัดที่เรียกใช้เมธอดส่งออกจะไม่ทำอะไรเลยอย่างเงียบ ๆ
DA Vincent

3

ฉันอยากจะแนะนำเครื่องมือโอเพนซอร์ซที่เรียกว่าRubberduckที่มีการควบคุมเวอร์ชันของโค้ด VBA ในตัวลองดู!


2

หากคุณกำลังดูการตั้งค่าสำนักงานกับผู้ใช้ทั่วไปที่ไม่ใช่ผู้ใช้งานด้านเทคนิคมากกว่า Sharepoint เป็นทางเลือกที่เหมาะสม คุณสามารถตั้งค่าโฟลเดอร์เอกสารที่เปิดใช้งานการควบคุมเวอร์ชันและเช็คอินและเช็คเอาต์ ทำให้เป็นฟรีสำหรับผู้ใช้สำนักงานทั่วไป


2

เพื่อตอบสนองต่อการตอบกลับของ mattlant - sharepoint จะทำงานได้ดีเช่นเดียวกับการควบคุมเวอร์ชันเฉพาะเมื่อเปิดฟีเจอร์การควบคุมเวอร์ชันในไลบรารีเอกสาร นอกจากนี้โปรดทราบว่ารหัสใด ๆ ที่เรียกไฟล์อื่น ๆ โดยเส้นทางสัมพัทธ์จะไม่ทำงาน และในที่สุดลิงก์ใด ๆ ไปยังไฟล์ภายนอกจะแตกเมื่อไฟล์ถูกบันทึกใน sharepoint


1

ใช้เครื่องมือควบคุมเวอร์ชันมาตรฐานใด ๆ เช่น SVN หรือ CVS ข้อ จำกัด ขึ้นอยู่กับวัตถุประสงค์คืออะไร นอกเหนือจากขนาดที่เพิ่มขึ้นเล็กน้อยของพื้นที่เก็บข้อมูลฉันไม่ได้ประสบปัญหาใด ๆ


1

คุณควรลอง DiffEngineX มันสามารถเรียกโปรแกรมและจากบรรทัดคำสั่งการขัดแย้งบรรทัดคำสั่ง ไม่เพียงเปรียบเทียบเซลล์สเปรดชีต Excel เท่านั้น แต่ยังมีแมโคร Visual Basic ที่ฝังอยู่ในสมุดงาน เปรียบเทียบชื่อและความคิดเห็นที่กำหนดโดย Excel ซึ่งมีเครื่องมือฟรีแวร์จำนวนมากที่พลาดไม่ได้ สามารถดาวน์โหลดได้จาก

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

ฉันมั่นใจว่าระบบควบคุมเวอร์ชันของคุณมีตัวเลือกหรือกล่องเพื่อให้คุณสามารถโทรหา DiffEngineX โดยอัตโนมัติด้วยสมุดงาน Excel ต้นฉบับและที่ปรับเปลี่ยนของคุณ


12
คุณควรพูดถึงในคำตอบของคุณว่าคุณเป็นพันธมิตรกับผลิตภัณฑ์เชิงพาณิชย์นี้
Hans Olsson

1

ฉันก็มองเรื่องนี้เช่นกัน ขออภัยที่ Team Foundation Server 2010 ล่าสุดอาจมี Excel Add-In

นี่คือเงื่อนงำ:

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


TFS ใช้ประโยชน์จาก Excel อย่างหนักในการทำงานการรายงานรายการซึ่งไม่เกี่ยวข้องกับการนำไฟล์ Excel เข้าสู่การควบคุมแหล่งที่มาอย่างน่าเสียดาย
แบรด R

1

หลังจากค้นหาอายุและทดลองใช้เครื่องมือต่าง ๆ ฉันพบคำตอบของฉันเกี่ยวกับปัญหาการควบคุมเวอร์ชัน vba ที่นี่: https://stackoverflow.com/a/25984759/2780179

มันเป็น addin excel ง่าย ๆ ซึ่งรหัสสามารถพบได้ที่นี่

ไม่มีโมดูลที่ซ้ำกันหลังจากนำเข้า มันส่งออกรหัสของคุณโดยอัตโนมัติทันทีที่คุณบันทึกสมุดงานของคุณโดยไม่ต้องแก้ไขสมุดงานที่มีอยู่ มันมาพร้อมกับฟอร์แมตโค้ด vba


1

อันที่จริงมีเพียงไม่กี่โซลูชันที่จะติดตามและเปรียบเทียบการเปลี่ยนแปลงในโค้ดแมโคร - ส่วนใหญ่มีการตั้งชื่อไว้ที่นี่แล้ว ฉันท่องเว็บและพบเครื่องมือใหม่นี้ที่ควรค่าแก่การกล่าวถึง:

XLTools Version Control สำหรับมาโคร VBA

  • การควบคุมเวอร์ชันสำหรับแผ่นงาน Excel และโมดูล VBA
  • ดูตัวอย่างและการเปลี่ยนแปลงที่แตกต่างก่อนที่จะยอมรับเวอร์ชัน
  • ยอดเยี่ยมสำหรับการทำงานร่วมกันของผู้ใช้หลายคนในไฟล์เดียวกัน (ติดตามว่าใครเปลี่ยนอะไร / เมื่อใด / ความคิดเห็น)
  • เปรียบเทียบเวอร์ชันและไฮไลต์การเปลี่ยนแปลงในโค้ดทีละบรรทัด
  • เหมาะสำหรับผู้ใช้ที่ไม่เข้าใจเทคโนโลยีหรือเก่งเรื่อง Excel
  • ประวัติรุ่นจะถูกเก็บไว้ใน Git-repository บนพีซีของคุณ - ทุกรุ่นสามารถกู้คืนได้อย่างง่ายดาย

รหัสรุ่น VBA เคียงข้างกันการเปลี่ยนแปลงจะถูกมองเห็น


0

คุณอาจลองใช้ Excel XML ของ Microsoft ใน zip container (.xlsx และ. xslm) สำหรับการควบคุมเวอร์ชันและพบว่า vba ถูกเก็บไว้ใน vbaProject.bin (ซึ่งไม่มีประโยชน์สำหรับการควบคุมเวอร์ชัน)

การแก้ปัญหานั้นง่าย

  1. เปิดไฟล์ excel ด้วย LibreOffice Calc
  2. ใน Lotus Symphony Spreadsheets
    1. ไฟล์
    2. บันทึกเป็น
    3. บันทึกเป็นประเภท: สเปรดชีต ODF (.ods)
  3. ปิดการคำนวณ LibreOffice
  4. เปลี่ยนชื่อนามสกุลไฟล์ใหม่จาก. ods เป็น. zip
  5. สร้างโฟลเดอร์สำหรับสเปรดชีตในพื้นที่บำรุงรักษา GIT
  6. แยก zip ลงในโฟลเดอร์ GIT
  7. ส่งมอบ GIT

เมื่อคุณทำสิ่งนี้ซ้ำกับสเปรดชีตเวอร์ชันถัดไปคุณจะต้องตรวจสอบให้แน่ใจว่าคุณทำไฟล์ของโฟลเดอร์ตรงกับไฟล์ในคอนเทนเนอร์ zip (และไม่ทิ้งไฟล์ที่ถูกลบทิ้งไว้)


2
วิธีการนี้เต็มไปด้วยความเสี่ยง หากคุณใช้ฟีเจอร์ใน Excel ที่ไม่ได้ใช้งานใน Libre หรือไม่ "แมป" เป็น Libre และย้อนกลับอย่างถูกต้องวิธีการนี้จะหยุด สิ่งนี้จะได้ผลแน่นอนว่าฉันต้องใช้สเปรดชีตธรรมดา แต่ต้องระมัดระวังเป็นพิเศษ PW
Phil Whittington

0

นอกจากนี้ยังมีโปรแกรมที่ชื่อว่าBeyond Compareที่มีไฟล์ Excel ที่ค่อนข้างดีเปรียบเทียบ ฉันพบภาพหน้าจอเป็นภาษาจีนซึ่งแสดงให้เห็นในเวลาสั้น ๆ :

นอกเหนือจากการเปรียบเทียบ - เปรียบเทียบสองไฟล์ excel (ภาษาจีน)
แหล่งรูปภาพต้นฉบับ

มีการทดลองใช้ 30 วันในหน้าของพวกเขา


0

ฉันพบวิธีแก้ปัญหาที่ง่ายมากสำหรับคำถามนี้ซึ่งตรงกับความต้องการของฉัน ฉันเพิ่มหนึ่งบรรทัดที่ด้านล่างของมาโครทั้งหมดของฉันซึ่งส่งออก*.txtไฟล์ด้วยรหัสแมโครทั้งหมดในแต่ละครั้งที่เรียกใช้ รหัส:

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

(พบในบทช่วยสอนของ Tomซึ่งครอบคลุมการตั้งค่าบางอย่างที่คุณอาจต้องใช้ในการทำงานนี้)

เนื่องจากฉันจะเรียกใช้แมโครทุกครั้งที่ฉันทำงานกับรหัสฉันรับประกันว่า git จะรับการเปลี่ยนแปลง ส่วนที่น่ารำคาญเพียงอย่างเดียวคือถ้าฉันต้องการเช็คเอาต์รุ่นก่อนหน้าฉันต้องคัดลอก / วางจาก*.txtสเปรดชีตด้วยตนเอง


-1

ขึ้นอยู่กับว่าคุณต้องการบูรณาการในระดับใดฉันใช้ Subversion / TortoiseSVN ซึ่งดูดีสำหรับการใช้งานที่เรียบง่าย ฉันได้เพิ่มคำหลักลงไปด้วย แต่ดูเหมือนว่ามีความเสี่ยงต่อความเสียหายของไฟล์ มีตัวเลือกในการโค่นล้มเพื่อให้การแทนที่คำหลักมีความยาวคงที่และเท่าที่ฉันเข้าใจว่ามันจะทำงานได้ถ้าความยาวคงที่คือเท่ากัน แต่ไม่แปลก ไม่ว่าในกรณีใดคุณไม่ได้รับฟังก์ชั่นการใช้งาน diff ที่แตกต่างฉันคิดว่ามีผลิตภัณฑ์เชิงพาณิชย์ที่จะ 'diff' ฉันพบบางสิ่งที่แตกต่างกันไปตามการแปลงเนื้อหาเป็นข้อความธรรมดาและเปรียบเทียบสิ่งนั้น แต่มันก็ไม่ค่อยดีนัก


-1

ควรทำงานกับ VCS ส่วนใหญ่ (ขึ้นอยู่กับเกณฑ์อื่น ๆ ที่คุณอาจเลือก SVN, CVS, Darcs, TFS, ฯลฯ ) แต่จริง ๆ แล้วมันจะเป็นไฟล์ที่สมบูรณ์ (เพราะเป็นรูปแบบไบนารี) ซึ่งหมายความว่าคำถาม "สิ่งที่เปลี่ยนแปลง" คือ ไม่ใช่เรื่องง่ายที่จะตอบ

คุณยังคงสามารถใช้ข้อความบันทึกได้หากมีคนกรอกข้อมูล แต่คุณอาจลองใช้รูปแบบ XML ใหม่จาก Office 2007 เพื่อให้มองเห็นได้มากขึ้น (แม้ว่าจะยากต่อการมองผ่าน XML จำนวนมากรวมทั้ง AFAIK ไฟล์ XML ถูกซิปลงบนดิสก์ดังนั้นคุณจะต้องขอฮุกการส่งคำสั่งล่วงหน้าเพื่อคลายซิปเพื่อให้ข้อความต่างทำงานได้อย่างถูกต้อง)


-1

ฉันเขียนสเปรดชีตที่ควบคุมการแก้ไขด้วย VBA มันเหมาะสำหรับรายงานทางวิศวกรรมที่คุณมีหลายคนทำงานกับ Bill Of Material หรือ Schedule จากนั้นในบางเวลาคุณต้องการสร้างการแก้ไขสแน็ปช็อตที่แสดงเพิ่ม, del และอัพเดตจาก rev ก่อนหน้า

หมายเหตุ: เป็นสมุดงานที่เปิดใช้งานแมโครซึ่งคุณต้องลงชื่อเข้าใช้เพื่อดาวน์โหลดจากเว็บไซต์ของฉัน (คุณสามารถใช้ OpenID ได้)

รหัสทั้งหมดถูกปลดล็อค

Rev. Spreadsheet ที่ควบคุม


-1

บริษัท ของฉันทำงานเป็นจำนวนมากในการทำให้โซลูชัน Microsoft Office เป็นแบบอัตโนมัติดังนั้นฉันจึงเขียน. DLL ที่จะส่งออกแหล่งที่มาของโซลูชันในแต่ละครั้งที่บันทึกเทมเพลต มันสร้างโฟลเดอร์ชื่อ Source เป็นโฟลเดอร์ย่อยของโฟลเดอร์ที่บันทึกแม่แบบและใต้ Source จะสร้างโฟลเดอร์ที่มีชื่อเดียวกับโครงการ VBA ในโฟลเดอร์โครงการมันจะส่งออกซอร์สโค้ดทั้งหมดสำหรับโมดูลคลาสและแบบฟอร์มผู้ใช้ การจัดเรียงนี้ถูกเลือกเพื่อให้ง่ายต่อการจัดการแหล่งที่มาสำหรับคอลเลกชันขนาดใหญ่ของแม่แบบ DLL สามารถปลดล็อกโครงการที่ล็อคไว้เพื่อให้สามารถเข้าถึงโครงการ VBA ได้หากคุณมีไฟล์กำหนดค่าท้องถิ่นหรือไฟล์กำหนดค่าส่วนกลางที่มีอยู่ ด้วยเครื่องมือที่ใช้งานอยู่นี้นักพัฒนาสามารถทำงานกับเทมเพลตให้กับเนื้อหาในใจและใช้เครื่องมือควบคุมการแก้ไขที่ชื่นชอบเพื่อจัดการงานของพวกเขา


ชาด - ฉันขอแนะนำให้อ่านโพสต์นี้ซึ่งผมได้ทำเมื่อเร็ว ๆ ตระหนักถึง: stackoverflow.com/help/promotion คำตอบของคุณดูเหมือนจะละเมิด "อย่าบอก - แสดง!" หลักการคุณพูดคุยเกี่ยวกับ บริษัท ของคุณและวิธีแก้ปัญหาที่คุณคิดขึ้นมาและทำการอ้างอิงไปยัง DLL เป็นจำนวนมาก แต่คุณจะไม่แสดงให้เราเห็นว่าคุณทำได้อย่างไรหรือแม้กระทั่งให้การเข้าถึง DLL ดังนั้นคำตอบนี้ไม่ได้อยู่ในจิตวิญญาณของเว็บไซต์นี้
Colm Bhandal
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.