VBA: То, что вызывает этот аргумент строки, передало ParamArray, который будет изменен на число (который подозрительно походит на указатель)?

ЗАКЛЮЧИТЕЛЬНОЕ РЕДАКТИРОВАНИЕ: Это, действительно кажется, ошибка компилятора - см. принятый ответ.

Используя 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 (вызванный со скобками) по-видимому кэширует свои результаты...

11
задан jtolle 2 August 2010 в 00:04
поделиться

1 ответ

Вот это круто.

Воспроизведено в офисе 2003 г.
Похоже на ошибку компилятора.

Проблема заключается в этой строке:

Call c.strange("", v(LBound(v)))

Здесь компилятор создает вариант , содержащий одномерный массив из вариантов , единственным элементом которого является указатель. стоимости. Затем этот указатель переходит к функции странно , что на самом деле не является странным, он только печатает переданное ей значение Variant \ Long .

Этот трюк возвращает компилятору здравомыслие:

Call c.strange("", (v(LBound(v))))

EDIT

Да, это магическое число является указателем на структуру VARIANT, которая должна быть передана методу unknown . Первое поле которого - 8 , то есть vbString , а поле данных содержит указатель на фактическую строку «a» .

Следовательно, это определенно ошибка компилятора ... Еще одна ошибка компилятора VB в отношении массивов;)

8
ответ дан 3 December 2019 в 10:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: