Почему это не несоответствие типа?
Я ответил на этот вопрос, по-видимому, удовлетворенности 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
не отображается как (скрытый) член объекта при просмотре в Обозреватель объектов. Тем не менее, я не вполне доверяю этой функции и все еще озадачен тем, что здесь происходит.
Ответы
Ответ 1
VBA попытается преобразовать выражения с каждой стороны оператора &
в значение данных. Спецификация языка указывает, что:
- Если тип значения целевой переменной expression является классом:
- Если объявленным типом цели является вариант, ошибка времени выполнения 9
(Подзаголовок за пределами допустимого диапазона).
- Если объявленный тип цели не является Вариантом, и цель имеет
общедоступное свойство Get Get или функция, значение значений данных
результат вызова этого элемента по умолчанию для этой цели с помощью этого
список аргументов. Это расходует список аргументов.
- В противном случае ошибка 438 времени выполнения (объект не поддерживает это свойство или
метод).
Что касается вашей функции, я бы просто использовал:
callbyname(O, "_Default", VbGet)
что приведет к ошибке 438.