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

Загрузите OpenXMLSDKTool, если у вас его еще нет, сравните файл со строками, не скрытыми в файле, со скрытыми строками. Я считаю, что он должен показать вам разницу в xml, а также в c #, используемом для его генерации. .

8
задан Mark Nold 20 October 2008 в 22:32
поделиться

2 ответа

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

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

... который похож на запуск. Много вещей, которые я очистил бы (и вероятно будет - эта забава, которой оказываются). Хорошее Регулярное выражение, чтобы найти, что доступные/сдаваемые внаем/устанавливаемые атрибуты, осуществляющие рефакторинг в несколько небольших функций, код, удаляют старые функции "Клона" (и помещают новую в конец), что-то немного больше Stringbuilder-выхода к DRY (не Повторяют Себя), конкатенации, материал как этот.

8
ответ дан 5 December 2019 в 12:14
поделиться

Я не думаю, что существует что-либо, встроил, хотя это будет хорошо.

Я думаю, что должен, по крайней мере, быть способ создать метод Клона автоматически с помощью Редактора VBA. Я буду видеть, могу ли я смотреть на него, после того как у меня есть дети для постельных принадлежностей...

1
ответ дан 5 December 2019 в 12:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: