MS Excel 버전 관리를 수행하는 가장 좋은 방법


172

MS Excel (2003/2007)에서 어떤 버전 제어 시스템을 사용 했습니까? 무엇을 추천하고 왜 하시겠습니까? 최고 등급의 버전 관리 시스템에서 어떤 제한을 찾았습니까?

이를 관점에서 살펴보면 다음과 같은 두 가지 사용 사례가 있습니다.

  1. VBA 모듈의 버전 제어
  2. 둘 이상의 사람이 Excel 스프레드 시트에서 작업하고 있으며 병합 및 통합하려는 동일한 워크 시트를 변경하고있을 수 있습니다. 이 워크 시트에는 수식, 데이터, 차트 등이있을 수 있습니다.
  3. 사용자가 너무 기술적이지 않고 더 적은 버전 제어 시스템이 더 잘 사용됨
  4. 공간 제약이 고려됩니다. 이상적으로 전체 Excel 스프레드 시트가 아닌 증분 변경 사항 만 저장됩니다.

17
Google Apps / Docs에는 모델링과 같은 고급 작업을 수행해야하는 MS Excel의 모든 기능이 없습니다.
TheObserver

25
@ 리치 코튼. 이것이 실용적인 옵션이라면 (즉, matlab / python 사용) 모든 금융 회사는 지금까지 변화했을 것입니다. 재정 모델을 분석하지만 프로그래머가 아닌 프로그래머에게 프로그래머가되도록 요청하는 것은 전체적으로 위험하고 현실적으로 비현실적입니다.
익명 타입

1
stackoverflow.com/q/608872/107537 여기에 비슷한 질문이 있습니다. 그러나 워크 시트 자체는 다루지 않습니다. VBA 코드 만
Vijay

7
신용 경색에 대한 비난 Excel 모델링은 AAA로 정크를 의도적으로 판매하는 사기꾼 일 가능성이 높습니다. 투자가 허술하다는 것을 알려주기 위해 스프레드 시트가 필요하지 않습니다. 금융가이기 때문에 모든 모델에 전적으로 의존한다는 것은 엉덩이를 잃는 확실한 방법입니다. 또한 모든 모델은 모델을 만든 사람만큼 우수합니다. 아인슈타인의 일을 위해 Morts를 고용한다면, 당신은 나쁜 시간을 보낼 것입니다.
Eric J

VBA 매크로에서 버전 제어를 수행하는 데 주로 관심이 있다면 내 대답을 참조하십시오. stackoverflow.com/a/38297505/2146688
Chel

답변:


64

방금 TortiseBZR을 통한 수동 체크인 / 아웃과 함께 Bazaar를 사용하는 스프레드 시트를 설정했습니다. 주제가 저장 부분에 도움이되었다는 것을 감안할 때 여기에 솔루션을 게시하고 싶었습니다.

나를위한 해결책은 저장시 모든 모듈을 내보내고 열린 모듈을 제거하고 다시 가져 오는 스프레드 시트를 만드는 것이 었습니다. 예, 기존 스프레드 시트를 변환 할 때 잠재적으로 위험 할 수 있습니다.

이를 통해 Emacs (예, emacs) 를 통해 또는 Excel에서 기본적으로 모듈의 매크로를 편집하고 주요 변경 후 BZR 저장소를 커밋 할 수 있습니다. 모든 모듈은 텍스트 파일이므로 BZR의 표준 diff 스타일 명령은 Excel 파일 자체를 제외하고 내 소스에서 작동합니다.

BZR 저장소의 디렉토리 인 X : \ Data \ MySheet를 설정했습니다. 리포지토리에는 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

다음으로, 이러한 매크로를 실행하기 위해 열기 / 저장을위한 이벤트 후크를 설정해야합니다. 코드 뷰어에서 "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, 문서 모듈 (워크 북 또는 시트)의 경우 100입니다.
Jon Crowell

4
가져 오기 코드에 버그가 있습니다. 모듈을 삭제하고 가져 오기 때문에 모듈 순서가 변경되어 매번 몇 가지가 누락됩니다. 배열을 거꾸로 돌아가려면 For 루프를 변경해야합니다. 예를 들어 난 .VBComponents.Count에 한 단계 = -1
Tmdean

2
Excel 2013에서는 보안 센터에서 "VBA 프로젝트 개체 모델에 대한 액세스 신뢰"를 활성화해야합니다. 그렇지 않으면이 코드를 실행하려고하면 매우 도움이되지 않는 오류 1004가 발생합니다.
Robin Green

