Подтвердить что ты не робот

Почему это не несоответствие типа?

Я ответил на этот вопрос, по-видимому, удовлетворенности OP, но все еще нахожу, что их вопрос озадачен. Их вопрос включал выражение, в котором объект рабочей книги соединялся со строкой, вызывая Run-time Error '438': Object doesn't support this property or method. Вы можете воспроизвести такую ​​ошибку, просто набрав

?"Hello, " & ThisWorkbook

В непосредственном окне.

Мой вопрос: почему это повышает эту ошибку, вместо ошибки 13 - типа несоответствия? Разумно предположить, что VBA пытается найти свойство по умолчанию для объекта рабочей книги и что свойство по умолчанию не существует. Но, если это так, я ожидаю, что это будет следующая ошибка из списка ошибок Microsoft Visual Basic 6.0: Automation object doesn't have a default value (Error 443).

В основном это академический интерес, но если результатом конкатенации объекта без свойства по умолчанию со строкой всегда является ошибка 438, и это единственный способ запуска ошибки 438, а не, возможно, еще одна ошибка при конкатенации строки с объект, тогда может использоваться следующий код:

Function HasDefault(O As Variant) As Boolean
    Dim i As Long
    If Not IsObject(O) Then Exit Function
    On Error Resume Next
    i = Len("Hello, " & O)
    If Err.Number = 438 Then
        HasDefault = False
    Else
        HasDefault = True
    End If
End Function

Я тестировал это на разных объектах, и для тех, кого я тестировал, он возвращался False именно тогда, когда _Default не отображается как (скрытый) член объекта при просмотре в Обозреватель объектов. Тем не менее, я не вполне доверяю этой функции и все еще озадачен тем, что здесь происходит.

4b9b3361

Ответ 1

VBA попытается преобразовать выражения с каждой стороны оператора & в значение данных. Спецификация языка указывает, что:

  • Если тип значения целевой переменной expression является классом:
  • Если объявленным типом цели является вариант, ошибка времени выполнения 9
    (Подзаголовок за пределами допустимого диапазона).
  • Если объявленный тип цели не является Вариантом, и цель имеет общедоступное свойство Get Get или функция, значение значений данных результат вызова этого элемента по умолчанию для этой цели с помощью этого список аргументов. Это расходует список аргументов.
  • В противном случае ошибка 438 времени выполнения (объект не поддерживает это свойство или метод).

Что касается вашей функции, я бы просто использовал:

callbyname(O, "_Default", VbGet)

что приведет к ошибке 438.