collectionToArray (col)
Notice that whitespace between the function's name and its argument list? That's the VBE telling you this:
I'll take that argument, evaluate it as a value, then pass it ByVal
to that procedure you're calling, even if the signature for that procedure says ByRef
, explicitly or not.
This "extraneous parentheses" habit is inevitably going to make you bump into weird "Object Required" runtime errors at one point or another: lose it.
The Function
is overdoing it IMO: a Variant
can perfectly well wrap an array, so I'd change its signature to return a Variant
instead of a Variant()
.
Integer
being a 16-bit signed integer type (i.e. short
in some other languages), it's probably a better idea to use a Long
instead (32-bit signed integer, i.e. int
in some other languages) - that way you'll avoid running into "Overflow" issues when you need to deal with more than 32,767 values (especially common if a worksheet is involved).
Public col As New Collection
This makes col
an auto-instantiated object variable, and it has potentially surprising side-effects. Consider this code:
Dim c As New Collection
c.Add 42
Set c = Nothing
c.Add 42
Debug.Print c.Count
What do you expect this code to do? If you thought "error 91, because the object reference is Nothing
", you've been bitten by auto-instantiation. Best avoid it, and keep declaration and assignments as separate instructions.
Other than that, CLR's answer has your solution: a Function
should return a value, that the calling code should consume.
result = MyFunction(args)
You'll notice the VBE clearing any whitespace you might be tempted to add between MyFunction
and (args)
here: that's the VBE telling you this:
I'll take that argument, pass it to MyFunction
, and assign the function's return value to result
.