Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Compilation-error while passing Variant argument ByRef in VBA

Tags:

excel

vba

I've got a "compilation" error in Excel VBA, which I don't understand...

I've got a method like that :

    Public Sub SomeMethod(ByRef argument As SomeClass)
        ... <- 'argument' must be called ByRef because I have to modify it
    End Sub

If I define a variable like :

    Dim var As SomeClass

No problem, I can call :

    SomeMethod var

and it's working.

BUT, if I define a Variant variable like :

    Dim var as Variant
    Set var = New SomeClass

It doesn't work.

If I call :

    SomeMethod var

VB pops-up a message : 'ByRef argument type mismatch'

If I call :

    SomeMethod (var)

it "compiles", but var is then passed ByVar and it gave me a runtime-error message : 'Object doesn't support this property or method'

So I basically just want to tell VBA that my Variant variable 'var' is in fact a 'SomeClass' object (in debugger, VBA says so), but I don't know how to do that...

Could someone please help me ?

like image 341
adrien.pain Avatar asked Feb 22 '23 09:02

adrien.pain


1 Answers

Decorate the argument with ByVal

Public Sub SomeMethod(ByVal argument As someclass)

then you can pass a variant;

SomeMethod var

This works because the ByVal argument is received as a local copy of a reference to a Variant[someclass] which means VB can freely perform a type-conversion (to convert the Variant[someclass]->someclass).

It wont work when passed as ByRef because any changes to argument would also affect the calling object reference variable outside the current procedure.

If you pass As Object you don't need the ByVal.

If your doing this a lot with custom classes VBA supports interfaces; function foo(obj as IOneOfMyWidgets)

like image 165
Alex K. Avatar answered Apr 12 '23 23:04

Alex K.