Надеюсь, это простой вопрос, но я бы очень хотел получить на него технический ответ!
В чем разница между:
i = 4
а также
Set i = 4
в VBA? Я знаю, что последний вызовет ошибку, но я не совсем понимаю, почему.





Set используется для установки ссылок на объекты, а не для присвоения значения.
В вашем случае это выдаст ошибку. :-)
Set назначает ссылку на объект. Для всех остальных назначений (неявный, необязательный и малоиспользуемый) оператор Let верен:
Set object = New SomeObject
Set object = FunctionReturningAnObjectRef(SomeArgument)
Let i = 0
Let i = FunctionReturningAValue(SomeArgument)
' or, more commonly '
i = 0
i = FunctionReturningAValue(SomeArgument)
От MSDN:
Set Keyword: In VBA, the Set keyword is necessary to distinguish between assignment of an object and assignment of the default property of the object. Since default properties are not supported in Visual Basic .NET, the Set keyword is not needed and is no longer supported.
Хорошо, но ссылка на статью, которую вы нашли в MSDN, была бы еще лучше :)
@Neil - ссылка есть, если щелкнуть MSDN в моем сообщении.
При копировании с MSDN, то хоть статья правильная. Это относится к VB.NET, а не к VBA.
OP спрашивает о VBA, и хотя информация о Set больше не нужна для использования в .NET, полезна, это не по теме и бесполезно для людей, прибывающих сюда с ошибкой Object variable or With block variable not set от VBA :)
Большое спасибо за выдержку из MSDN. Во всех остальных ответах, даже в принятом, нет смысла. «set» - это СВОЙСТВО ПО УМОЛЧАНИЮ. Просто прочтите stackoverflow.com/a/9924325/717732
Только что прочитал упомянутую вами страницу, автор утверждает прямо противоположное: If you want to assign the object reference then you have to write: Set obj = someObject
В моей голове Set используется для присвоения COM-объектов переменным. Выполняя Set, я подозреваю, что под капотом он выполняет вызов AddRef () объекта для управления его временем жизни.
Он используется не только для COM-объектов, но и для всех объектов. Основная причина, по которой вы используете SET, объясняет Галвеган.
set используется для присвоения ссылки объекту. Эквивалент C будет
int i;
int* ref_i;
i = 4; // Assigning a value (in VBA: i = 4)
ref_i = &i; //assigning a reference (in VBA: set ref_i = i)
Ссылка на объект VB не совсем то же самое, что указатель C. И в VB нет эквивалента «& i».
Не совсем то же самое, нет. Но достаточно близко, чтобы понять концепцию.
@Tomalak: вы можете использовать VarPtr ()
Это плохая аналогия. Возьмем этот пример (VBA on the left | C on the right): Dim A, B As Range | Range A, B;. Следуя вашей аналогии, A = B | A = B; был бы правильным (и он был бы на C), но Set A = B | A = &B; на самом деле правильный в VBA (и он не будет работать в C). В VBA A = B и Set A = B ОБЕИХ эквивалентны A = B; C! Различие происходит где-то еще.
@NikoO мелкая придирка, но ваша переменная A слева имеет тип Variant, а не Range.
@SamV Черт побери, VBA!
Set - это ключевое слово, которое используется для назначения ссылки на объект в VBA.
Например, * В примере ниже показано, как использовать Set в VBA.
Dim WS как рабочий лист
Установите WS = ActiveWorkbook.Worksheets ("Sheet1")
WS.Name = "Амит"
Поэтому, когда вы хотите установить значение, вам не нужно «Установить»; в противном случае, если вы ссылаетесь на объект, например рабочий лист / диапазон и т. д., вам нужно использовать «Установить».
Справочная информация здесь: stackoverflow.com/a/9924325/17034