Option Explicit
'
'referencje do: Microsoft Visual Basic for Applications Extensibility 5.3
'
'źródło wiedzy: http://www.cpearson.com/excel/vbe.aspx
'
Sub test()
Dim ws
As Worksheet
'wstawienie nowego arkusza ale może to być istniejący arkusz w innym pliku
Set ws = Worksheets.Add
ws.Name = "Nowy Arkusz"
Copy_Event_Procedure Worksheets("wzor"), ws, "SelectionChange"
End Sub
Sub Copy_Event_Procedure(shS
As Worksheet, shD
As Worksheet, EventName
As String)
On Error GoTo Copy_Event_Procedure_Error
'moduł arkusza źródłowego shS
Dim CodeMod
As VBIDE.CodeModule
Set CodeMod = shS.Parent.VBProject.VBComponents(shS.CodeName).CodeModule
'nazwa procedury obsługi zdarzenia
Dim ProcName
As String
ProcName = "Worksheet_" & EventName
With CodeMod
Dim StartLine
As Long
StartLine = .ProcStartLine(ProcName, vbext_pk_Proc)
Dim NumLines
As Long
NumLines = .ProcCountLines(ProcName, vbext_pk_Proc)
'pobranie kodu procedury do zmiennej tekstowej
Dim ProcCode
As String
ProcCode = .Lines(StartLine:=StartLine, Count:=NumLines)
End With
'=== Oczyszczenie kodu procedury z pustych linii i nagłówka
'kod liniami do tablicy
Dim T
T = Split(ProcCode, vbCrLf)
ProcCode = ""
Dim i
As Integer
For i = 0
To UBound(T)
Dim s
As String
s = Trim(T(i))
If Not (s = ""
Or Left(s, 11) = "Private Sub"
Or Left(s, 7) = "End Sub") _
Then
ProcCode = ProcCode & T(i) & vbCrLf
End If
Next
'===
'MsgBox ProcCode
'moduł arkusza docelowego shD
Set CodeMod = shD.Parent.VBProject.VBComponents(shD.CodeName).CodeModule
With CodeMod
Dim LineNum
As Long
'utworzenie nagłówka prodcedury zdarzeniowej
LineNum = .CreateEventProc(EventName, "Worksheet")
LineNum = LineNum + 1
'wstawienie kodu procedury
.InsertLines LineNum, ProcCode
End With
On Error GoTo 0
Exit
Sub
Copy_Event_Procedure_Error:
MsgBox "Error " & Err.Number & " (" & Err.Description & _
") in procedure Copy_Event_Procedure"
End Sub