#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. Я пытаюсь назначить не объект, а строку. Даже если он выйдет из строя во время выполнения по той самой причине, о которой вы упомянули, он должен быть скомпилирован. Но это не так, и я пытаюсь понять, почему. Кроме того, это проблема только с коллекциями. Словарь допускает прямое присвоение ключа, но компилятор также не разрешает этого.