ЗАКЛЮЧИТЕЛЬНОЕ РЕДАКТИРОВАНИЕ: Это, действительно кажется, ошибка компилятора - см. принятый ответ.
Используя 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
Если вызов, 'внешний' из окна Immediate как это:
call outer(array("a"))
Я возвращаю вывод, который кажется странным:
102085832
a
a
a
Это, кажется, имеет значение, является ли названная стандартная программа в модуле класса или нет, является ли это Sub или Функцией, и существует ли начальный аргумент. Я пропускаю что-то о том, как 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
Интересно, если я называю свои тестовые задачи как выше с аргументом, который следует из вызова 'Массива', изменений значения воображаемого указателя. Однако, если я называю его как это:
call outer([{1,2,3}])
Я возвращаю то же число, даже если я неоднократно выполняю вызов. (Число изменяется, если я переключаюсь на другое приложение в Windows, как мой браузер.) Так, теперь я заинтригован, что средство анализа Excel (вызванный со скобками) по-видимому кэширует свои результаты...
Вот это круто.
Воспроизведено в офисе 2003 г.
Похоже на ошибку компилятора.
Проблема заключается в этой строке:
Call c.strange("", v(LBound(v)))
Здесь компилятор создает вариант
, содержащий одномерный массив из вариантов
, единственным элементом которого является указатель. стоимости. Затем этот указатель переходит к функции странно
, что на самом деле не является странным, он только печатает переданное ей значение Variant \ Long
.
Этот трюк возвращает компилятору здравомыслие:
Call c.strange("", (v(LBound(v))))
EDIT
Да, это магическое число является указателем на структуру VARIANT, которая должна быть передана методу unknown
. Первое поле которого - 8
, то есть vbString
, а поле данных содержит указатель на фактическую строку «a»
.
Следовательно, это определенно ошибка компилятора ... Еще одна ошибка компилятора VB в отношении массивов;)