关键字 Set 在 VBA 中的实际作用是啥? [复制]
Posted
技术标签:
【中文标题】关键字 Set 在 VBA 中的实际作用是啥? [复制]【英文标题】:What does the keyword Set actually do in VBA? [duplicate]关键字 Set 在 VBA 中的实际作用是什么? [复制] 【发布时间】:2010-09-25 20:43:54 【问题描述】:希望是一个简单的问题,但我非常想要一个技术性的答案!
两者有什么区别:
i = 4
和
Set i = 4
在 VBA 中?我知道后者会抛出错误,但我不完全明白为什么。
【问题讨论】:
后台:***.com/a/9924325/17034 【参考方案1】: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)
【讨论】:
VB 对象引用与 C 指针并不完全相同。并且在 VB 中没有等效的“&i”。 不完全一样,不。但足够接近让我理解这个概念。 @Tomalak:你可以使用 VarPtr() 这不是一个很好的类比。举个例子(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
都等价于 C 的 A = B;
!区别发生在其他地方。
@SamV 该死的,VBA!【参考方案2】:
在你的情况下,它会产生一个错误。 :-)
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)
【讨论】:
【参考方案3】:来自MSDN:
设置关键字:在 VBA 中,设置关键字 有必要区分 对象的赋值和赋值 对象的默认属性。 由于默认属性不是 在 Visual Basic .NET 中支持, 不需要设置关键字并且是 no 支持时间更长。
【讨论】:
很好,但是你在 MSDN 上找到的文章的链接会更好:) @Neil - 如果您在我的帖子中单击 MSDN,链接就在那里。 当抄袭MSDN时,至少是正确的文章。这个是指 VB.NET,而不是 VBA。 OP 正在询问有关 VBA 的问题,尽管关于 Set 不再需要在 .NET 中使用的信息很有用,但它是一个题外话,对于因Object variable or With block variable not set
错误到达这里的人没有帮助VBA :)
非常感谢您从 MSDN 中摘录。所有其他答案,即使是被接受的答案都没有抓住重点。 'set' 是关于默认属性的。只需阅读***.com/a/9924325/717732【参考方案4】:
Set 用于设置对象引用,而不是赋值。
【讨论】:
【参考方案5】:在我的脑海中,Set 用于将 COM 对象分配给变量。通过执行 Set 我怀疑它在后台执行 AddRef() 调用对象来管理它的生命周期。
【讨论】:
它不仅适用于 COM 对象,而且适用于所有对象。 Galwegian 解释了您使用 SET 的主要原因。【参考方案6】:所以当你想设置一个值时,你不需要“Set”;否则,如果您指的是一个对象,例如工作表/范围等,您需要使用“设置”。
【讨论】:
【参考方案7】:Set 是一个关键字,用于在 VBA 中分配对 Object 的引用。
例如, *下面的例子展示了如何在 VBA 中使用 Set。
将 WS 调暗为工作表
设置 WS = ActiveWorkbook.Worksheets("Sheet1")
WS.Name = "阿米特"
【讨论】:
以上是关于关键字 Set 在 VBA 中的实际作用是啥? [复制]的主要内容,如果未能解决你的问题,请参考以下文章