หากคุณต้องการติดตามโค้ดใน 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
UserForms สามารถส่งออกและนำเข้าเช่นเดียวกับรหัส VBA ข้อแตกต่างเพียงอย่างเดียวคือไฟล์สองไฟล์จะถูกสร้างขึ้นเมื่อฟอร์มถูกส่งออก (คุณจะได้รับ.frm
และ.frx
ไฟล์สำหรับแต่ละ UserForm) หนึ่งในนั้นมีซอฟต์แวร์ที่คุณเขียนและอีกอันเป็นไฟล์ไบนารีซึ่ง (ฉันค่อนข้างแน่ใจ) กำหนดเค้าโครงของแบบฟอร์ม
Microsoft Excel วัตถุ (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\"