This is a classic gotcha in VB6. It is explained in the VB6 manual. In this code below, VB6 treats the argument as an expression (Test) rather than a variable reference
TestFunction (Test)
In order to pass a reference to the variable either omit the brackets or use the legacy Call
statement (which requires brackets)
TestFunction Test
Call TestFunction(Test)
VB6 allows you to pass expressions to ByRef
arguments even if the method changes them. Eg you can write
TestFunction (Test + 2)
The compiler creates a temporary copy and passes that by reference. VB.Net uses brackets in a similar way.
You can also get the compiler to create temporary copies if TestFunction takes two arguments like this:
TestFunction (one), (two)
And you can get temporary copies even with Call
if you double your brackets, adding an extra unecessary pair:
Call TestFunction((Test))