为什么返回工作表类型.单元格的功能随赋值变量而改变



我有以下宏代码。

Sub display_name()
Dim strName As String
Dim nameCell As Range

strName = ActiveSheet.Cells(1, 1) 'String
Set nameCell = ActiveSheet.Cells(1, 1) 'Range Object

MsgBox "Content: " & strName & ", " & nameCell.Value
End Sub

MsgBox值:

内容:你好世界,你好世界

在第一种情况下ActiveSheet。Cells方法返回一个字符串,在第二行中,同一方法返回Range Object。

根据vba文档,工作表。单元格返回一个范围对象。我有Java背景,我发现这种行为不合适。

,我有以下问题

  1. 为什么工作表的返回类型。单元格因分配给它的变量的类型
  2. VBA为什么允许这种行为

在VBA中使用Set-语句时,将对象引用分配给对象变量。在大多数语言中,没有Set-命令,而是使用=:=指定引用,但在VBA中,必须使用Set

如果省略Set并尝试将对象分配给变量,则会出现运行时错误438。只有一个例外:

VBA具有默认成员的概念。每个类都可能有一个默认成员(并非所有类都有一个!(。如果使用对象而未指定成员,并且未引用该对象的引用(例如,使用Set或在预期对象时将对象作为参数传递(,VBA将隐式引用默认成员。

默认成员在多种情况下都很有用。以Collection为例,您可以通过索引访问它的成员,就好像它是一个简单的数组一样。因此,您编写MyCollection(1)来访问第一个成员——您真正要做的是调用函数Item,它是Collection的默认成员。

然而,默认成员也可能导致混淆。如果将对象作为参数传递给子例程,并且该参数定义为类型Variant,VBA将传递对象的引用还是默认成员的值?

如果您想知道类的默认成员,请转到对象浏览器[F2]并查找带有蓝色图标的成员。这个答案解释了它的用法,包括如何显示隐藏的成员。

基本上,Range的默认成员是。。。复杂的但是,如果Range只包含一个单元格,它就是该单元格的Value(据我所知,它是成员Value2(。您会发现,通常使用默认成员来访问单元格的值,就像您在示例代码中所做的那样。但我建议明确写strName = ActiveSheet.Cells(1, 1).Value——不要留下误解的余地。

如果你对更多细节感兴趣,请阅读这篇Rubberduck文章。这里有一个有趣的SO问题,关于Range的real默认成员。如果你还不够困惑,请阅读本文。

最新更新