Это объясняется в спецификации языка VBA. Семантика присваивания внутри блока With
определяется тем, является ли оператор оператором Set
или оператором Let
. В этом контексте это Let
оператор:
With x
.SomeThing = New Something
End With
Обратите внимание, что в грамматике VBA ключевое слово Let
является необязательным (устарело):
let-statement = ["Let"] l-expression "=" expression
В операторе Set
требуется ключевое слово Set
:
set-statement = "Set" l-expression "=" expression
Внутри блока With
l-expression
в основном является элементом UDT, хотя точно такое же поведение применяется, если x
используется напрямую.
При оценке выражения Let
семантика описана в разделе 5.4.3.8 :
Статическая семантика.
Это утверждение недопустимо, если выполняется любое из следующих условий:
- не может быть оценено как простое значение данных (раздел 5.6.2.2 ) .
После этого к 5.6.2.2 (Оценка для простого значения данных) применяется следующая семантика времени выполнения (только применимое правило):
Семантика времени выполнения.
Во время выполнения значение простого типа данных и тип значения
определяется на основании классификации выражения следующим образом:
Таким образом, ошибка времени выполнения 438 для SomeThing As Something
.
При Collection
статическая семантика Let
по-прежнему применяется, но она не соответствует семантике static из 5.6.2.2 (которая дает ошибку компиляции). Опять же, предыдущая неприменимая семантика опущена:
Статическая семантика. Следующие типы выражений могут быть оценены для получения простого значения данных:
Элементом по умолчанию Collection
является функция (.Item
), которая принимает один параметр Index
. В этом коде параметр не указан, поэтому список аргументов несовместим:
With x
.SomeThing = New VBA.Collection
End With
Таким образом Argument Not Optional
ошибка компиляции.