Cannot pass argument from control to sub and back

R

Revolvr

I'm at a loss here...

I have code associated with controls on a worksheet, which call
subroutines in other modules, and I am passing an argument, a string,
indicating the success or failure of the operations in that
subroutine. Then the string gets appended to a TextBox. But I am not
able to pass the string argument.

In Sheet1 I have
Private Sub dothings_Click()
'Dim smsg As String

Call messagetest(smsg)
‘ Here if I check the value of smsg, it is empty.
NewMsg1 (smsg) ‘ writes to a text box

End Sub

The subroutine messagetest is in another module. Messagetest sets the
smsg string to a value, however when returning the value becomes an
empty string.

Sub messagetest(smsg As String)
smsg = "message test set this string"
End Sub

If this sub is in the same module as the sheet code, it works. I have
tried declaring smsg as public, but still doesn't work. I've tried
passign byval, still doesn't work.

Why is this and is it possible to pass arguments between code
associated with a worksheet, and modules?


Thanks!
 
G

Gary''s Student

Dim the string in a standard module above any subs for functions.

This will make the string a global variable that all subs can "see"
 
N

Nigel

You cannot pass values back from a sub other than in public variables.

You can pass a value back from a function, the value assumes the value
assigned in the function and is referred to by the function name.

Private Sub dothings_Click

NewMsg1 = messagetest(smsg)

End Sub

Function messagetest(myMessage as string) as String
' set default reply message
messagetest = "Function Failed"

' refer to myMessage in this code
' your code here which also sets the return message if the code worked
messagetest = "Function Worked OK"

End Function

--

Regards,
Nigel
(e-mail address removed)



I'm at a loss here...

I have code associated with controls on a worksheet, which call
subroutines in other modules, and I am passing an argument, a string,
indicating the success or failure of the operations in that
subroutine. Then the string gets appended to a TextBox. But I am not
able to pass the string argument.

In Sheet1 I have
Private Sub dothings_Click()
'Dim smsg As String

Call messagetest(smsg)
‘ Here if I check the value of smsg, it is empty.
NewMsg1 (smsg) ‘ writes to a text box

End Sub

The subroutine messagetest is in another module. Messagetest sets the
smsg string to a value, however when returning the value becomes an
empty string.

Sub messagetest(smsg As String)
smsg = "message test set this string"
End Sub

If this sub is in the same module as the sheet code, it works. I have
tried declaring smsg as public, but still doesn't work. I've tried
passign byval, still doesn't work.

Why is this and is it possible to pass arguments between code
associated with a worksheet, and modules?


Thanks!
 
R

Revolvr

OK so I added

Dim smsg as string

at the top of the module. Also, in a couple of places I had a line
line:

messagetext (smsg)

instead of:

Call messagetext(smsg)

I had to change everything to a "Call".

So it seems to work, but I'm not sure I understand why, which seems to
be wrapped up in the differences between code in a module, and code
associated with a worksheet.

Thanks a lot!
 
J

Jim Thomlinson

There are 2 ways to pass a variable. One is byref and the other is byval.
ByVal passes a copy of the variable to the sub and so any changes to the
variable are lost when the sub ends. By ref passes the acual variable so any
changes to the variable are kept in the calling procedure after the called
procedure ends.

While global variables can be handy be very judisious in their useage. They
are a pain to debug because if at any point the value is wrong it can be very
difficult to know which procedure modified it last...
 

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