Клонирование объектов в VBA?
есть ли общий способ клонирования объектов в VBA? Чтобы я мог скопировать x в y вместо копирования только указателя?
Dim x As New Class1
Dim y As Class1
x.Color = 1
x.Height = 1
Set y = x
y.Color = 2
Debug.Print "x.Color=" & x.Color & ", x.Height=" & x.Height
под общим я подразумеваю что-то вроде Set y = CloneObject(x)
вместо того, чтобы создавать свой собственный метод для класса, копирующего его свойства один за другим.
3 ответов
хорошо, вот начало чего-то, что иллюстрирует это:
создать класс, называть это "Класс1":
Option Explicit
Public prop1 As Long
Private DontCloneThis As Variant
Public Property Get PrivateThing()
PrivateThing = DontCloneThis
End Property
Public Property Let PrivateThing(value)
DontCloneThis = value
End Property
Теперь нам нужно дать ему функцию клонирования. В другом модуле попробуйте следующее:
Явный Параметр
Public Sub makeCloneable()
Dim idx As Long
Dim line As String
Dim words As Variant
Dim cloneproc As String
' start building the text of our new function
cloneproc = "Public Function Clone() As Class1" & vbCrLf
cloneproc = cloneproc & "Set Clone = New Class1" & vbCrLf
' get the code for the class and start examining it
With ThisWorkbook.VBProject.VBComponents("Class1").CodeModule
For idx = 1 To .CountOfLines
line = Trim(.lines(idx, 1)) ' get the next line
If Len(line) > 0 Then
line = Replace(line, "(", " ") ' to make words clearly delimited by spaces
words = Split(line, " ") ' so we get split on a space
If words(0) = "Public" Then ' can't set things declared Private
' several combinations of words possible
If words(1) = "Property" And words(2) = "Get" Then
cloneproc = cloneproc & "Clone." & words(3) & "=" & words(3) & vbCrLf
ElseIf words(1) = "Property" And words(2) = "Set" Then
cloneproc = cloneproc & "Set Clone." & words(3) & "=" & words(3) & vbCrLf
ElseIf words(1) <> "Sub" And words(1) <> "Function" And words(1) <> "Property" Then
cloneproc = cloneproc & "Clone." & words(1) & "=" & words(1) & vbCrLf
End If
End If
End If
Next
cloneproc = cloneproc & "End Function"
' put the code into the class
.AddFromString cloneproc
End With
End Sub
запустите это, и следующее будет добавлено в Class1
Public Function Clone() As Class1
Set Clone = New Class1
Clone.prop1 = prop1
Clone.PrivateThing = PrivateThing
End Function
...что выглядит как начало. Много вещей, которые я бы убрал (и, вероятно, будет - это оказалось весело). Хорошее регулярное выражение для найдите атрибуты gettable/lettable/settable, рефакторинг в несколько небольших функций, код для удаления старых "клонированных" функций (и поместите новую в конец), что-то немного больше Stringbuilder-ish, чтобы высушить (не повторяйтесь) конкатенации, и тому подобное.
Скотт Уитлок опубликовал фантастический ответ!--2--> к этой проблеме по другому вопросу.
Я не думаю, что там что-то встроено, хотя было бы неплохо.
Я думаю, что должен быть, по крайней мере, способ создать метод клонирования автоматически с помощью редактора VBA. Посмотрим, смогу ли я взглянуть на него, когда уложу детей спать...