¿Qué hace realmente la palabra clave Set en VBA?

150

Espero que sea una pregunta fácil, ¡pero me gustaría una respuesta técnica a esto!

Cuál es la diferencia entre:

i = 4

y

Set i = 4

en VBA? Sé que este último arrojará un error, pero no entiendo completamente por qué.

Jon Artus
fuente
44
Antecedentes aquí: stackoverflow.com/a/9924325/17034
Hans Passant

Respuestas:

95

setse usa para asignar una referencia a un objeto. El equivalente en C sería

 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)
Treb
fuente
55
Una referencia de objeto VB no es lo mismo que un puntero en C. Y no hay equivalente de "& i" en VB.
Tomalak
10
No exactamente lo mismo, no. Pero lo suficientemente cerca como para entender el concepto.
Treb
@Tomalak: Puedes usar VarPtr ()
Atmocreations
Esta no es una buena analogía. Tome este ejemplo ( VBA on the left | C on the right): Dim A, B As Range | Range A, B;. Seguir su analogía A = B | A = B;sería correcto (y estaría en C), pero en Set A = B | A = &B;realidad es correcto en VBA (y fallaría en C). ¡En VBA, A = By Set A = Bson AMBOS equivalentes a C A = B;! La distinción ocurre en otro lugar.
Niko O
77

En su caso, producirá un error. :-)

Setasigna una referencia de objeto. Para todas las demás asignaciones, la Letdeclaración (implícita, opcional y poco utilizada) es correcta:

Set object = New SomeObject
Set object = FunctionReturningAnObjectRef(SomeArgument)

Let i = 0
Let i = FunctionReturningAValue(SomeArgument)

' or, more commonly '

i = 0
i = FunctionReturningAValue(SomeArgument)
Tomalak
fuente
44

De MSDN :

Establecer palabra clave: en VBA, la palabra clave Establecer es necesaria para distinguir entre la asignación de un objeto y la asignación de la propiedad predeterminada del objeto. Como las propiedades predeterminadas no son compatibles con Visual Basic .NET, la palabra clave Set no es necesaria y ya no es compatible.

Galés
fuente
Bien encontrado, pero un enlace al artículo que encontraste en MSDN sería aún mejor :)
Neil Barnwell
1
@Neil: el enlace está ahí si haces clic en MSDN en mi publicación.
Galuego
2
Al copiar el MSDN, al menos el artículo correcto. Este se refiere a VB.NET, no a VBA.
Tomalak
1
OP pregunta acerca de VBA, y aunque la información sobre Set ya no es necesaria para usar en .NET es útil, es un tema fuera de lugar y no es útil para las personas que llegan aquí con el Object variable or With block variable not seterror de VBA :)
AJP
77
Muchas gracias por el extracto de MSDN. Todas las demás respuestas, incluso la aceptada están perdiendo el punto. 'set' tiene que ver con la PROPIEDAD POR DEFECTO. Solo lea stackoverflow.com/a/9924325/717732
quetzalcoatl
10

Set se usa para establecer referencias de objeto, en lugar de asignar un valor.

LeppyR64
fuente
1

Fuera de mi cabeza, Set se usa para asignar objetos COM a variables. Al hacer un Set, sospecho que debajo del capó está haciendo una llamada AddRef () en el objeto para administrar su vida útil.

Sean
fuente
1
No solo se usa para objetos COM, sino para todos los objetos. La razón principal por la que usa SET es explicada por Galwegian.
Ikke
0

Entonces, cuando desea establecer un valor, no necesita "Establecer"; de lo contrario, si se refiere a un objeto, por ejemplo, hoja de trabajo / rango, etc., necesita usar "Establecer".

Eric Wang
fuente
-1

Set es una palabra clave y se usa para asignar una referencia a un objeto en VBA.

Por ejemplo, * El siguiente ejemplo muestra cómo usar Set en VBA.

Dim WS como hoja de trabajo

Establecer WS = ActiveWorkbook.Worksheets ("Sheet1")

WS.Name = "Amit"

Amit Singh
fuente