ЗАКЛЮЧИТЕЛЬНОЕ РЕДАКТИРОВАНИЕ: Это действительно ошибка компилятора - см. Принятый ответ.
Используя VBA в Excel 2007, у меня есть следующий код в 'Class1':
Option Explicit
Public Function strange(dummy As String, ParamArray pa())
Debug.Print pa(LBound(pa))
End Function
Public Sub not_strange(dummy As String, ParamArray pa())
Debug.Print pa(LBound(pa))
End Sub
Public Function also_not_strange(ParamArray pa())
Debug.Print pa(LBound(pa))
End Function
и некоторый код режима в модуле:
Option Explicit
Public Function not_strange_either(dummy As String, ParamArray pa())
Debug.Print pa(LBound(pa))
End Function
Public Sub outer(v)
Dim c As Class1
Set c = New Class1
Call c.strange("", v(LBound(v)))
Call c.not_strange("", v(LBound(v)))
Call c.also_not_strange(v(LBound(v)))
Call not_strange_either("", v(LBound(v)))
End Sub
Если вызвать 'external' из окна Immediate следующим образом:
call outer(array("a"))
Я получаю вывод, который кажется странным:
102085832
a
a
a
Кажется, имеет значение, находится ли вызываемая подпрограмма в модуле класса или нет, является ли она подпрограммой или функцией, и существует ли начальный аргумент или нет.Я что-то упускаю из-за того, как должен работать VBA?Есть идеи?
Странное число меняется от запуска к бегу.Я говорю «выглядит подозрительно, как указатель», потому что, если я назову это:
Public Sub outer2(v)
Dim c As Class1
Set c = New Class1
Dim ind As Long
For ind = LBound(v) To UBound(v)
Call c.strange("", v(ind))
Next ind
End Sub
примерно так:
call outer2(array("a","b","c"))
Я получу обратно вывод как:
101788312
101788328
101788344
Это увеличение на 16 делает меня подозрительным, но я действительно не знаю.Кроме того, передача значения, скажем, путем вызова:
Call c.strange("", CStr(v(ind)))
работает просто отлично.
РЕДАКТИРОВАТЬ: немного больше информации ... Если я назначу возвращаемое значение из 'c.strange'к чему-то вместо того, чтобы выбросить это, я получаю то же поведение:
Public Sub outer3(v)
Dim c As Class1
Set c = New Class1
Dim x
x = c.strange("", v(LBound(v)))
Call c.not_strange("", v(LBound(v)))
Call c.also_not_strange(v(LBound(v)))
Call not_strange_either("", v(LBound(v)))
End Sub
Интересно, что если я вызываю мои тестовые процедуры, как указано выше, с аргументом, который получается в результате вызова 'Array', значения предполагаемого указателяизменения.Однако, если я позвоню так:
call outer([{1,2,3}])
Я получу один и тот же номер, даже если я сделаю вызов несколько раз.(Число изменится, если я переключусь на другое приложение в Windows, например, в моем браузере.) Итак, теперь я заинтригован тем, что оценщик Excel (вызывается в скобках), по-видимому, кэширует его результаты ...