Home |
Search |
Today's Posts |
|
#1
![]()
Posted to microsoft.public.excel.programming
|
|||
|
|||
![]()
Hi all,
Is there any way to pass an object (created from a custom Class) by Value in VBA..? I have tried using the ByVal keyword in my procedure but the object is still being passed by reference (the original object is modified in the procedure code). Here's my code: For the Class module (called Test): Private classVar1 As String Property Get Number() As String Number = classVar1 End Property Property Let Number(ByVal newvalue As String) classVar1 = newvalue End Property In the main Module: Private Test1 As Test Private Sub Initiate() Set Test1 = New Test Let Test1.Number = "1" Call AnotherSub(Test1) MsgBox Test1.Number 'Shows 2 not 1 even though it should be passed ByVal, not ByRef End Sub Private Sub AnotherSub(ByVal t As Test) Let t.Number = "2" End Sub How do I force VBA to pass this Class ByVal or can't it be done..? Thanks, Lyndon. |
#2
![]()
Posted to microsoft.public.excel.programming
|
|||
|
|||
![]()
Objects are always passed by reference, not value. Why do you need to, the
code should control it? -- --- HTH Bob (change the xxxx to gmail if mailing direct) "Lyndon" wrote in message oups.com... Hi all, Is there any way to pass an object (created from a custom Class) by Value in VBA..? I have tried using the ByVal keyword in my procedure but the object is still being passed by reference (the original object is modified in the procedure code). Here's my code: For the Class module (called Test): Private classVar1 As String Property Get Number() As String Number = classVar1 End Property Property Let Number(ByVal newvalue As String) classVar1 = newvalue End Property In the main Module: Private Test1 As Test Private Sub Initiate() Set Test1 = New Test Let Test1.Number = "1" Call AnotherSub(Test1) MsgBox Test1.Number 'Shows 2 not 1 even though it should be passed ByVal, not ByRef End Sub Private Sub AnotherSub(ByVal t As Test) Let t.Number = "2" End Sub How do I force VBA to pass this Class ByVal or can't it be done..? Thanks, Lyndon. |
#3
![]()
Posted to microsoft.public.excel.programming
|
|||
|
|||
![]()
I don't think it can be done. How about declaring a new
instance of Test, e.g. Test1c and set its property values equal to those of Test1? Do the latter with something like this: Sub CopyTestObj(x As Test, x2 As Test) With x2 .Number = x.Number End With End Sub Hth, Merjet |
#4
![]()
Posted to microsoft.public.excel.programming
|
|||
|
|||
![]()
At serious risk of being castigated by both Bob and Jim, you can pass
objects ByVal or ByRef. However in your example you are not changing the reference to your class to a different instance of your class, merely changing a property of the one and only class. This might demonstrate. Sub aaa() Dim rA As Range, rB As Range Set rA = Range("A1") Set rB = Range("A2") rA.Value = 1: rB.Value = 2 foo rA, rB MsgBox rA.Address, , rA.Value MsgBox rB.Address, , rB.Value End Sub Function foo(ByRef r1 As Range, ByVal r2 As Range) Set r1 = Range("B1") Set r2 = Range("B2") r1.Value = 10: r2.Value = 20 End Function Regards, Peter T "Lyndon" wrote in message oups.com... Hi all, Is there any way to pass an object (created from a custom Class) by Value in VBA..? I have tried using the ByVal keyword in my procedure but the object is still being passed by reference (the original object is modified in the procedure code). Here's my code: For the Class module (called Test): Private classVar1 As String Property Get Number() As String Number = classVar1 End Property Property Let Number(ByVal newvalue As String) classVar1 = newvalue End Property In the main Module: Private Test1 As Test Private Sub Initiate() Set Test1 = New Test Let Test1.Number = "1" Call AnotherSub(Test1) MsgBox Test1.Number 'Shows 2 not 1 even though it should be passed ByVal, not ByRef End Sub Private Sub AnotherSub(ByVal t As Test) Let t.Number = "2" End Sub How do I force VBA to pass this Class ByVal or can't it be done..? Thanks, Lyndon. |
#5
![]()
Posted to microsoft.public.excel.programming
|
|||
|
|||
![]()
Castigation coming <g.
The object is not copied and passed to the called routine when passed as ByVal, the reference to the object is passed by value instead of reference. As you clearly demonstrate, even though the object itself is not changed, a property of the object is changed, hence no copy. -- --- HTH Bob (change the xxxx to gmail if mailing direct) "Peter T" <peter_t@discussions wrote in message ... At serious risk of being castigated by both Bob and Jim, you can pass objects ByVal or ByRef. However in your example you are not changing the reference to your class to a different instance of your class, merely changing a property of the one and only class. This might demonstrate. Sub aaa() Dim rA As Range, rB As Range Set rA = Range("A1") Set rB = Range("A2") rA.Value = 1: rB.Value = 2 foo rA, rB MsgBox rA.Address, , rA.Value MsgBox rB.Address, , rB.Value End Sub Function foo(ByRef r1 As Range, ByVal r2 As Range) Set r1 = Range("B1") Set r2 = Range("B2") r1.Value = 10: r2.Value = 20 End Function Regards, Peter T "Lyndon" wrote in message oups.com... Hi all, Is there any way to pass an object (created from a custom Class) by Value in VBA..? I have tried using the ByVal keyword in my procedure but the object is still being passed by reference (the original object is modified in the procedure code). Here's my code: For the Class module (called Test): Private classVar1 As String Property Get Number() As String Number = classVar1 End Property Property Let Number(ByVal newvalue As String) classVar1 = newvalue End Property In the main Module: Private Test1 As Test Private Sub Initiate() Set Test1 = New Test Let Test1.Number = "1" Call AnotherSub(Test1) MsgBox Test1.Number 'Shows 2 not 1 even though it should be passed ByVal, not ByRef End Sub Private Sub AnotherSub(ByVal t As Test) Let t.Number = "2" End Sub How do I force VBA to pass this Class ByVal or can't it be done..? Thanks, Lyndon. |
#6
![]()
Posted to microsoft.public.excel.programming
|
|||
|
|||
![]()
Castigation coming <g.
Was anticipating, and came back to leathered up and prepared !! But we're all agreed so I can stand down <g Regards, Peter T "Bob Phillips" wrote in message ... Castigation coming <g. The object is not copied and passed to the called routine when passed as ByVal, the reference to the object is passed by value instead of reference. As you clearly demonstrate, even though the object itself is not changed, a property of the object is changed, hence no copy. -- --- HTH Bob (change the xxxx to gmail if mailing direct) "Peter T" <peter_t@discussions wrote in message ... At serious risk of being castigated by both Bob and Jim, you can pass objects ByVal or ByRef. However in your example you are not changing the reference to your class to a different instance of your class, merely changing a property of the one and only class. This might demonstrate. Sub aaa() Dim rA As Range, rB As Range Set rA = Range("A1") Set rB = Range("A2") rA.Value = 1: rB.Value = 2 foo rA, rB MsgBox rA.Address, , rA.Value MsgBox rB.Address, , rB.Value End Sub Function foo(ByRef r1 As Range, ByVal r2 As Range) Set r1 = Range("B1") Set r2 = Range("B2") r1.Value = 10: r2.Value = 20 End Function Regards, Peter T "Lyndon" wrote in message oups.com... Hi all, Is there any way to pass an object (created from a custom Class) by Value in VBA..? I have tried using the ByVal keyword in my procedure but the object is still being passed by reference (the original object is modified in the procedure code). Here's my code: For the Class module (called Test): Private classVar1 As String Property Get Number() As String Number = classVar1 End Property Property Let Number(ByVal newvalue As String) classVar1 = newvalue End Property In the main Module: Private Test1 As Test Private Sub Initiate() Set Test1 = New Test Let Test1.Number = "1" Call AnotherSub(Test1) MsgBox Test1.Number 'Shows 2 not 1 even though it should be passed ByVal, not ByRef End Sub Private Sub AnotherSub(ByVal t As Test) Let t.Number = "2" End Sub How do I force VBA to pass this Class ByVal or can't it be done..? Thanks, Lyndon. |
Reply |
Thread Tools | Search this Thread |
Display Modes | |
|
|
![]() |
||||
Thread | Forum | |||
Working with the range object | Excel Discussion (Misc queries) | |||
Working with a Range object | Excel Programming | |||
Pass a form Listbox as an object | Excel Programming | |||
fileformat not working with Object | Excel Programming | |||
How to pass valve in combobox object to cell | Excel Programming |