Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.02.2013, 15:56   #1
alex_079
Новичок
Джуниор
 
Регистрация: 13.02.2013
Сообщений: 2
По умолчанию Как присвоить один объект другому

Уважаемые форумчане прошу помочь по следующему вопросу:
У меня не получается присвоить один объект другому с одинаковым типом в VBA.
Поясняю - Создаю модуль класса, именую его "TEST" и наполняю нижеследующим кодом:

Public propertyInt As Integer
Public propertyBool As Boolean
Public propertyStr As String

Затем создаю модуль под именем Module1 и наполняю следующим содержимым:

Dim obj1 As New TEST
Dim obj2 As New TEST
Sub a()
obj1.propertyBool = False
obj1.propertyInt = 0
obj1.propertyStr = "a"
obj2.propertyBool = True
obj2.propertyInt = 1
obj2.propertyStr = "b"
obj1 = obj2
End Sub

Нажимаю F5 и запускаю процедуру a(). В результате появляется нижеследующая ошибка:

Run-time error '91':
Object doesn't support this property or method

Если же я вместо строчки obj1 = obj2 напишу Set obj1 = obj2 то в результате получу две ссылки (obj1 и obj2) на один и тот же объект.
А мне лишь нужно чтобы при операции присваивания одного объекта другому все свойства одного объекта присваивались свойствам другого объекта т.е. obj1.propertyBool = obj2.propertyBool, obj1.propertyInt = obj2.propertyInt, obj1.propertyStr = obj2.propertyStr. Подскажите как это правильно сделать в VBA?
alex_079 вне форума Ответить с цитированием
Старый 13.02.2013, 16:22   #2
doober
Старожил
 
Аватар для doober
 
Регистрация: 02.05.2009
Сообщений: 3,907
По умолчанию

Если я правильно вас понял

Код:

'''''TEST
Private p_Int As Integer
Private p_Bool As Boolean
Private p_Str As String

Public Property Get propertyInt() As Integer
propertyInt = p_Int
End Property

Public Property Let propertyInt(ByVal vNewValue As Integer)
p_Int = vNewValue
End Property
Public Property Get propertyStr() As String
 propertyStr = p_Str
End Property

Public Property Let propertyStr(ByVal vNewValue As String)
p_Str = vNewValue
End Property

Public Property Get propertyBool() As Boolean
propertyBool = p_Bool
End Property

Public Property Let propertyBool(ByVal vNewValue As Boolean)
p_Bool = vNewValue
End Property

Код:
Dim obj1 As New TEST
 Dim obj2 As New TEST
 Sub a()
 obj1.propertyBool = False
 obj1.propertyInt = 0
 obj1.propertyStr = "a"
 obj2.propertyBool = True
 obj2.propertyInt = 1
 obj2.propertyStr = "b"
 obj1.propertyBool = obj2.propertyBool
 obj1.propertyInt = obj2.propertyInt
obj1.propertyStr = obj2.propertyStr
  
 
 End Sub
Анализ,обработка данных Недорого
doober вне форума Ответить с цитированием
Старый 13.02.2013, 16:26   #3
doober
Старожил
 
Аватар для doober
 
Регистрация: 02.05.2009
Сообщений: 3,907
По умолчанию

Вариант №2

Код:
Private p_Int As Integer
Private p_Bool As Boolean
Private p_Str As String

Public Property Get propertyInt() As Integer
propertyInt = p_Int
End Property

Public Property Let propertyInt(ByVal vNewValue As Integer)
p_Int = vNewValue
End Property
Public Property Get propertyStr() As String
 propertyStr = p_Str
End Property

Public Property Let propertyStr(ByVal vNewValue As String)
p_Str = vNewValue
End Property

Public Property Get propertyBool() As Boolean
propertyBool = p_Bool
End Property

Public Property Let propertyBool(ByVal vNewValue As Boolean)
p_Bool = vNewValue
End Property

Public Sub Присвоить(ByVal X As TEST)
Me.propertyBool = X.propertyBool
Me.propertyInt = X.propertyInt
Me.propertyStr = X.propertyStr
End Sub



Код:
 Dim obj1 As New TEST
 Dim obj2 As New TEST
 Sub a()
 obj1.propertyBool = False
 obj1.propertyInt = 0
 obj1.propertyStr = "a"
 obj2.propertyBool = True
 obj2.propertyInt = 1
 obj2.propertyStr = "b"
 obj1.Присвоить obj2
 
 End Sub
Анализ,обработка данных Недорого
doober вне форума Ответить с цитированием
Старый 13.02.2013, 17:57   #4
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

или один раз это:
Код:
Sub SetO1toO2(Source, Destin)
  With Source
    Destin.propertyBool = .propertyBool
    Destin.propertyInt = .propertyInt
    Destin.propertyStr = .propertyStr
  End With
End Sub
а затем Ваше
Код:
Sub a()
  obj1.propertyBool = False
  obj1.propertyInt = 0
  obj1.propertyStr = "a"
  obj2.propertyBool = True
  obj2.propertyInt = 1
  obj2.propertyStr = "b"
  SetO1toO2 obj2, obj1
End Sub
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 13.02.2013, 18:50   #5
alex_079
Новичок
Джуниор
 
Регистрация: 13.02.2013
Сообщений: 2
По умолчанию

Большое спасибо Вам doober и IgorGO за примеры кода! Я воспользуюсь Вашим кодом. Просто я понадеялся что в VBA конструкция присваивания одного объекта другому может быть также лаконична как например в С++:
Код:
class c
{
public:
        int a;
        char b;
};

int main(int argc, char *argv[])
{
    c obj1, obj2;
    obj1.a = 0;
    obj1.b = 'a';
    obj2.a = 1;
    obj2.b = 'b';

    obj1 = obj2;

    return EXIT_SUCCESS;
}
Но по всей видимости механизм в VBA несколько иной. Буду привыкать) Еще раз спасибо за помощь!
alex_079 вне форума Ответить с цитированием
Старый 13.02.2013, 19:40   #6
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

Цитата:
Просто я понадеялся что в VBA конструкция присваивания одного объекта другому
тут Вам не Англия, тут надо глубже копать...
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
можно ли глобально присвоить объект переменной? budmit Microsoft Office Excel 17 28.04.2013 00:48
Как сделать так, чтобы при наведении мышкой на объект, который находится под другим, этот объект выходил на первый план? Zaza7 HTML и CSS 3 17.01.2013 10:23
Приклеить один блок к другому dichman HTML и CSS 1 15.08.2011 19:47
Как вставить диапазоны ячеек из разных файлов в один, но так чтобы они шли один ниже другого? Squarded Microsoft Office Excel 4 24.07.2011 19:24
Присвоить элементу значение текстовой строки так, чтоб строка была в два и более ряда, а не в один alex2008ean Паскаль, Turbo Pascal, PascalABC.NET 1 15.12.2008 05:31