我正在开发一个根据输入类型执行不同操作的函数。不幸的是,我发现输入的类型取决于是否捕获了输出。
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
这不是我所期望的。
这种特殊行为的理由是什么/这里的大局是什么?
答案 0 :(得分:1)
在您what_type
的第一次通话中,您已将参数(rng)
,即rng
的值作为Variant数组传递。这导致Debug.Print显示Variant()
。
在您what_type
的第二次调用中,您传递的参数为rng
,即实际范围对象。这导致Debug.Print显示Range
,并将其作为结果传回,然后再次调试Debug.Printed。
如果您的第一个电话改为
what_type rng
它也会显示Range
作为变量类型。
或者,如果您的第二个电话被更改为
Debug.Print what_type((rng))
它会在函数内部和返回的结果中显示Variant()
。
P.S。使用子例程的语法调用函数总是一个坏主意。函数返回一个值(或者,至少它应该)并且以某种方式处理该返回值总是一个好主意,可以是对变量的赋值,或者将它传递给另一个函数/子程序。