programing

MS Excel 버전 관리를 하는 최선의 방법

stoneblock 2023. 4. 19. 21:54

MS Excel 버전 관리를 하는 최선의 방법

MS Excel(2003/2007)에서 사용한 버전 관리 시스템은 무엇입니까?무엇을 추천하고 그 이유는 무엇입니까?최상위 등급 버전 관리 시스템에 어떤 제한이 있습니까?

이를 종합적으로 보기 위해 다음과 같은 몇 가지 사용 사례를 소개합니다.

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

TortiseBZR을 통한 수동 체크인/아웃이 가능한 바자를 사용한 스프레드시트를 방금 설정했습니다.이 토픽이 세이브 부분에 도움이 되었기 때문에, 저는 여기에 솔루션을 투고하고 싶다고 생각하고 있습니다.

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

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

내 BZR 저장소인 X:\Data\MySheet 디렉토리를 설정했습니다.repo에는 MySheet.xls와 각 모듈에 대해1개의 .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"을 마우스 오른쪽 버튼으로 클릭하고 "View Code"를 선택합니다.코드 창 상단의 선택 상자를 아래로 당겨야 "(일반)" 보기에서 "워크북" 보기로 변경할 수 있습니다.

워크북 보기 내용:

Private Sub Workbook_Open()

ImportCodeModules

End Sub

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

SaveCodeModules

End Sub

앞으로 몇 주 동안 이 워크플로우에 정착할 예정이며, 문제가 생기면 게시하겠습니다.

VBC 컴포넌트 코드를 공유해 주셔서 감사합니다!

거북이SVN은 Subversion 버전 제어 시스템에 매우 적합한 Windows 클라이언트입니다.방금 발견한 기능 중 하나는 Excel 파일의 버전을 클릭하면 두 버전이 Excel로 열리고 변경된 셀이 강조 표시됩니다(빨간색).이 작업은 여기서 설명하는 vbs 스크립트의 마법을 통해 수행됩니다.

거북이를 사용하지 않더라도 유용할 수 있습니다.SVN

버전 관리를 원하는 항목과 이유를 요약합니다.

  1. 내용:

    • 코드(VBA)
    • 스프레드시트(식)
    • 스프레드시트(값)
    • 차트
    • ...
  2. 이유:

    • 감사 로그
    • 콜라보레이션
    • 버전 비교("diffing")
    • 머지

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

  • Git
  • 수은
  • 전복
  • 바자

워크북의 VBA 코드가 유일한 관심사라면 위의 Demosthenex 접근법 또는 VbaGit(https://github.com/brucemcpherson/VbaGit)은 매우 잘 작동하고 비교적 간단하게 구현할 수 있습니다.장점은 잘 검증된 버전 관리 시스템에 의존하여 필요에 따라 선택할 수 있다는 것입니다(Git과 Subversion의 간단한 비교는 https://help.github.com/articles/what-are-the-differences-between-svn-and-git/를 참조하십시오).

코드뿐만 아니라 시트의 데이터("하드코드된" 값 및 수식 결과)도 걱정되는 경우, 이와 유사한 전략을 사용할 수 있습니다. 시트 내용을 (범위를 통해) 텍스트 형식으로 직렬화합니다.기존 버전 관리 시스템을 사용합니다.https://wiki.ucl.ac.uk/display/~ucftpw2/2013/10/18/Using+git+for+version+control+of+spreadsheet+모델+-+part+1+of+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을 참조하십시오.

데이터를 말하는지, 스프레드시트에 포함된 코드를 말하는지에 따라 다릅니다.Microsoft의 Visual Sourcesafe를 매우 싫어하기 때문에 보통 권장하지 않지만 Access와 Excel 모두와 쉽게 통합되어 모듈의 소스 제어가 가능합니다.

[사실 Access와의 통합으로 쿼리, 보고서 및 모듈을 버전화할 수 있는 개별 객체로 포함]

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

이 기능을 하는 툴은 잘 모르지만, 다양한 국내 개발 솔루션을 봐 왔습니다.이러한 공통점은 버전 관리 하에 있는 바이너리 데이터를 최소화하고 텍스트 데이터를 최대화하여 기존 scc 시스템의 성능을 활용하는 것이다.이 작업을 수행하려면:

  • 워크북을 다른 응용 프로그램과 동일하게 취급합니다.논리, 구성, 데이터를 분리한다.
  • 코드와 워크북을 구분하십시오.
  • 프로그래밍 방식으로 UI를 구축합니다.
  • 워크북을 재구성하는 빌드 스크립트를 작성합니다.

저는 git을 사용하고 있는데, 오늘은 Python에 (git-xlsx-textcon)포팅했습니다.프로젝트가 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

스크립트를 많은 다른 저장소에서 사용할 수 있도록 하려면 다음과 같이 하십시오.

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

my .displays 속성 파일:

*.xlsx diff=xlsx

@Demosthenex 작업, @Tmdean 및 @John 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

@Demosthenex의 답변을 한 걸음 더 나아가 Microsoft Excel Objects 및 User Forms에서 코드를 추적하려면 조금 까다로워져야 합니다.

, 나는 내 생각을 .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

User Forms ba VBA 。때 두 입니다(폼을 때 두 개의 파일이 됩니다..frm a. a. a..frx각 사용자 양식에 대한 파일)을 참조하십시오.이 중 하나는 작성한 소프트웨어를 포함하고 다른 하나는 폼 레이아웃을 정의하는 바이너리 파일입니다.

객체)(Microsoft Excel 객체(MEOMEO)를 의미합니다)Sheet1,Sheet2,ThisWorkbooketc는 a 등)으로 내보낼 수 ..cls그러나 이 코드를 워크북에 다시 넣으려고 할 때 VBA 모듈과 동일한 방법으로 가져오려고 하면 해당 시트가 워크북에 이미 있으면 오류가 발생합니다.

