如果输出未捕获,则inputtypes会更改

我正在做一个函数,根据input的types做不同的事情。 不幸的是,我发现input的types取决于输出是否被捕获。

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 

这不是我所期望的。

这种奇特的行为的基本原理是什么?这里的大图是什么?

在第一次调用what_type ,你已经传递了一个参数(rng) ,即rng的值作为一个Variant数组。 这导致Debug.Print显示Variant()

在第二次调用what_type ,你已经传递了一个rng参数,即实际的范围对象。 这导致Debug.Print显示Range ,并作为结果返回,然后又是Debug.Printed。

如果你的第一个电话改变为刚刚

 what_type rng 

它也会显示Range作为variablestypes。

或者如果你的第二个电话改变了

 Debug.Print what_type((rng)) 

它会在函数内部显示Variant()和返回的结果。

PS使用子例程的语法来调用一个函数总是一个坏主意。 一个函数返回一个值(或者至less应该 ),并且以某种方式处理返回的值总是一个好主意,那就是赋值给一个variables,或者将它传递给另一个函数/子例程。