Passing variables back to main procedure

G

Guest

I've a subroutine that calls another and passes a variable to it. However
within the 'called' sub is a variable that I would like to pass back to the
main sub. I know that this could be accomplished using module-level
variables, but I'd like to know how to pass a variable 'backwards'.

Cheers.
 
J

Jon Peltier

Pass both ByRef to the called sub. One has a value, and the other may or may
not. After the called sub runs, the passed variables take on any changed
values.

Sub CallingSub()
Dim PassedValue As Long
Dim ReturnedValue As Long

PassedValue = 1

CalledSub PassedValue, Returned Value

MsgBox ReturnedValue
End Sub

Sub CalledSub(ByRef Passed As Long, ByRef Returned As Long)
Returned = 10 - Passed
End Sub

Often I use called sub as a function, and return true or false depending on
whether there were any errors:

Sub CallingSub()
Dim PassedValue As Long
Dim ReturnedValue As Long
Dim bTest As Boolean

PassedValue = 1

bTest = CalledFunc(PassedValue, ReturnedValue)

MsgBox ReturnedValue
End Sub

Function CalledFunc(ByRef Passed As Long, ByRef Returned As Long) As Boolean
Returned = 10 - Passed
CalledFunc = True
End Function

- Jon
 
G

Guest

Matt,

try passing it by reference to the called sub.. For example:

Sub Main()
Dim i As Integer
i = 1
Increment i
Debug.Print i
End Sub

Sub Increment(ByRef x As Integer)
x = x + 1
End Sub
 
C

Chip Pearson

You can't really do "pass backward" as such, but there are two alternative
methods you can use. The first is to make the called procedure a Function
not a Sub. A Function procedure can return a value to its caller. E.g.,

Sub Calling()
Dim Result As Long
Result = Called()
Debug.Print Result
End Sub

Function Called() As Long
' some code
Called = 1234
End Sub

The second method is to pass ByRef an argument to the Called procedure and
have the Called procedure set that value.

Sub Calling()
Dim L As Long
Called L
Debug.Print L
End Sub

Sub Called(ByRef LL As Long)
' some code
LL = 1234
End Sub

Because the parameter LL is declared ByRef the variable L in the Calling
procedure gets the value 1234. ByRef is the default method of passing
parameters so you don't necessarily need the ByRef keyword, but I usually
include it to emphasize that the parameter is going to be set by the called
procedure. The name of the parameter (LL in the example) need not have the
same name as the variable in the Calling procedure (L in the example).


--
Cordially,
Chip Pearson
Microsoft MVP - Excel
Pearson Software Consulting
www.cpearson.com
(email on the web site)
 
G

Guest

Cheers gents - I hadn't realised that passed variables took on the values
determined in the called sub.
 
J

Jon Peltier

They do when passed ByRef, not when passed ByVal. Of course, ByRef is the
default....

- Jon
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top