Что на самом деле делает ключевое слово Set в VBA? - PullRequest
145 голосов
/ 08 декабря 2008

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

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

i = 4

и

Set i = 4

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

Ответы [ 7 ]

94 голосов
/ 08 декабря 2008

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)
75 голосов
/ 08 декабря 2008

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

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)
43 голосов
/ 08 декабря 2008

С MSDN :

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

10 голосов
/ 08 декабря 2008

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

1 голос
/ 08 декабря 2008

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

0 голосов
/ 05 сентября 2014

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

0 голосов
/ 11 ноября 2013

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

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

Dim WS As Worksheet

Set WS = ActiveWorkbook.Worksheets ("Sheet1")

WS.Name = "Amit"

...