relsloan
asked on
Excel function that returns a reference to an object
I want to pass an object to a function and have the function return a reference to the object. I'm new at vb, can this be done?
Type dt
name As String
value As Integer
End Type
Sub test()
Dim v As dt, temp As dt
Set v = New dt
v.name = "pear"
set temp = t(v) 'make temp and v point to the same object
temp.name = "orange" ' this should change v.name too
Range("a1").value = v.name 'make sure it worked
End Sub
Function t(ByRef a As dt) As dt
set t = a ' assign the location in memory of a to t
End Function
Type dt
name As String
value As Integer
End Type
Sub test()
Dim v As dt, temp As dt
Set v = New dt
v.name = "pear"
set temp = t(v) 'make temp and v point to the same object
temp.name = "orange" ' this should change v.name too
Range("a1").value = v.name 'make sure it worked
End Sub
Function t(ByRef a As dt) As dt
set t = a ' assign the location in memory of a to t
End Function
Maybe if you explain a bit in simply words what you need.
What kind of object must returns and what kind of object you will pass...
What kind of object must returns and what kind of object you will pass...
To this point:
Type dt
name As String
value As Integer
End Type
Sub test()
Dim v As dt, temp As dt
v.name = "pear"
...
....
...
Type dt
name As String
value As Integer
End Type
Sub test()
Dim v As dt, temp As dt
v.name = "pear"
...
....
...
ASKER
My code does not work as I'm new to vb. I want to pass any object (reading the help, I don't think I can pass a string and return a pointer to a string - can I?). I thought that declaring a new type was the same as declaring a new type of object. You can disregard the dt type and make a new object that you can pass to the function and have the function return a pointer to that object. Just make sure the object contains a string field, and use the pointer that returns from the function to access the object to change the string. Then print the new string using the old object that you passed to the function.
You can pass a variable by reference in which case it is in effect a pointer.
Sub test()
Dim strVal1 as string
strVal1 = "test1"
test2 strVal1
MsgBox strVal1
End Sub
Function test2(ByRef strVal as String) as Boolean
strVal = "test2"
test2 = True
End Funciton
Teh result of the previous code will be a message box with strVal1 = to "test2"
Sub test()
Dim strVal1 as string
strVal1 = "test1"
test2 strVal1
MsgBox strVal1
End Sub
Function test2(ByRef strVal as String) as Boolean
strVal = "test2"
test2 = True
End Funciton
Teh result of the previous code will be a message box with strVal1 = to "test2"
ASKER
I want to be able to have two variables in sub that refer to the same object (call them a and b). a should be created in the sub and b should be set to point to object a in the function. When I return from the function(in the sub), I want to be able to assign something to b, which should, in affect assign the same thing to a since they are both the same object.
if i understood:
dim a as object, c as object
set a = MakeSame(c)
function MakeSame(x as object) as object
dim b as object
'example?
dim xl as excel.application
set b = new excel.application
set MakeSame = b
end function
Why do you need this anyway?
dim a as object, c as object
set a = MakeSame(c)
function MakeSame(x as object) as object
dim b as object
'example?
dim xl as excel.application
set b = new excel.application
set MakeSame = b
end function
Why do you need this anyway?
ASKER
I want to pass an array to a function and have the function return an element. Then I want to be able to do stuff to that element (so that the array is also updated with those changes), but not know which memeber of the array I am changing.
I figured out that you can only use set to set an object so I made a new class module- dt:
Dim val As String
Property Get value() As String
value = val
End Property
Property Let value(v As String)
val = v
End Property
Sub test()
Dim d As dt, temp As dt
Set d = New dt
d.value = "apple"
Set temp = t(d)
temp.value = "pear"
Range("a1").value = temp.value
End Sub
Function t(ByRef a As dt) As dt
Set t = a
End Function
I figured out that you can only use set to set an object so I made a new class module- dt:
Dim val As String
Property Get value() As String
value = val
End Property
Property Let value(v As String)
val = v
End Property
Sub test()
Dim d As dt, temp As dt
Set d = New dt
d.value = "apple"
Set temp = t(d)
temp.value = "pear"
Range("a1").value = temp.value
End Sub
Function t(ByRef a As dt) As dt
Set t = a
End Function
if you will go to work with arrays of elements, i suggest that instead of an array use a collection class.
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
I think you cannot use new to instantiante a type (it is not an object, just a structure of data)