8
위의 스크립트는 완벽하지 않습니다. importCodeModules () 하위는 버그가 있으며 중복 모듈을 생성합니다. 또한 open 및 before_save 이벤트를 추가하려면 모든 단일 통합 문서를 편집해야합니다. 용납 할 수 없습니다. 오래 오래 시간 동안 웹 검색 후, 나는 마침내 뭔가 발견했습니다 실제로 작동 (을 말한다, 여기를 ). 코드 가져 오기, 내보내기, 코드 형식 등이 있습니다. 내보내기는 저장시 자동으로 수행되며 기존 통합 문서를 편집 할 필요가 없습니다.
CodeKid

5
그것은 훌륭한 발견입니다! 위의 스크립트 대신 사용하는 것이 좋습니다. 나는 그것을 한 번 쓰고 그것을 잠시 동안 사용했는데, 그것은 나의 요구를 충족시켰다. 매일 Excel과 VBA를 사용하는 사람에게는 해당 수출 전용 프로그램이나 프로젝트가 훨씬 적합합니다. 공유해 주셔서 감사합니다!
Demosthenex 8

42

TortoiseSVN 은 Subversion 버전 제어 시스템을위한 놀랍도록 훌륭한 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. 왜:

    • 감사 로그
    • 협동
    • 버전 비교 ( "diffing")
    • 합병

다른 사람들이 여기에 게시 한 것처럼 다음과 같은 기존 버전 제어 시스템 위에 몇 가지 솔루션이 있습니다.

  • 힘내
  • 수은제
  • 파괴
  • 바자

