Reply
 
LinkBack Thread Tools Search this Thread Display Modes
  #1   Report Post  
Posted to microsoft.public.excel.programming
external usenet poster
 
Posts: 4
Default Pass object by value not working...

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   Report Post  
Posted to microsoft.public.excel.programming
external usenet poster
 
Posts: 1,726
Default Pass object by value not working...

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   Report Post  
Posted to microsoft.public.excel.programming
external usenet poster
 
Posts: 812
Default Pass object by value not working...

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   Report Post  
Posted to microsoft.public.excel.programming
external usenet poster
 
Posts: 5,600
Default Pass object by value not working...

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   Report Post  
Posted to microsoft.public.excel.programming
external usenet poster
 
Posts: 1,726
Default Pass object by value not working...

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   Report Post  
Posted to microsoft.public.excel.programming
external usenet poster
 
Posts: 5,600
Default Pass object by value not working...

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
Search this Thread:

Advanced Search
Display Modes

Posting Rules

Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are On


Similar Threads
Thread Thread Starter Forum Replies Last Post
Working with the range object [email protected] Excel Discussion (Misc queries) 1 November 26th 07 04:29 PM
Working with a Range object LF Excel Programming 14 December 12th 06 05:45 AM
Pass a form Listbox as an object Brian Excel Programming 2 November 18th 05 11:51 PM
fileformat not working with Object Nancy[_4_] Excel Programming 1 September 27th 04 01:35 PM
How to pass valve in combobox object to cell chanon Excel Programming 3 October 15th 03 04:25 AM


All times are GMT +1. The time now is 08:14 AM.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Copyright ©2004-2025 ExcelBanter.
The comments are property of their posters.
 

About Us

"It's about Microsoft Excel"