2016-09-12 7 views
1

入力のタイプによって異なる処理を行う関数に取り組んでいます。残念ながら、の入力のタイプは、の出力がキャプチャされているかどうかによって異なります。出力がキャプチャされないと、入力タイプが変化します

Function what_type(x As Variant) As String 
    Debug.Print TypeName(x) 
    what_type = TypeName(x) 
End Function 

Sub range_test() 
    Dim rng As Range 
    Set rng = Sheets("Test").Range("F28:G28") 
    what_type (rng) 
    Debug.Print what_type(rng) 
End Sub 

実行range_testプリント

私が期待するものではありません
Variant() 
Range 
Range 

この独特な行動の根拠は何ですか?/ここでは大きな画像は何ですか?

答えて

1

what_typeの最初の呼び出しでは、(rng)のパラメータ、つまりrngの値をバリアント配列として渡しました。これにより、Debug.PrintがVariant()と表示されます。

what_typeの2番目の呼び出しでは、rngのパラメータ、つまり実際の範囲オブジェクトを渡しています。これにより、Debug.PrintがRangeと表示され、その結果として戻され、Debug.Printedに戻ります。

あなたの最初の呼び出しはちょうど

what_type rng 

それに変更された場合は、あまりにも、変数の型としてRange表示していました。

またはあなたの2番目の呼び出しが

Debug.Print what_type((rng)) 

に変更された場合には、関数の内部と返された結果として、両方のVariant()を表示していました。

P.S.サブルーチンの構文を使用して関数を呼び出すことは、常に悪い考えです。関数は値を返します(少なくともになります)。戻り値を何らかの方法で破棄したり、変数に代入したり、別の関数/サブルーチンに渡したりすることは常に良い考えです。

関連する問題