MS Excel 버전 관리를 수행하는 가장 좋은 방법
MS Excel (2003/2007)에서 어떤 버전 제어 시스템을 사용 했습니까? 무엇을 추천하고 왜 하시겠습니까? 최고 등급의 버전 관리 시스템에서 어떤 제한을 찾았습니까?
이를 관점에서 살펴보면 다음과 같은 두 가지 사용 사례가 있습니다.
- VBA 모듈의 버전 제어
- 둘 이상의 사람이 Excel 스프레드 시트에서 작업 중이며 병합 및 통합하려는 동일한 워크 시트를 변경하고있을 수 있습니다. 이 워크 시트에는 수식, 데이터, 차트 등이있을 수 있습니다.
- 사용자가 너무 기술적이지 않고 더 적은 버전 제어 시스템이 더 잘 사용됨
- 공간 제약이 고려됩니다. 이상적으로 전체 Excel 스프레드 시트가 아닌 증분 변경 사항 만 저장됩니다.
방금 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 코드를 공유해 주셔서 감사합니다!
TortoiseSVN 은 Subversion 버전 제어 시스템을위한 놀랍도록 훌륭한 Windows 클라이언트입니다. 방금 발견 한 기능 중 하나는 Excel 파일 버전간에 차이점을 얻으려면 클릭하면 Excel에서 두 버전을 열고 변경된 셀을 강조 표시합니다 (빨간색). 여기 에 설명 된 vbs 스크립트의 마법을 통해 수행 됩니다 .
TortoiseSVN을 사용하지 않더라도이 기능이 유용 할 수 있습니다.
데이터에 대해 이야기하고 있는지 또는 스프레드 시트에 포함 된 코드에 따라 다릅니다. Microsoft의 Visual Sourcesafe를 강력하게 싫어하지만 일반적으로 권장하지는 않지만 Access 및 Excel과 쉽게 통합되며 모듈의 소스 제어를 제공합니다.
[실제로 Access와의 통합에는 쿼리, 보고서 및 모듈이 버전을 지정할 수있는 개별 개체로 포함됨]
MSDN 링크는 여기에 있습니다 .
나는 이것을 잘하는 도구를 알지 못하지만 다양한 국내 솔루션을 보았습니다. 이들의 공통적 인 스레드는 버전 제어에서 이진 데이터를 최소화하고 텍스트 데이터를 최대화하여 기존 scc 시스템의 성능을 활용하는 것입니다. 이것을하기 위해:
- 통합 문서를 다른 응용 프로그램처럼 취급하십시오. 논리, 구성 및 데이터를 분리하십시오.
- 통합 문서와 코드를 분리하십시오.
- 프로그래밍 방식으로 UI를 빌드하십시오.
- 통합 문서를 재구성하는 빌드 스크립트를 작성하십시오.
버전 관리를 원하는 이유와 이유를 요약하겠습니다.
뭐:
- 코드 (VBA)
- 스프레드 시트 (수식)
- 스프레드 시트 (값)
- 차트
- ...
왜:
- 감사 로그
- 협동
- 버전 비교 ( "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 을 참조하십시오 .
@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
@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\"
한 가지 할 수있는 것은 통합 문서에 다음 스 니펫을 두는 것입니다.
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의 명령 행 인터페이스를 사용합니다. 그렇게 할 것입니다. 나는 심지어 이것을 스스로 생각하고있다 :)
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
Sharepoint보다 기술이 아닌 일반 사용자가있는 사무실 환경을보고 있다면 대안이 될 수 있습니다. 버전 제어가 활성화 된 문서 폴더와 체크인 및 체크 아웃을 설정할 수 있습니다. 일반 사무실 사용자에게는 더 편합니다.
VBA 코드의 버전 제어 기능이 내장 된 Rubberduck 이라는 훌륭한 오픈 소스 도구를 추천하고 싶습니다 . 사용해보십시오!
SVN 또는 CVS와 같은 표준 버전 제어 도구를 사용하십시오. 한계는 목표가 무엇인지에 달려 있습니다. 저장소의 크기가 약간 증가한 것 외에도 문제가 발생하지 않았습니다.
in response to mattlant's reply - sharepoint will work well as a version control only if the version control feature is turned on in the document library. in addition be aware that any code that calls other files by relative paths wont work. and finally any links to external files will break when a file is saved in sharepoint.
You should try DiffEngineX. It can be called programmatically and also from the command line taking command line arguments. It not only compares the Excel spreadsheets cells, but also the Visual Basic macros embedded in the workbooks. Also compares Excel defined names and comments, which a lot of freeware tools miss out. It can be downloaded from
http://www.florencesoft.com/excel-differences-download.html
I'm sure your version control system has an option or box so you can automatically call DiffEngineX with your original and modified Excel workbooks.
I have been looking into this too. It apears that the latest Team Foundation Server 2010 may have an Excel Add-In.
Here is a clue:
http://team-foundation-server.blogspot.com/2009/07/tf84037-there-was-problem-initializing.html
After searching for ages and trying out many different tools, I've found my answer to the vba version control problem here: https://stackoverflow.com/a/25984759/2780179
It's a simple excel addin for which the code can be found here
There are no duplicate modules after importing. It exports your code automatically, as soon as you save your workbook, without modifying any existing workbooks. It comes together with a vba code formatter.
Actually there only a handful of solutions to track and compare changes in macro code - most of those were named here already. I have been browsing the web and came across this new tool worth mentioning:
XLTools Version Control for VBA macros
- version control for Excel sheets and VBA modules
- preview and diff changes before committing a version
- great for collaborative work of several users on the same file (track who changed what/when/comments)
- compare versions and highlight changes in code line-by-line
- suitable for users who are not tech-savvy, or Excel-savvy for that matter
- version history is stored in Git-repository on your own PC - any version can be easily recovered
VBA code versions side by side, changes are visualized
You might have tried using Microsoft's Excel XML in zip container (.xlsx and .xslm) for version control and found the vba was stored in vbaProject.bin (which is useless for version control).
The solution is simple.
- Open the excel file with LibreOffice Calc
- In LibreOffice Calc
- File
- Save as
- Save as type: ODF Spreadsheet (.ods)
- Close LibreOffice Calc
- rename the new file's file extension from .ods to .zip
- create a folder for the spreadsheet in a GIT maintained area
- extract the zip into it's GIT folder
- commit to GIT
When you repeat this with the next version of the spreadsheet you'll have to make sure you make the folder's files exactly match those in the zip container (and don't leave any deleted files behind).
There is also a program called Beyond Compare that has a quite nice Excel file compare. I found a screenshot in chinese that briefly shows this:
There is a 30 day trial on their page
My company does a considerable amount of work in automating Microsoft Office solutions so I wrote a .DLL that will export the source of a solution each time a template is saved. It creates a folder named Source as a child of the folder where the template is saved, and beneath Source it creates a folder with the same name as the VBA Project. In the project folder it exports all of the source code for modules, classes, and user forms. This arrangement was chosen to make it easy to manage the source for large collections of templates. The DLL is able to unlock locked projects to gain access to the VBA project if you have a local configuration file or a global configuration file available. With this tool in use, the developers can work on templates to their hearts content and use their favorite revision control tool to manage their work. We use Git primarily in our environment and we keep the full template binary files as well as the VBA resources under revision control.
Here is a GitHub project that solves just points 1. and 4. of the OP's question: https://github.com/ColmBhandal/VbaMisc. It's a VC solution for the VBA modules only. It can be easily tailored to any project by replicating the project structure seen on GitHub & adding any modules to be put under VC to a whiteList defined in the ExportImport module. That module controls export & import of a whitelist of VBA modules, potentially including itself. See the GitHub repo for instructions on how to use.
I found a very simple solution to this question which meets my needs. I add one line to the bottom of all of my macros which exports a *.txt
file with the entire macro code each time it is run. The code:
ActiveWorkbook.VBProject.VBComponents("moduleName").Export"C:\Path\To\Spreadsheet\moduleName.txt"
(Found on Tom's Tutorials, which also covers some setup you may need to get this working.)
Since I'll always run the macro whenever I'm working on the code, I'm guaranteed that git will pick up the changes. The only annoying part is that if I need to checkout an earlier version, I have to manually copy/paste from the *.txt
into the spreadsheet.
It depends on what level of integration you want, I've used Subversion/TortoiseSVN which seems fine for simple usage. I have also added in keywords but there seems to be a risk of file corruption. There's an option in Subversion to make the keyword substitutions fixed length and as far as I understand it will work if the fixed length is even but not odd. In any case you don't get any useful sort of diff functionality, I think there are commercial products that will do 'diff'. I did find something that did diff based on converting stuff to plain text and comparing that, but it wasn't very nice.
It should work with most VCS (depending on other criteria you might choose SVN, CVS, Darcs, TFS, etc), however it will actually the complete file (because it is a binary format), meaning that the "what changed" question is not so easy to answer.
You can still rely on log messages if people complete them, but you might also try the new XML based formats from Office 2007 to gain some more visibility (although it would still be hard to weed through the tons of XML, plus AFAIK the XML file is zipped on the disk, so you would need a pre-commit hook to unzip it for text diff to work correctly).
VBA를 사용하여 개정 제어 스프레드 시트를 작성했습니다. 여러 사람이 BOM (Bill of Material) 또는 일정에 대해 작업하고 특정 시점에서 이전 개정의 추가, 삭제 및 업데이트를 표시하는 스냅 샷 개정을 작성하려는 엔지니어링 보고서에 더 적합합니다.
참고 : 내 사이트에서 다운로드하려면 로그인 해야하는 매크로 사용 통합 문서입니다 (OpenID 사용 가능)
모든 코드가 잠금 해제되었습니다.
참고 URL : https://stackoverflow.com/questions/131605/best-way-to-do-version-control-for-ms-excel
'Programing' 카테고리의 다른 글
Disney의 FastPass가 유효하고 유용한 대기열 이론입니까? (0) | 2020.05.31 |
---|---|
태깅을위한 데이터베이스 디자인 (0) | 2020.05.31 |
누구나 파이썬의 상대적 수입을 설명 할 수 있습니까? (0) | 2020.05.31 |
현재 상태와 일치하도록 AJAX 앱의 주소 표시 줄 URL 수정 (0) | 2020.05.31 |
Gradle 빌드 스크립트 종속성 (0) | 2020.05.31 |