是否有通用的方法来克隆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)
而不是必须为类逐个复制其属性创建自己的方法.
好的,这是说明它的东西的开始:
创建一个类,调用它,哦,"Class1":
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属性,重构为几个小函数,代码删除旧的"克隆"函数(并将新的函数放在最后),还有一些更多的字符串构建器 - 用于干(Don') t重复你自己)连接,这样的东西.
斯科特·惠特洛克在另一个问题上对这个问题发表了精彩的回答.