-
Notifications
You must be signed in to change notification settings - Fork 2
/
art_vandelay.bas
133 lines (90 loc) · 3.55 KB
/
art_vandelay.bas
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
Option Explicit
Private Const DOCUMENT_FOLDER = "Archive\"
Private Const VBACODE_FOLDER = "VBACode\"
Private Const TEMP_ZIP = "\temp.zip"
Private Const EXTENSION = "xlsm"
Const vbext_ct_ClassModule = 2
Const vbext_ct_Document = 100
Const vbext_ct_MSForm = 3
Const vbext_ct_StdModule = 1
Public Sub cleanUp()
Dim VBComp As VBComponent
For Each VBComp In ActiveWorkbook.VBProject.VBComponents
If Right(VBComp.Name, 1) = "1" Then VBComp.Name = Left(VBComp.Name, Len(VBComp.Name) - 1)
Next
Debug.Print "Cleanup done!"
End Sub
Public Sub export()
'http://www.pretentiousname.com/excel_extractvba/index.html
Dim VBComp As VBComponent
Dim path As String
ensureDir folder
ensureDir folder & VBACODE_FOLDER
For Each VBComp In ActiveWorkbook.VBProject.VBComponents
If ext(VBComp) <> "" Then
ensureDir folder & VBACODE_FOLDER & subfolder(VBComp)
path = folder & VBACODE_FOLDER & subfolder(VBComp) & "\" & VBComp.Name & ext(VBComp)
Debug.Print "Exporting " & path
VBComp.export path
End If
Next
If Replace(ActiveWorkbook.Name, EXTENSION, "") = ".xlsm" Then
Dim fs As New FileSystemObject
fs.copyFile source:=ActiveWorkbook.path & "\" & ActiveWorkbook.Name, destination:=ActiveWorkbook.path & TEMP_ZIP, overwritefiles:=True
unzip destination:=folder & DOCUMENT_FOLDER, zipFileName:=ActiveWorkbook.path & TEMP_ZIP
fs.DeleteFile filespec:=ActiveWorkbook.path & TEMP_ZIP, force:=True
End If
Debug.Print "Exporting done!"
End Sub
Public Sub import()
cleanUp
' deletes all modules and classes
Dim VBComp As VBComponent
Dim path As String
For Each VBComp In ActiveWorkbook.VBProject.VBComponents
path = ""
Select Case VBComp.Type
Case vbext_ct_ClassModule
If VBComp.Name <> "VersionController" Then
path = folder & VBACODE_FOLDER & subfolder(VBComp) & "\" & VBComp.Name & ext(VBComp)
End If
Case vbext_ct_StdModule
If VBComp.Name <> "VersionControl" Then
path = folder & VBACODE_FOLDER & subfolder(VBComp) & "\" & VBComp.Name & ext(VBComp)
End If
End Select
If path <> "" Then
Debug.Print "Importing " & VBComp.Name
ActiveWorkbook.VBProject.VBComponents.import path
ActiveWorkbook.VBProject.VBComponents.Remove VBComp
End If
Next
Debug.Print "Importing done!"
End Sub
Private Sub ensureDir(path As String)
Dim fso As New Scripting.FileSystemObject
If Not fso.FolderExists(path) Then
fso.CreateFolder path:=path
End If
End Sub
Private Function ext(VBComp As VBComponent) As String
Select Case VBComp.Type
Case vbext_ct_ClassModule: ext = ".cls"
Case vbext_ct_Document: ext = ".cls"
Case vbext_ct_MSForm: ext = ".frm"
Case vbext_ct_StdModule: ext = ".bas"
Case Else: ext = ""
End Select
End Function
Private Function folder() As String
folder = ActiveWorkbook.path & "\"
End Function
Private Function subfolder(VBComp As VBComponent) As String
Select Case VBComp.Type
Case vbext_ct_ClassModule: subfolder = "Classes"
Case vbext_ct_Document: subfolder = "Documents"
Case vbext_ct_MSForm: subfolder = "Forms"
Case vbext_ct_StdModule: subfolder = "Modules"
Case Else: subfolder = ""
End Select
End Function