Реализация передачи объекта в юзерформу, его редактирования, возврата

Есть класс testObj. Его содержимое:

option explicit
public value1 as string
public value2 as string

Есть форма testForm, содержащая текстбоксы Tb1 и Tb2

Нужно передать этот экземпляр класса в юзерформу, отредактировать его там, и если он пройдет валидацию - обновить первоначальный объект. Вопрос в том, что передача объекта через Set происходит по ссылке, т.е. изменения в дочернем объекте автоматически появляются в родительском, а хотелось бы сначала изменения записать "в черновик", т.е. в независимый экземпляр объекта testObj, проверить его там, а уже потом изменить первоначальный.

Код, который у меня работает сейчас "задерживает" внесение изменений в объект до самого закрытия юзерформы. Примерно так:

Код модуля:

Public objectToPass As New testObj

Sub test()
    
    objectToPass.value1 = "abc"
    objectToPass.value2 = "def"

    Dim form As New testForm
    form.Show

End Sub

Код юзерформы:

Private formIsValid As Boolean

Private Sub UserForm_Activate()
    Tb1.text = objectToPass.value1
    Tb2.text = objectToPass.value2
End Sub



Private Sub UserForm_Terminate()
    'код валидации
    formIsValid = True
    If formIsValid Then
        objectToPass.value1 = Tb1.text
        objectToPass.value2 = Tb2.text
    End If
End Sub

Как хочется чтобы было:

Код модуля:

Public objectToPass As New testObj

Sub test()
    
    objectToPass.value1 = "abc"
    objectToPass.value2 = "def"

    Dim form As New testForm
    'Передается по ссылке, поэтому не сработает
    set form.internalObj = objectToPass
    form.Show

End Sub

Код юзерформы:

'экземпляр объекта-черновика
Private formIsValid As Boolean
public internalObj as testObj

private Sub formEditing   
    'код, который редактирует объект внутри формы
    Tb1.Text = "foo"
    Tb2.Text = "bar"
    internalObj.value1  = Tb1.text
    internalObj.value2 = Tb2.text

End Sub

Private Sub UserForm_Terminate()
    'код валидации отредактированного объекта
    formIsValid = True
    If formIsValid Then
        set objectToPass = internalObj
    End If
End Sub

Я хотел бы использовать клонирование объекта для этой задачи, но как понимаю простого способа клонирования объектов в VBA нет. Что я принципиально понимаю не так, и как правильно решить эту проблему?


Ответы (0 шт):