. .cls Import를 ..cls대신 파일을 문자열로 Excel로 만든 다음 이 문자열을 빈 MEO에 붙여넣습니다.ImportCodeModules 음음 import 。

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\"

워크북에 다음과 같은 스니펫이 있습니다.

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의 명령줄 인터페이스를 사용합니다.그걸로 충분할 거야.직접 해볼까 생각중이야 :)

VBA 코드의 버전 제어를 내장한 Rubberduck이라는 훌륭한 오픈 소스 툴을 추천합니다.해봐!

일반 사무실이 아닌 일반 사용자가 있는 사무실 환경을 찾는 경우 SharePoint를 사용하는 것이 좋습니다.버전 제어가 사용 가능하고 체크인 및 체크아웃이 가능한 문서 폴더를 설정할 수 있습니다.일반 사무실 사용자에게 더 편리합니다.

mattlant의 답변에 대한 응답 - 문서 라이브러리에서 버전 제어 기능이 켜져 있는 경우에만 공유점이 버전 제어로 작동합니다.또, 상대 패스로 다른 파일을 호출하는 코드는 동작하지 않습니다.또, 파일이 쉐어 포인트에 보존되면, 외부 파일에의 링크가 끊어집니다.

기간을 검색하여 다양한 툴을 사용해 본 결과, vba 버전 관리 문제에 대한 해답은 https://stackoverflow.com/a/25984759/2780179에서 찾을 수 있었습니다.

여기서 코드를 찾을 수 있는 간단한 엑셀 추가입니다.

Import 후 중복된 모듈은 없습니다.워크북을 저장하는 즉시 기존 워크북을 수정하지 않고 코드를 자동으로 내보냅니다.vba 코드 포맷과 함께 제공됩니다.

SVN 또는 CVS와 같은 표준 버전 제어 도구를 사용합니다.제한은 목적이 무엇이냐에 따라 달라집니다.저장소의 크기가 약간 증가한 것 외에는 문제가 없었습니다.

저도 계속 알아보고 있어요.최신 Team Foundation Server 2010에는 Excel 애드인이 탑재되어 있을 가능성이 있습니다.

힌트는 다음과 같습니다.

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

매크로 코드의 변경을 추적 및 비교할 수 있는 솔루션은 거의 없습니다.대부분은 이미 여기에 기재되어 있습니다.웹을 검색하던 중 언급할 가치가 있는 새로운 도구를 발견했습니다.

