役に立ちそうもないTips移転版

俺得なTipsを書き連ねるだけのブログ。

VBAの関数がオブジェクトを返してくるか値を返してくるか分からん場合

VBAでは

・オブジェクトの代入は Set ステートメントで行う
・値の代入はLet ステートメントで行う(ただし「Let」は省略可)

となっているが、関数が状況によってオブジェクトを返したり値を返したりする場合

「実行してみるまで分からないのに、Setが要るかどうかはコードを書く時点で決めておかなくてはいけない」

という理不尽が発生するorz
(そもそもそんな行儀の悪い関数は窓から投げ捨てろという話もあるが
そうもいかない場合もあり……)

が、プロシージャの引数に関しては、そのあたりを気にする必要がないので
例えばこんな感じでラップしてやるとよい。

' 第一引数に関数の呼び出し式、第二引数に関数の戻り値を格納したい変数を渡す
Sub WrappingResult(vResult As Variant, ByRef vBox As Variant)
    If IsObject(vResult) Then
        Set vBox = vResult
    Else
        vBox = vResult
    End If
End Sub

てなアイデアをTeratailで教えていただきました。感謝。
teratail.com