Что на самом деле делает ключевое слово 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 не требуется и больше не поддерживается.


Хорошо найдено, но ссылка на статью, которую вы нашли на 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 используется для установки ссылок на объекты, а не для присвоения значения.


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"

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.