Hopefully an easy question, but I'd quite like a technical answer to this!
What's the difference between:
i = 4
and
Set i = 4
in VBA? I know that the latter will throw an error, but I don't fully understand why.
Hopefully an easy question, but I'd quite like a technical answer to this!
What's the difference between:
i = 4
and
Set i = 4
in VBA? I know that the latter will throw an error, but I don't fully understand why.
set is used to assign a reference to an object. The C equivalent would be
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)
VBA on the left | C on the right): Dim A, B As Range | Range A, B;. Going with your analogy, A = B | A = B; would be correct (and it would be in C), but Set A = B | A = &B; is actually correct in VBA (and it would fail in C). In VBA, A = B and Set A = B are BOTH equivalent to C's A = B;! The distinction happens somewhere else.In your case, it will produce an error. :-)
Set assigns an object reference. For all other assignments the (implicit, optional, and little-used) Let statement is correct:
Set object = New SomeObject
Set object = FunctionReturningAnObjectRef(SomeArgument)
Let i = 0
Let i = FunctionReturningAValue(SomeArgument)
' or, more commonly '
i = 0
i = FunctionReturningAValue(SomeArgument)
4 is a literal, not an object, and therefore cannot be referenced. Likewise 0 or "Hello world". learn.microsoft.com/en-us/dotnet/visual-basic/programming-guide/…From MSDN:
Set Keyword: In VBA, the Set keyword is necessary to distinguish between assignment of an object and assignment of the default property of the object. Since default properties are not supported in Visual Basic .NET, the Set keyword is not needed and is no longer supported.
Object variable or With block variable not set error from VBA :)Off the top of my head, Set is used to assign COM objects to variables. By doing a Set I suspect that under the hood it's doing an AddRef() call on the object to manage it's lifetime.
So when you want to set a value, you don't need "Set"; otherwise, if you are referring to an object, e.g. worksheet/range etc., you need using "Set".