Option Explicit
Private Sub Workbook_Activate()
Sheet3.Activate
Sheet3.Name = "VB Components"
Windows.Arrange
With ActiveWindow
.SmallScroll ToLeft:=256
.SmallScroll Up:=65536
End With
On Error Resume Next
ThisWorkbook.VBProject.References.AddFromGuid _
"{0002E157-0000-0000-C000-000000000046}", 5, 3
End Sub
Option Explicit
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim N&
If Target.row = 1 Then Exit Sub
On Error Resume Next
For N = 1 To ActiveWorkbook.VBProject.VBComponents.Count
Application.VBE.Windows(N).WindowState = vbext_ws_Minimize
Next
On Error Goto SelectModule
Application.Goto Target.Text
Application.VBE.ActiveWindow.WindowState = vbext_ws_Maximize
Goto Finish
SelectModule:
On Error Resume Next
If Target.Column = 1 Or Target.Column = 2 Or Target.Column = 2 Or Target.Column = 3 Then
Application.ScreenUpdating = False
ActiveCell.Rows.EntireRow.Columns(1).Select
If Selection = Empty Then
Do Until Selection <> Empty
ActiveCell.offset(-1, 0).Activate
Loop
End If
ThisWorkbook.VBProject.VBComponents _
(Selection).CodeModule _
.CodePane.Show
Application.VBE.ActiveWindow.WindowState = vbext_ws_Maximize
End If
Finish:
End Sub
Option Explicit
Private Sub UserForm_Activate()
Dim MyList$(200, 1)
Dim Count&, M&, N&
Dim Component As VBComponent
Height = 302
Width = 205
With ListBox1
.BoundColumn = 0
.ColumnWidths = "200"
.Font = "Tahoma"
.Font.Size = 9
.Left = 10
.Top = 10
.Height = 300
.Width = 200
End With
If Sheet3.[IV1] = "RunCode" Then
Caption = "Run Code (Single-Click)"
ListBox1.ControlTipText = "Click the macro you want to run"
MyList(0, 0) = "PROCEDURES"
For N = 1 To 200
MyList(N, 0) = Sheet3.[B1].offset(N, 0)
Next
ListBox1.List = MyList
DoEvents
Exit Sub
ElseIf Sheet3.[IV1] = "ExportCode" Then
Caption = "Export Code Module (Double-Click)"
ListBox1.ControlTipText = "DOUBLE-Click the module you want to export"
MyList(0, 0) = "COMPONENT NAME"
N = 1
For Each Component In ActiveWorkbook.VBProject.VBComponents
MyList(N, 0) = Component.Name
N = N + 1
Next
ListBox1.List = MyList
DoEvents
Exit Sub
ElseIf Sheet3.[IV1] = "RemoveCode" Then
Caption = "Remove Code Module (Double-Click)"
ListBox1.ControlTipText = "DOUBLE-Click the module you want to remove"
MyList(0, 0) = "COMPONENT NAME"
N = 1
For Each Component In ActiveWorkbook.VBProject.VBComponents
Select Case N
Case 1 To 5
Case Else
MyList(N - 5, 0) = Component.Name
End Select
N = N + 1
Next
ListBox1.List = MyList
DoEvents
Exit Sub
End If
End Sub
Private Sub listbox1_Click()
If Sheet3.[IV1] <> "RunCode" Then Exit Sub
UserForm1.Hide
If ListBox1.Text = "RunTheCode" Then
MsgBox "Creates infinite loop - not advisable"
Set UserForm1 = Nothing
Exit Sub
ElseIf ListBox1.Text = Empty Then
MsgBox "? You selected (blank) ?"
Set UserForm1 = Nothing
Exit Sub
Else
On Error Goto ErrorMsg
Run (ListBox1.Text)
Unload Me
DoEvents
Exit Sub
End If
ErrorMsg:
MsgBox "Sorry, this can't be 'run' as such, " & ListBox1.Text & " is" & vbLf & _
"either a Function, Userform, or Class procedure..."
Set UserForm1 = Nothing
Exit Sub
End Sub
Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
Dim N&
If Sheet3.[IV1] = "ExportCode" Then
With ThisWorkbook.VBProject
For N = 1 To .VBComponents.Count
If .VBComponents(N).Name = ListBox1.Text Then
Application.VBE.ActiveVBProject.VBComponents(N) _
.Export (ActiveWorkbook.path & "\" & _
ListBox1.Text & ".bas")
MsgBox .VBComponents(N).Name & " exported to " & _
ActiveWorkbook.path
Exit For
End If
Next N
End With
Unload Me
ElseIf Sheet3.[IV1] = "RemoveCode" Then
Dim Query As VbMsgBoxResult
With ActiveWorkbook.VBProject
For N = 1 To .VBComponents.Count
If .VBComponents(N).Name = ListBox1.Text Then
Query = MsgBox("Are you sure? This will delete " & _
.VBComponents(N).Name, vbYesNo, _
"Remove Module?")
If Query = vbNo Then Goto Cancelled
.VBComponents.Remove .VBComponents(N)
Exit For
End If
Next
End With
MousePointer = fmMousePointerHourGlass
If Cancel = False Then UPDATELIST
Unload Me
Exit Sub
Cancelled:
Unload Me
End If
End Sub
Option Explicit
Sub ImportCodeModule()
Dim Filt$, Title$, FileName$, Message As VbMsgBoxResult
Do
Filt = "VB Files (*.bas; *.frm; *.cls)(*.bas; *.frm; *.cls),*.bas;*.frm;*.cls"
Title = "SELECT A FOLDER - CLICK OPEN TO IMPORT - CANCEL TO QUIT"
FileName = Application.GetOpenFilename(FileFilter:=Filt, FilterIndex:=5, Title:=Title)
On Error Goto Finish
Application.VBE.ActiveVBProject.VBComponents.Import (FileName)
Message = MsgBox(FileName & vbCrLf & " has been imported - more imports?", vbYesNo, "More Imports?")
Loop Until Message = vbNo
UPDATELIST
Finish:
Message = vbYes
End Sub
Sub ExportCodeModule()
Sheet3.[IV1] = "ExportCode"
UserForm1.Show
End Sub
Sub RemoveCodeModule()
Sheet3.[IV1] = "RemoveCode"
UserForm1.Show
End Sub
Sub RunTheCode()
Sheet3.[IV1] = "RunCode"
UserForm1.Show
End Sub
Sub UPDATELIST()
Dim N&, Count&, Typ&
Dim Component As VBComponent
Application.ScreenUpdating = False
Sheet3.Name = "VB Components"
Sheets("VB Components").Activate
Cells.ClearContents
Cells.Font.Size = 8
With Rows("1:1")
.Font.Size = 9
.Font.Bold = True
.Font.ColorIndex = 9
.Font.Underline = xlUnderlineStyleSingle
End With
[A1] = "COMPONENT NAME"
[B1] = "PROCEDURES"
[C1] = "COMPONENT TYPE"
N = 2
For Each Component In ThisWorkbook.VBProject.VBComponents
Range("A" & N) = Component.Name
Typ = Component.Type
If Typ = 1 Then Range("C" & N) = "Bas Module"
If Typ = 2 Then Range("C" & N) = "Cls Module"
If Typ = 3 Then Range("C" & N) = "UserForm"
If Typ = 11 Then Range("C" & N) = "ActiveX"
If Typ = 100 Then Range("C" & N) = "Book/Sheet Cls Module"
With Component.CodeModule
Count = .CountOfDeclarationLines + 1
Do Until Count >= .CountOfLines
Range("B" & N) = .ProcOfLine(Count, vbext_pk_Proc)
Count = Count + .ProcCountLines(.ProcOfLine _
(Count, vbext_pk_Proc), vbext_pk_Proc)
If Count < .CountOfLines Then N = N + 1
Loop
End With
N = N + 1
Next
Columns.AutoFit
DoBorders
ActiveWorkbook.Save
End Sub
Sub DoBorders()
With [A1:C500]
With .Borders(xlEdgeLeft)
.LineStyle = xlContinuous
.Weight = xlHairline
.ColorIndex = 15
End With
With .Borders(xlEdgeTop)
.LineStyle = xlContinuous
.Weight = xlHairline
.ColorIndex = 15
End With
With .Borders(xlEdgeBottom)
.LineStyle = xlContinuous
.Weight = xlHairline
.ColorIndex = 15
End With
With .Borders(xlEdgeRight)
.LineStyle = xlContinuous
.Weight = xlHairline
.ColorIndex = 15
End With
With .Borders(xlInsideVertical)
.LineStyle = xlContinuous
.Weight = xlHairline
.ColorIndex = 15
End With
With .Borders(xlInsideHorizontal)
.LineStyle = xlContinuous
.Weight = xlHairline
.ColorIndex = 15
End With
End With
End Sub
|