VBA中的关键字Set实际上是做什么的?

169

希望这是一个简单的问题,但我想得到一个技术性的答案!

以下两者有什么区别:

i = 4

Set i = 4

在VBA中使用"Resume Next"和"Resume"语句有什么区别?我知道后者会抛出错误,但我不完全理解为什么。


4
背景介绍在这里:https://dev59.com/7GDVa4cB1Zd3GeqPiPN9#9924325 - Hans Passant
7个回答

106

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" 的等效语法。 - Tomalak
13
不完全相同,但足够接近,让我理解概念。 - Treb
@Tomalak:你可以使用VarPtr()。 - Atmocreations
这个比喻不太恰当。以这个例子为例(VBA在左边|C在右边):Dim A,B As Range | Range A,B;。按照您的比喻,A = B | A = B;是正确的(并且在C中也是正确的),但是在VBA中,Set A = B | A = &B;才是正确的(而且在C中会失败)。在VBA中,A = BSet A = B都等同于C的A = B;!区别发生在其他地方。 - Niko O
@NikoO 小小的挑剔,但是你左边的 A 变量是 Variant 类型,而不是 Range。 - SSlinky

82

在你的情况下,它会产生一个错误。 :-)

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)

49

来自MSDN

Set关键字:在VBA中,Set关键字是必要的,以区分对象分配和对象默认属性分配。由于默认属性不受Visual Basic .NET支持,因此不需要Set关键字,并且不再支持。


很好,但是如果你能提供在MSDN上找到的文章链接会更好 :) - Neil Barnwell
2
@Neil - 如果你点击我帖子中的MSDN,链接就在那里。 - Galwegian
3
复制MSDN上的内容时,请至少选择正确的文章。这篇文章是关于VB.NET而不是VBA的。 - Tomalak
2
OP正在询问关于VBA的问题,虽然关于在.NET中不再需要使用Set的信息很有用,但这是一个离题并且对于遇到“对象变量或With块变量未设置”错误的VBA用户来说没有帮助。 - AJP
7
非常感谢您提供的MSDN摘录。即使是被采纳的答案,其它所有回答都没有抓住重点。"set"关键字与默认属性有关,请阅读https://dev59.com/7GDVa4cB1Zd3GeqPiPN9#9924325。 - quetzalcoatl
刚刚阅读了您提到的页面,作者断言恰恰相反:“如果您想要分配对象引用,则必须编写: Set obj = someObject” - indexless

9

Set用于设置对象引用,而不是赋值。


1

就我个人而言,Set 用于将 COM 对象分配给变量。通过执行 Set 操作,我猜测在底层它会对对象进行 AddRef() 调用以管理其生命周期。


1
它不仅用于COM对象,而且适用于所有对象。使用SET的主要原因由Galwegian解释。 - Ikke

0
当您想设置一个值时,无需使用"Set";但如果您引用一个对象,例如工作表/范围等,则需要使用"Set"。

-1

Set 是一个关键字,它用于在 VBA 中分配对象的引用。

例如, *下面的示例展示了如何在 VBA 中使用 Set。

Dim WS As Worksheet

Set WS = ActiveWorkbook.Worksheets("Sheet1")

WS.Name = "Amit"


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接