통합 문서의 VBA 코드가 유일한 관심사 인 경우 위의 Demosthenex 제안 또는 VbaGit ( https://github.com/brucemcpherson/VbaGit ) 방식은 매우 잘 작동하며 구현하기가 비교적 간단합니다. 장점은 입증 된 버전 제어 시스템에 의존하고 필요에 따라 하나를 선택할 수 있다는 것입니다 ( https://help.github.com/articles/what-are-the-differences-between-svn-and 참조) Git과 Subversion을 간단히 비교하려면 -git / ).

코드뿐만 아니라 시트의 데이터 ( "하드 코딩 된"값 및 수식 결과)에 대해 걱정할 경우 비슷한 전략을 사용할 수 있습니다. 시트의 내용을 일부 텍스트 형식 (범위. 값을 통해)으로 직렬화 기존 버전 관리 시스템을 사용하십시오. 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 for Excel 워크 플로는 https://www.xltrail.com/blog/git-workflow-for-excel참조하십시오 .


2020 업데이트 : 당신의 제안에 대한 upvoted xltrail.com/git-xl 제한하지만 커밋 사이 VBA 소스 DIFF를 생산하는 오픈 소스 자식 확장, 오류가 발생하기 쉬운 수입과 수출에서 저를 저장
chingNotCHing

9

데이터에 대해 이야기하고 있는지 또는 스프레드 시트에 포함 된 코드에 따라 다릅니다. Microsoft의 Visual Sourcesafe를 강력하게 싫어하지만 일반적으로 권장하지는 않지만 Access 및 Excel과 쉽게 통합되며 모듈의 소스 제어를 제공합니다.

[실제로 Access와의 통합에는 쿼리, 보고서 및 모듈이 버전을 지정할 수있는 개별 개체로 포함됨]

MSDN 링크는 여기에 있습니다 .


4
더 잘 유지 된 비밀 중 하나-VSS가 그렇게 할 수 있다는 것을 몰랐습니다. +1
ConcernedOfTunbridgeWells

나도 몰랐어 그러나 어쨌든 VSS는 s..t의 한 더미이며 멀리 떨어져 있습니다.
GUI Junkie

나는 모든 것을 흥분시키고 이것에 대한 그물을 닦는 데 1 시간을 보냈지 만 MS는 Excel 2003에서 그것을 지원하지 않는 것 같습니다. 작업중 인 Access VBA라면 운이 좋을 수도 있지만 보이지 않았습니다.
harvest316

1
Office 개발자 에디션 추가 기능을 사용할 수 있습니까? : brandon.fuller.name/archives/2003/11/07/10.26.30
Mitch Wheat

7

나는 이것을 잘하는 도구를 알지 못하지만 다양한 국내 솔루션을 보았습니다. 이들의 공통적 인 스레드는 버전 제어에서 이진 데이터를 최소화하고 텍스트 데이터를 최대화하여 기존 scc 시스템의 성능을 활용하는 것입니다. 이것을하기 위해:

  • 통합 문서를 다른 응용 프로그램처럼 취급하십시오. 논리, 구성 및 데이터를 분리하십시오.
  • 통합 문서와 코드를 분리하십시오.
  • 프로그래밍 방식으로 UI를 빌드하십시오.
  • 통합 문서를 재구성하는 빌드 스크립트를 작성하십시오.

바이너리 객체를 처리하는 소스 컨트롤 만 있으면 왜이 모든 넌센스를 처리해야합니까? SVN이이를 수행 할 수 있습니다.
Unknown 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

@Demosthenex의 답변을 한 단계 더 발전 시키면 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

VBA 코드와 마찬가지로 UserForms를 내보내고 가져올 수 있습니다. 유일한 차이점은 양식을 내보낼 때 두 개의 파일이 생성된다는 것입니다 ( 각 UserForm에 .frm대한 .frx파일 과 파일이 제공됨). 이 중 하나는 작성한 소프트웨어를 보유하고 다른 하나는 양식의 레이아웃을 정의하는 바이너리 파일입니다.

마이크로 소프트 엑셀 (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로 진정한 버전 제어를하는 것은 운이 없었습니다. git repo에서 여러 브랜치를 생성하면 UserForms를 사용하는 경우 브랜치를 병합하지 못할 수 있습니다.
dslosky

5

git을 사용 하고 오늘 프로젝트는 Python 코드를 기반으로하고 Excel 파일과 상호 작용하기 때문에이 (git-xlsx-textconv) 를 Python으로 이식 했습니다. 이것은 적어도 .xlsx 파일 에서 작동 하지만 .xls 에서도 작동한다고 생각합니다 . 다음 은 github 링크입니다. 각 셀은 자신의 라인에 어디 (때문에 후자가 기록 된 두 가지 버전, 한 줄에 각 행에 하나, 또 다른 쓴 자식은 diff는 기본적으로 긴 줄 바꿈하지 않는 것처럼 않습니다 여기에 적어도 윈도우에서).

이것은 내 .gitconfig 파일입니다 (다른 스크립트를 내 프로젝트의 저장소에 상주시킬 수 있습니다).

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

여러 다른 저장소에 스크립트를 사용할 수있게하려면 다음과 같이 사용하십시오.

[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

인터넷에서이 스 니펫을 찾았습니다.

나중에 Subversion을 사용하여 버전 제어를 유지할 수 있습니다. 예를 들어 VBA 내에서 'shell'명령과 함께 Subversion의 명령 행 인터페이스를 사용합니다. 그렇게 할 것입니다. 나는 심지어 이것을 스스로 생각하고있다 :)


나는 이것이 훌륭한 접근법이라고 생각합니다. Excel 코드의 소스 제어는 분해를 통해서만 가능합니다. 이것은 또한 빌드 접근법을 유추 할 것입니다. Code Cleaner는 예를 들어 appspro.com/Utilities/CodeCleaner.htm (프리웨어)과 같은 방법 으로이 작업을 수행 할 수 있지만 코드는 동일합니다.
polyglot

Mac 용 Microsoft® Excel® 버전 14.4.1을 사용하여이 기능을 수정하려고했습니다. Export 메소드를 호출하는 라인은 아무 것도하지 않습니다 (내가 사용한 올바른 형식의 OS X 디렉토리에 관계없이).
DA 빈센트

3

VBA 코드의 버전 제어 기능이 내장 된 Rubberduck 이라는 훌륭한 오픈 소스 도구를 추천하고 싶습니다 . 사용해보십시오!


2

Sharepoint보다 기술적 인 일반 사용자가 아닌 일반 사무실이있는 사무실 환경을보고 있다면 대안이 될 수 있습니다. 버전 관리가 활성화 된 문서 폴더와 체크인 및 체크 아웃을 설정할 수 있습니다. 일반 사무실 사용자에게는 더 편합니다.


2

mattlant의 회신에 대한 응답으로 문서 라이브러리에서 버전 제어 기능이 켜져있는 경우에만 sharepoint가 버전 제어로 작동합니다. 또한 상대 경로로 다른 파일을 호출하는 코드는 작동하지 않습니다. 마지막으로 파일을 공유 지점에 저장하면 외부 파일에 대한 링크가 끊어집니다.


1

SVN 또는 CVS와 같은 표준 버전 제어 도구를 사용하십시오. 한계는 목표가 무엇인지에 달려 있습니다. 저장소의 크기가 약간 증가한 것 외에도 문제가 발생하지 않았습니다.


1

DiffEngineX를 사용해보십시오. 프로그래밍 방식으로 또는 명령 줄 인수를 사용하는 명령 줄에서 호출 할 수 있습니다. Excel 스프레드 시트 셀뿐만 아니라 통합 문서에 포함 된 Visual Basic 매크로도 비교합니다. 또한 많은 프리웨어 도구가 놓친 Excel 정의 이름과 주석을 비교합니다. 에서 다운로드 할 수 있습니다

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

버전 관리 시스템에 옵션 또는 상자가 있으므로 원본 및 수정 된 Excel 통합 문서를 사용하여 DiffEngineX를 자동으로 호출 할 수 있습니다.


12
귀하는이 상용 제품과 관련이 있다는 답변을 언급해야합니다.
한스 올슨


1

연령대를 검색하고 다양한 도구를 시험해 본 결과 여기에서 vba 버전 관리 문제에 대한 답변을 찾았습니다. https://stackoverflow.com/a/25984759/2780179

그것은 코드가 발견 될 수있는 간단한 엑셀 추가 기능입니다 여기에

가져온 후 중복 모듈이 없습니다. 기존 통합 문서를 수정하지 않고 통합 문서를 저장하자마자 자동으로 코드를 내 보냅니다 . vba 코드 포맷터와 함께 제공됩니다.


1

실제로 매크로 코드의 변경 사항을 추적하고 비교할 수있는 몇 가지 솔루션 만 있습니다. 대부분의 이름은 여기에서 이미 지정되었습니다. 나는 웹을 탐색하고 언급 할 가치가있는이 새로운 도구를 발견했습니다.

VBA 매크로 용 XLTools 버전 관리

  • Excel 시트 및 VBA 모듈의 버전 제어
  • 버전을 커밋하기 전에 미리보기 및 차이점 변경
  • 동일한 파일에서 여러 사용자의 공동 작업에 적합 (누가 / 언제 / 설명을 변경 한 사람 추적)
  • 코드를 버전별로 비교하고 변경 사항을 강조 표시
  • 해당 기술에 정통하지 않은 사용자 또는 Excel에 정통한 사용자에게 적합
  • 버전 기록은 자신의 PC에서 Git 저장소에 저장됩니다-모든 버전을 쉽게 복구 할 수 있습니다

VBA 코드 버전과 나란히, 변경 사항이 시각화됩니다


0

버전 제어를 위해 zip 컨테이너 (.xlsx 및 .xslm)에서 Microsoft의 Excel XML을 사용해 보았을 수 있으며 vba가 vbaProject.bin (버전 제어에는 쓸모 없음)에 저장되어 있음을 발견했습니다.

해결책은 간단합니다.

  1. LibreOffice Calc로 Excel 파일 열기
  2. LibreOffice Calc에서
    1. 파일
    2. 다른 이름으로 저장
    3. 유형으로 저장 : ODF 스프레드 시트 (.ods)
  3. LibreOffice Calc 닫기
  4. 새 파일의 파일 확장자를 .ods에서 .zip으로 바꾸십시오.
  5. GIT 유지 관리 영역에서 스프레드 시트 폴더를 만듭니다.
  6. 압축을 GIT 폴더로 추출하십시오.
  7. GIT에 헌신하다

다음 버전의 스프레드 시트에서이 작업을 반복하면 폴더의 파일이 zip 컨테이너의 파일과 정확히 일치해야합니다 (삭제 된 파일은 남겨 두지 마십시오).


2
그러나이 접근법은 위험에 처해 있습니다. 나중에 Libre에서 구현되지 않았거나 Libre에 "매핑"되지 않은 Excel의 기능을 올바르게 사용하면이 접근 방식이 중단됩니다. 이것은 간단한 스프레드 시트의 경우에는 효과가 있지만 극도의주의를 기울여야합니다. PW
Phil Whittington

0

엑셀 파일 비교가 아주 좋은 Beyond Compare 라는 프로그램도 있습니다 . 중국어로 스크린 샷을 찾았습니다.

Beyond Compare-두 개의 Excel 파일 비교 (중국어)
원본 이미지 소스

페이지 에 30 일의 평가판이 있습니다 .


0

내 요구를 충족시키는이 질문에 대한 매우 간단한 해결책을 찾았습니다. *.txt매크로가 실행될 때마다 전체 매크로 코드와 함께 파일 을 내보내는 모든 매크로의 맨 아래에 한 줄을 추가 합니다. 코드:

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

( Tom 's Tutorials 에서 찾을 수 있습니다.

코드 작업을 할 때마다 항상 매크로를 실행하기 때문에 git이 변경 사항을 선택할 수 있습니다. 유일한 성가신 부분은 이전 버전을 체크 아웃 해야하는 경우 수동 *.txt으로에서 스프레드 시트로 복사 / 붙여 넣기해야한다는 것 입니다.


-1

원하는 통합 수준에 따라 Subversion / TortoiseSVN을 사용했는데 간단한 사용법에 적합합니다. 키워드도 추가했지만 파일 손상의 위험이있는 것 같습니다. Subversion에는 키워드 대체를 고정 길이로 만드는 옵션이 있으며 고정 길이가 짝수이지만 홀수가 아닌 경우 작동한다는 것을 이해합니다. 어쨌든 유용한 종류의 diff 기능을 얻지 못하면 'diff'를 수행하는 상용 제품이 있다고 생각합니다. 나는 물건을 평문으로 변환하고 그것을 비교하여 diff 한 것을 발견했지만 그다지 좋지 않았습니다.


-1

SVN, CVS, Darcs, TFS 등을 선택할 수있는 다른 기준에 따라 대부분의 VCS와 함께 작동해야하지만 실제로는 이진 형식이기 때문에 실제로는 완전한 파일이됩니다. 대답하기가 쉽지 않습니다.

사람들이 로그 메시지를 완성 하면 여전히 로그 메시지에 의존 할 수 있지만 Office 2007의 새로운 XML 기반 형식을 사용하여 더 많은 가시성을 확보 할 수 있습니다 (아직 많은 XML과 AFAIK 및 XML 파일을 통해 잡기가 여전히 어려울 수 있음) 는 디스크에 압축되어 있으므로 텍스트 diff가 올바르게 작동하려면 압축을 풀려면 사전 커밋 후크가 필요합니다).


-1

VBA를 사용하여 개정 제어 스프레드 시트를 작성했습니다. 여러 사람이 BOM (Bill of Material) 또는 일정에 대해 작업하고 특정 시점에서 이전 개정의 추가, 삭제 및 업데이트를 표시하는 스냅 샷 개정을 작성하려는 엔지니어링 보고서에 더 적합합니다.

참고 : 내 사이트에서 다운로드하려면 로그인 해야하는 매크로 사용 통합 문서입니다 (OpenID 사용 가능)

모든 코드가 잠금 해제되었습니다.

Rev Controlled Spreadsheet


-1

우리 회사는 Microsoft Office 솔루션 자동화에 상당한 양의 작업을 수행하므로 템플릿을 저장할 때마다 솔루션 소스를 내보내는 .DLL을 작성했습니다. 템플릿이 저장된 폴더의 하위로 Source라는 이름의 폴더를 생성하고 Source 아래에 VBA 프로젝트와 동일한 이름의 폴더를 생성합니다. 프로젝트 폴더에서 모듈, 클래스 및 사용자 양식에 대한 모든 소스 코드를 내 보냅니다. 이 배열은 대규모 템플릿 모음의 소스를 쉽게 관리 할 수 ​​있도록 선택되었습니다. 로컬 구성 파일 또는 전역 구성 파일을 사용할 수있는 경우 DLL은 잠긴 프로젝트를 잠금 해제하여 VBA 프로젝트에 액세스 할 수 있습니다. 이 도구를 사용하면 개발자는 마음 내용에 맞게 템플릿을 작업하고 좋아하는 수정본 제어 도구를 사용하여 작업을 관리 할 수 ​​있습니다.


Chad-이 게시물을 읽는 것이 좋습니다.이 게시물을 최근에 알게되었습니다 : stackoverflow.com/help/promotion . 귀하의 답변이 "말하지 말고 쇼하십시오!"를 위반 한 것으로 보입니다. 회사와 당신이 생각해 낸 솔루션에 대해 이야기하고 DLL에 대한 많은 참조를하지만, DLL을 어떻게 수행했는지 또는 심지어 DLL에 대한 액세스를 제공하지는 않습니다. 따라서이 답변은이 웹 사이트의 정신에 있지 않습니다.
Colm Bhandal
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.