Реализация передачи объекта в юзерформу, его редактирования, возврата
Есть класс 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 нет. Что я принципиально понимаю не так, и как правильно решить эту проблему?