VBA 매크로용 XLTools 버전 제어

  • Excel 시트 및 VBA 모듈 버전 관리
  • 버전을 커밋하기 전에 변경 내용을 미리 보고 구별합니다.
  • 같은 파일상의 복수의 유저의 콜라보레이션 작업에 최적(누가 무엇을 언제 변경했는지 추적)
  • 버전 비교 및 코드 변경 강조
  • 테크놀로지에 정통하지 않은 사용자나 Excel에 정통하지 않은 사용자에게 적합합니다.
  • 버전 이력은 자신의 PC에 있는 Git-Repository에 저장되므로 어떤 버전이라도 쉽게 복구할 수 있습니다.

VBA 코드 버전을 나란히 표시하여 변경 내용을 시각화합니다.

버전 제어를 위해 zip 컨테이너(.xlsx 및 .xslm)에서 Microsoft의 Excel XML을 사용해보니 vba가 vbaProject.bin(버전 제어에는 사용되지 않음)에 저장되어 있을 수 있습니다.

해결책은 간단합니다.

  1. LibreOffice Calc를 사용하여 Excel 파일을 엽니다.
  2. Libre Office 산 li 시 li
    1. 파일
    2. 다른 이름으로 저장
    3. 유형으로 저장: ODF 스프레드시트(.ods)
  3. LibreOffice 계산 닫기
  4. 새 파일의 파일 확장자를 .ods에서 .zip으로 변경합니다.
  5. GIT 유지관리 영역에 스프레드시트 폴더를 만듭니다.
  6. ZIP을 GIT 폴더에 압축 해제
  7. GIT에 전념하다

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

엑셀 파일 비교가 꽤 잘 되는 Beyond Compare라는 프로그램도 있습니다.중국어로 된 스크린샷을 찾았습니다.

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

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

나는 이 질문에 대해 나의 요구를 충족시키는 아주 간단한 해결책을 찾았다.맨한합니다. 이 의 맨 아래에 있는 행은 '1'을 내보냅니다.*.txt파일이 실행될 때마다 전체 매크로 코드가 표시됩니다.★★★★

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

(Tom's Tutorials(탐스 튜토리얼)에 있습니다.이 튜토리얼에서는, 이 조작에 필요한 설정도 몇개인가 설명합니다).

코드 작업을 할 때는 항상 매크로를 실행하므로 git은 반드시 변경 사항을 받아들일 것입니다., 을 체크 할 필요가 는, 「」에서 으로 카피/붙여넣기를 실시할 .*.txt스프레드시트에 추가합니다.

원하는 통합 수준에 따라 Subversion/Tortoise를 사용했습니다.간단한 사용법으로는 괜찮을 것 같은 SVN.키워드도 추가했습니다만, 파일이 파손될 우려가 있는 것 같습니다.Subversion에는 키워드 치환을 고정길이로 하는 옵션이 있으며, 고정길이가 짝수이지만 홀수가 아니면 사용할 수 있는 것으로 알고 있습니다.어떤 경우에도 diff 기능을 사용할 수 없기 때문에, 「diff」를 할 수 있는 시판 제품도 있다고 생각합니다.내용을 일반 텍스트로 변환하고 비교한 결과 차이가 나는 것을 발견했지만 별로 좋지 않았습니다.

대부분의 VCS에서 사용할 수 있지만(다른 조건에 따라 SVN, CVS, Darcs, TFS 등을 선택할 수 있음), 실제로는 완전한 파일(바이너리 형식이기 때문에)이 되기 때문에 "변경된" 질문에 대답하기가 쉽지 않습니다.

로그 메시지를 완료하면 로그 메시지에 의존할 수 있지만 Office 2007의 새로운 XML 기반 포맷을 사용하여 가시성을 높일 수도 있습니다(다만, XML 파일은 디스크상에 압축되어 있기 때문에, 텍스트가 올바르게 동작하기 위해서는 사전에 커밋 후크가 필요합니다).

VBA를 사용하여 리비전 제어 스프레드시트를 작성했습니다.여러 사람이 BOM 또는 스케줄에 대해 작업한 후 이전 개정판에서 추가, 삭제 및 업데이트를 표시하는 스냅샷 리비전을 만들고 싶은 경우 엔지니어링 보고서에 적합합니다.

주의: 내 사이트에서 다운로드하려면 로그인해야 하는 매크로 대응 워크북입니다(열기 사용 가능).아이디)

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

Rev 제어 스프레드시트

언급URL : https://stackoverflow.com/questions/131605/best-way-to-do-version-control-for-ms-excel