如果未捕获输出,则输入类型会更改

时间:2016-09-12 01:54:48

标签: excel vba excel-vba

我正在开发一个根据输入类型执行不同操作的函数。不幸的是,我发现输入的类型取决于是否捕获了输出

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 个答案:

答案 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。使用子例程的语法调用函数总是一个坏主意。函数返回一个值(或者,至少它应该)并且以某种方式处理该返回值总是一个好主意,可以是对变量的赋值,或者将它传递给另一个函数/子程序。