Excel / Access项目添加到源版本控制(Git)存储库
大多数项目都是以Excel / Access为平台在VBA中构建的,开发人员认为很难在一组开发人员之间共享项目并跟踪所做的更改。在早期,这可以在Microsoft VSS中作为Microsoft的外接程序库来完成,即使TFS提供了相同的技术,但是VSS / TFS的局限性以及与Git的比较也可以作为版本控制系统,这为开发人员提供了广泛的好处通过共享项目代码并跟踪开发人员之间所做的更改。这就是为什么Git是首选的选择存储库,并且它是免费的。
这里的平均问题是如何将所有VBA代码(例如(模块,类)和其他组件,例如表单,查询,报告,宏,工作表等)导出为文件,并将其不以二进制文件而是文本形式上传到Git系统。文件(源文件),并且易于跟踪更改,作为Git存储库系统中的版本控制。
当文件需要从文本文件上传回原始格式(例如二进制文件)时,也是如此。
注意:本文不是关于如何使用或安装Git的,而是关于如何准备VBA Project并将其设置为准备在Git系统中作为存储库提交的。
所提供的代码是在VBA中为Excel或Access构建的。
它包含一个功能,可以将Excel项目中的所有组件导出到Git系统中创建的选定源版本控制存储库文件夹中,或从中导入。
请创建一个名为“ mod_SVN
”的新模块,然后在模块中复制上下代码。
要导出所有文件代码,需要ExportAll
提供在Git中创建的SVN文件夹来存储所有项目文件代码,然后运行“ ”方法,还需要向Excel文件项目提供其路径。
要从Git存储库导入所有文件代码,它需要ImportAll
在提供在Git中具有所有文件代码的SVN文件夹后运行“ ”方法,还需要提供Excel文件名及其路径来保存VBA项目,还需要提供项目名称。注意,将源代码导入Excel文件时,请删除项目中的所有组件,或者以新的Excel文件开头以用作工作项目文件。
Public Sub ExportSourceFiles(strXLFilename As String, strSVCfolder As String)
Dim oWrkbook As Workbook
Dim oVBProject As VBProject, oVBComp As VBComponent, obj As Object
Dim strCompname As String, strFileExt As String, strProjFilename As String
'-open the selected excel file
Set oWrkbook = Workbooks.Open(strXLFilename)
strProjFilename = oWrkbook.VBProject.Name
Set oVBProject = Application.VBE.VBProjects(strProjFilename)
For Each oVBComp In oVBProject.VBComponents
If oVBComp.Type = vbext_ct_ClassModule Or _
oVBComp.Type = vbext_ct_StdModule Or oVBComp.Type = vbext_ct_MSForm Then
strCompname = oVBComp.Name
strFileExt = FileExtenstion(oVBComp.Type)
oVBComp.Export (strSVCfolder & strCompname & strFileExt)
End If
Next
Call ExportSheets(oWrkbook, strSVCfolder)
oWrkbook.Close False
getOut:
Set oWrkbook = Nothing
Set oVBProject = Nothing
Exit Sub
errHandler:
MsgBox Err.Description
GoTo getOut
Resume
End Sub
Private Sub ExportSheets(oWrkbook As Workbook, strSaveFolder As String)
Dim oSheet As Worksheet
Application.DisplayAlerts = False
For Each oSheet In oWrkbook.Worksheets
If Not (oSheet.Name = "ThisWorkbook") Then
oSheet.SaveAs strSaveFolder & oSheet.Name, xlCSV
End If
Next
Application.DisplayAlerts = True
End Sub
Private Function FileExtenstion(oCompType As vbext_ComponentType) As String
Select Case oCompType
Case vbext_ComponentType.vbext_ct_ClassModule
FileExtenstion = ".cls"
Case vbext_ComponentType.vbext_ct_StdModule
FileExtenstion = ".bas"
Case vbext_ComponentType.vbext_ct_MSForm
FileExtenstion = ".frm"
Case vbext_ComponentType.vbext_ct_ActiveXDesigner
FileExtenstion = ".des"
Case vbext_ComponentType.vbext_ct_Document
FileExtenstion = ".doc"
Case Else
FileExtenstion = vbNullString
End Select
getOut:
Exit Function
errHandler:
MsgBox Err.Description
GoTo getOut
Resume
End Function
Public Sub RemoveAllModules(oVBProject As VBProject)
'Dim oVBProject As VBProject
Dim comp As VBComponent
For Each comp In oVBProject.VBComponents
If comp.Type = vbext_ct_ClassModule Or _
comp.Type = vbext_ct_StdModule Or comp.Type = vbext_ct_MSForm Then
oVBProject.VBComponents.Remove comp
End If
Next
getOut:
Exit Sub
errHandler:
MsgBox Err.Description
GoTo getOut
Resume
End Sub
Private Sub RemoveAllSheets(oWrkbook As Workbook, strSaveFolder As String)
Dim oSheet As Worksheet
Application.DisplayAlerts = False
For Each oSheet In oWrkbook.Worksheets
If Not (oSheet.Name = "ThisWorkbook") Then
oSheet.Delete
End If
Next
Application.DisplayAlerts = True
getOut:
Exit Sub
errHandler:
MsgBox Err.Description
GoTo getOut
Resume
End Sub
'===============================
Sub ExportAll()
Dim strSVCfolder As String, strFileProjecName As String
strSVCfolder = "" ?????????????? please provide
strFileProjecName = "" ?????????????? please provide
Call ExportSourceFiles(strFileProjecName, strSVCfolder)
MsgBox "All component exported successfully "
getOut:
Exit Sub
errHandler:
MsgBox Err.Description
GoTo getOut
Resume
End Sub
Public Sub ImportAllComponents(strXLFilename As String, strSVCfolder As String)
Dim oWrkbook As Workbook
Dim oVBProject As VBProject
Dim strFilename As String, strProjFilename As String
On Error GoTo errHandler
Set oWrkbook = Workbooks.Open(strXLFilename)
strProjFilename = oWrkbook.VBProject.Name
Set oVBProject = Application.VBE.VBProjects(strProjFilename)
strFilename = Dir(strSVCfolder)
While (strFilename <> vbNullString)
If Not (LCase(Right(strFilename, 3)) = "csv" _
Or LCase(Right(strFilename, 3)) = "frx") Then
oVBProject.VBComponents.Import strSVCfolder & strFilename
End If
strFilename = Dir
Wend
getOut:
Exit Sub
errHandler:
MsgBox Err.Description
GoTo getOut
Resume
End Sub
Private Sub ImportAllSheets(strXLFilename As String, _
strSVCfolder As String, strProjectName As String)
'Dim oCSVWrkbook As Workbook
Dim oWrkbook As Workbook
Dim vFilename As Variant
Dim strFiletype As String
Dim nIndex As Integer
On Error GoTo errHandler
'Specify file type
strFiletype = "*.csv"
'open the workbook.
vFilename = Dir(strSVCfolder & strFiletype)
Set oWrkbook = Application.Workbooks.Open(strXLFilename)
oWrkbook.Activate
'Add Target Workbook
'Set oWrkbook = ActiveWorkbook 'Workbooks.Add
Application.VBE.VBProjects("VBAProject").Name = strProjectName
'Loop through each CSV file in folder
Do While vFilename <> ""
Worksheets.Add(Before:=Worksheets("Sheet1")).Name = Replace(vFilename, ".csv", "")
With ActiveSheet.QueryTables.Add(Connection:="TEXT;" & strSVCfolder & vFilename _
, Destination:=ActiveSheet.Range("$A$1"))
.Name = vFilename
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.TextFilePromptOnRefresh = False
.TextFilePlatform = 850
.TextFileStartRow = 1
.TextFileParseType = xlDelimited
.TextFileTextQualifier = xlTextQualifierDoubleQuote
.TextFileConsecutiveDelimiter = False
.TextFileTabDelimiter = False
.TextFileSemicolonDelimiter = False
.TextFileCommaDelimiter = True
.TextFileSpaceDelimiter = False
.TextFileColumnDataTypes = _
Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, )
.TextFileTrailingMinusNumbers = True
.Refresh BackgroundQuery:=False
End With
nIndex = nIndex + 1
vFilename = Dir
Loop
oWrkbook.SaveAs Filename:=strXLFilename, _
FileFormat:=xlOpenXMLWorkbookMacroEnabled, CreateBackup:=False
getOut:
Exit Sub
errHandler:
MsgBox Err.Description
GoTo getOut
Resume
End Sub
Sub test()
Dim strSVCfolder As String, strPojtname As String, strFilename As String
strSVCfolder = "" '?????????????? please provide
strPojtname = "" '????????????? please provide
strFilename = "" '?????????? please provide
Call ImportAllSheets(strFilename, strSVCfolder, strPojtname)
Call ImportAllComponents(strFilename, strSVCfolder)
MsgBox "All component imported successfully "
getOut:
Exit Sub
errHandler:
MsgBox Err.Description
GoTo getOut
Resume
End Sub
将VBA保存在Source Control Versioning Git中。
如何使用VSS和TFS进行VBA源代码控制-新版本的Office Git更加有用,而且是免费的。