2015-03-12 2 views
1

Это приводит к ошибке во время компиляции (неверное число аргументов):Почему функция, возвращающая Variant, вызывается с дополнительными параметрами?

Option Explicit 

Sub Test() 
    Call returnsBoolean(1) 
End Sub 

Function returnsBoolean() As Boolean 
End Function 

Это, однако, отлично компилируется (и броски во время выполнения ошибки после возвращения из returnsVariant):

Option Explicit 

Sub Test() 
    Call returnsVariant(1) 
End Sub 

Function returnsVariant() As Variant 
End Function 

Почему?

+1

Так интересно. Я просто протестировал его. Я буду копаться, посмотреть, смогу ли я что-нибудь найти. – PaulFrancis

ответ

2

Это будет надеяться, чтобы было ясно:

Первый пример

Option Explicit 

Sub Test() 
    Dim b as Boolean 
    b = returnsBoolean 
    Debug.Print b(1) ' error, because b is not an array 
End Sub 

Function returnsBoolean() As Boolean 
End Function 

Второй пример

Option Explicit 

Sub Test() 
    Dim V as Variant 
    V = returnsBoolean 
    Debug.Print V(1) ' OK, because Variants can contain arrays 
End Sub 

Function returnsBoolean() As Variant 
End Function 

Это потому, что (1) интерпретируется как индекс массива а не аргументы функции. Другой способ мышления этого является то, что ваш код интерпретируется как

(returnsBoolean())(1) 

EDIT

В ответ на комментарий ниже, ниже дает ошибку индекс:

Option Explicit 

Sub Test() 
    returnsVariant 1, 2, 5 
End Sub 

Function returnsVariant() As Variant 
Dim x(1 To 1, 2 To 2, 3 To 3) As Long 
x(1, 2, 3) = 10 
Dim V As Variant 
V = x 
returnsVariant = V 
End Function 

так returnsVariant 1,2,5 интерпретируется как (returnsVariant())(1,2,5). В моей версии Excel, помещая 1,2,3, вызывает VBA сбой и сжигание

+0

Я тоже думал о опции Array, но если это так, то почему 'returnsVariant 1, 2' компилируется? (Нет 'Call', а массивы не могут быть доступны без скобок.) – Heinzi

+0

См. Мое редактирование выше –

Смежные вопросы