Що насправді набір ключових слів у VBA?


150

Сподіваюся, просте запитання, але я дуже хотів би на це відповісти технічно!

Яка різниця між:

i = 4

і

Set i = 4

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


4
Підгрунтя тут: stackoverflow.com/a/9924325/17034
Hans Passant

Відповіді:


95

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)

5
Посилання на об'єкт VB не зовсім збігається з покажчиком C. І в VB немає еквівалента "& i".
Томалак

10
Не зовсім те саме, ні. Але мені досить близько, щоб зрозуміти концепцію.
Треб

@Tomalak: Ви можете використовувати VarPtr ()
Atmocreations

Це не дуже хороша аналогія. Візьмемо такий приклад ( VBA on the left | C on the right): Dim A, B As Range | Range A, B;. Якщо піти з вашою аналогією, A = B | A = B;було б правильно (і це було б в С), але Set A = B | A = &B;насправді це правильно в VBA (і це не вдасться в С). У VBA, A = Bі Set A = BБУТИ еквівалентні C 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 :

Встановити ключове слово : У VBA ключове слово Set необхідно розрізнити між призначенням об'єкта та призначенням властивості за замовчуванням об’єкта. Оскільки властивості за замовчуванням не підтримуються у Visual Basic .NET, ключове слово Set не потрібне і більше не підтримується.


Добре знайдено, але посилання на статтю, яку ви знайшли на MSDN, буде ще кращою :)
Ніл Барнвелл

1
@Neil - посилання є, якщо ви натиснете MSDN в моєму дописі.
Галландська

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
Кетцалькоатля

10

Набір використовується для встановлення посилань на об'єкти, на відміну від призначення значення.


1

Верх моєї голови Set використовується для присвоєння об'єктам COM змінним. Роблячи набір, я підозрюю, що під кришкою він виконує AddRef () виклик об'єкта для управління його життям.


1
Він використовується не тільки для об'єктів COM, але і для всіх об'єктів. Основна причина, по якій ви використовуєте SET, пояснюється голландською мовою.
Іке

0

Отже, коли ви хочете встановити значення, вам не потрібно "Встановити"; в іншому випадку, якщо ви посилаєтесь на об'єкт, наприклад робочий лист / діапазон тощо, вам потрібно скористатися "Встановити".


-1

Set - це ключове слово, і воно використовується для призначення посилання на об'єкт у VBA.

Наприклад, * Нижче на прикладі показано, як використовувати Set у VBA.

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

Встановити WS = ActiveWorkbook.Worksheets ("Лист1")

WS.Name = "Аміт"

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.