Ошибка 450 во время компиляции при доступе к элементу коллекции по умолчанию

#excel #vba

Вопрос:

Правка: Пожалуйста, обратите внимание, что я знаю, что этот код завершится ошибкой во время выполнения. Я постарался сделать это как можно короче для демонстрации проблемы.

Рассмотрим этот модуль класса VBA «TestClass»:

 Option Explicit
Public TestCol As New Collection
 

В стандартном модуле это не будет компилироваться:

 Sub Test()
Dim Smth As New TestClass
Smth.TestCol(1) = "Something"
End Sub
 

Выдано сообщение об ошибке: «Неверное количество аргументов или недопустимое присвоение свойств»

Это будет скомпилировано просто отлично:

 Sub Test()
Dim Smth As New TestClass
Smth.TestCol.Item(1) = "Something"
End Sub
 

Это также будет отлично компилироваться:

 Sub Test()
Dim Smth As New TestClass
Dim X as String
X = Smth.TestCol(1)
End Sub
 

То же самое и со словарями, например.
Почему компилятор не разрешит доступ к элементу по умолчанию .Item без явного указания этого?

Комментарии:

1. Ваш вопрос заключается в том, почему вы получаете ошибку компиляции в первом фрагменте по сравнению с ошибкой во время выполнения в следующих двух?

2. Просто ошибка компиляции. Я знаю, что код не работает во время выполнения, я просто старался сделать его как можно короче для демонстрации проблемы.

Ответ №1:

Элементы в коллекции в основном являются объектами, даже если значение элемента является Вариантом и может содержать любой тип.

Следующий код не вызовет ошибки компиляции, поскольку он использует ключевое слово Set для назначения объекта.

 Sub Test()
   Dim Smth As New TestClass
   Set Smth.TestCol(1) = New TestClass
End Sub
 

Однако этот код завершится ошибкой во время выполнения, поскольку вы не можете назначить элемент коллекции напрямую. (Вместо этого используйте Удалить Добавить.)

Комментарии:

1. Я пытаюсь назначить не объект, а строку. Даже если он выйдет из строя во время выполнения по той самой причине, о которой вы упомянули, он должен быть скомпилирован. Но это не так, и я пытаюсь понять, почему. Кроме того, это проблема только с коллекциями. Словарь допускает прямое присвоение ключа, но компилятор также не разрешает этого.