Что на самом деле делает ключевое слово Set в VBA?

Надеюсь, это простой вопрос, но я бы очень хотел получить на него технический ответ!

В чем разница между:

i = 4

а также

Set i = 4

в VBA? Я знаю, что последний вызовет ошибку, но я не совсем понимаю, почему.

Справочная информация здесь: stackoverflow.com/a/9924325/17034

Hans Passant 19.04.2012 23:33
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
159
1
206 530
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

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 Barnwell 08.12.2008 17:01

@Neil - ссылка есть, если щелкнуть MSDN в моем сообщении.

Galwegian 08.12.2008 17:10

При копировании с MSDN, то хоть статья правильная. Это относится к VB.NET, а не к VBA.

Tomalak 08.12.2008 17:33

OP спрашивает о VBA, и хотя информация о Set больше не нужна для использования в .NET, полезна, это не по теме и бесполезно для людей, прибывающих сюда с ошибкой Object variable or With block variable not set от VBA :)

AJP 09.03.2012 02:18

Большое спасибо за выдержку из MSDN. Во всех остальных ответах, даже в принятом, нет смысла. «set» - это СВОЙСТВО ПО УМОЛЧАНИЮ. Просто прочтите stackoverflow.com/a/9924325/717732

quetzalcoatl 07.08.2012 14:33

Только что прочитал упомянутую вами страницу, автор утверждает прямо противоположное: If you want to assign the object reference then you have to write: Set obj = someObject

indexless 09.09.2013 14:11

В моей голове Set используется для присвоения COM-объектов переменным. Выполняя Set, я подозреваю, что под капотом он выполняет вызов AddRef () объекта для управления его временем жизни.

Он используется не только для COM-объектов, но и для всех объектов. Основная причина, по которой вы используете SET, объясняет Галвеган.

Ikke 08.12.2008 17:21
Ответ принят как подходящий

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 08.12.2008 17:02

Не совсем то же самое, нет. Но достаточно близко, чтобы понять концепцию.

Treb 08.12.2008 18:09

@Tomalak: вы можете использовать VarPtr ()

Atmocreations 11.11.2009 00:06

Это плохая аналогия. Возьмем этот пример (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! Различие происходит где-то еще.

Niko O 25.05.2020 11:18

@NikoO мелкая придирка, но ваша переменная A слева имеет тип Variant, а не Range.

Sam V 04.02.2021 08:43

@SamV Черт побери, VBA!

Niko O 04.02.2021 12:12

Set - это ключевое слово, которое используется для назначения ссылки на объект в VBA.

Например, * В примере ниже показано, как использовать Set в VBA.

Dim WS как рабочий лист

Установите WS = ActiveWorkbook.Worksheets ("Sheet1")

WS.Name = "Амит"

Поэтому, когда вы хотите установить значение, вам не нужно «Установить»; в противном случае, если вы ссылаетесь на объект, например рабочий лист / диапазон и т. д., вам нужно использовать «Установить».

Другие вопросы по теме