Клонирование объектов в VBA?

Есть ли общий способ клонирования объектов 9X_clone в VBA? Чтобы я мог скопировать x в y вместо 9X_vba-macros копирования только указателя?

 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 

Под общим я 9X_vba-macros подразумеваю что-то вроде Set y = CloneObject(x), вместо того, чтобы 9X_visual-basic-applications создавать свой собственный метод для класса, копирующего 9X_clone его свойства одно за другим.

11
0
3
Общее количество ответов: 3

Ответ #1

Ответ на вопрос: Клонирование объектов в VBA?

Хорошо, вот начало того, что это иллюстрирует:

Создайте 9X_visual-basic-applications класс, назовите его "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 

Теперь нам 9X_clone нужно дать ему функцию Clone. В другом модуле 9X_vba попробуйте следующее:

Явный параметр

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 

Запустите 9X_vba это, и следующее будет добавлено в Class1

Public Function Clone() As Class1 Set Clone = New Class1 Clone.prop1 = prop1 Clone.PrivateThing = PrivateThing End Function 

... похоже, начало. Я 9X_visual-basic-applications бы много чего убрал (и, вероятно, сделаю 9X_visual-basic-applications это - оказалось, что это весело). Хорошее 9X_clone регулярное выражение для поиска атрибутов 9X_macros-vba gettable / lettable / settable, рефакторинга 9X_vba в несколько небольших функций, кода для 9X_clone удаления старых функций «Clone» (и добавления 9X_vba-macros новой в конец), чего-то более похожего на 9X_vba Stringbuilder-ish для DRY (Don ' t Repeat 9X_macros-vba Yourself) до конкатенаций и тому подобного.

10
0

Ответ #2

Ответ на вопрос: Клонирование объектов в VBA?

Скотт Уитлок опубликовал fantastic answer по этой проблеме 9X_vba по другому вопросу.

7
0

Ответ #3

Ответ на вопрос: Клонирование объектов в VBA?

Я не думаю, что есть что-то встроенное, хотя 9X_vba-macros было бы неплохо.

Я думаю, должен быть хотя 9X_visual-basic-applications бы способ автоматического создания метода 9X_clone Clone с помощью редактора VBA. Я посмотрю, смогу 9X_visual-basic-applications ли я взглянуть на него, когда уложу детей 9X_vba-macros спать ...

2
0