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

150

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

Какая разница между:

i = 4

и

Set i = 4

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

Джон Артус
источник
4
Справочная информация здесь: stackoverflow.com/a/9924325/17034
Ганс Пассант,

Ответы:

95

setиспользуется для назначения ссылки на объект. С эквивалент будет

 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)
треб
источник
5
Ссылка на объект VB не совсем совпадает с указателем C. И нет эквивалента «& я» в VB.
Томалак
10
Нет, точно так же, нет. Но достаточно близко для меня, чтобы понять концепцию.
Треб
@Tomalak: Вы можете использовать VarPtr ()
Atmocreations
Это не хорошая аналогия. Возьмем такой пример ( 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;! Различие происходит где-то еще.
Нико О
77

В вашем случае это приведет к ошибке. :-)

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)
Томалак
источник
44

Из MSDN :

Ключевое слово Set: В VBA ключевое слово Set необходимо для различения назначения объекта и назначения свойства объекта по умолчанию. Поскольку свойства по умолчанию не поддерживаются в Visual Basic .NET, ключевое слово Set не требуется и больше не поддерживается.

Galwegian
источник
Хорошо найдено, но ссылка на статью, которую вы нашли на MSDN, была бы еще лучше :)
Нил Барнвелл
1
@Neil - ссылка есть, если вы нажмете MSDN в моем сообщении.
Galwegian
2
При копировании с MSDN, тогда хотя бы правильная статья. Это относится к VB.NET, а не к VBA.
Томалак
1
OP спрашивает о VBA, и хотя информация о том, что Set больше не нужен для использования в .NET, полезна, это не тема и не помогает людям, которые приходят сюда с Object variable or With block variable not setошибкой из VBA :)
AJP
7
Большое спасибо за выдержку из MSDN. Все остальные ответы, даже принятые, не имеют смысла. «set» - это все о СВОЙСТВЕ ПО УМОЛЧАНИЮ. Просто прочитайте stackoverflow.com/a/9924325/717732
quetzalcoatl
10

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

LeppyR64
источник
1

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

Шон
источник
1
Он используется не только для объектов COM, но и для всех объектов. Основная причина использования SET объясняется Galwegian.
Ikke
0

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

Эрик Ван
источник
-1

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

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

Dim WS As Worksheet

Set WS = ActiveWorkbook.Worksheets ("Sheet1")

WS.Name = "Amit"

Амит Сингх
источник