In VBA, the only way to assign a Variant to a variable where you don’t know if it is an object or a primitive, is by passing it as a parameter.
If you cannot refactor your code so that the v
is passed as a parameter to a Sub, Function or Let Property (despite the Let
this also works on objects), you could always declare v
in module scope and have a dedicated Sub solely for the purpose of save-assigning that variable:
Private v As Variant
Private Sub SetV(ByVal var As Variant)
If IsObject(var) Then
Set v = var
Else
v = var
End If
End Sub
with somewhere else calling SetV SomeMethod()
.
Not pretty, but it’s the only way without calling SomeMethod()
twice or touching its inner workings.
Edit
Ok, I mulled over this and I think I found a better solution that comes closer to what you had in mind:
Public Sub LetSet(ByRef variable As Variant, ByVal value As Variant)
If IsObject(value) Then
Set variable = value
Else
variable = value
End If
End Sub
[…] I guess there just is no LetSet v = … statement in VBA
Now there is: LetSet v, SomeMethod()
You don’t have a return value that you need to Let
or Set
to a variable depending of its type, instead you pass the variable that should hold the return value as first parameter by reference so that the Sub can change its value.