VBA(Excel)中,=Empty 和 IsEmpty() 有何区别?

28

我使用了以下的VBA代码:

Do While .Cell(i,1) <> Empty
  ' doing things
  i = i+1
Loop

在 Excel 中迭代遍历(带有 Double/Integer 值的)列。然后,我发现一个情况,即当单元格的值为 0 时,测试评估结果始终为 False。我不知道这种情况与正常情况的区别在哪里。

如果我将测试改为:

Do While Not IsEmpty(.Cell(i,1))
  ..
Loop

它正常工作。所以我的问题是:IsEmpty()和=Empty如何评估的区别是什么?在哪些情况下,对于具有值0的单元格,=Empty会评估为True?


2
Range("A2")=0 ?Range("A2")=Empty True ?IsEmpty(range("A2")) False 我想看到一个情况,其中单元格值为0时= Empty返回False! - Jean-François Corbett
你是对的。我现在看到之前我查看过的系列不包含零(我只是假设它们包含),所以行为是一致的。 - Christian
3个回答

29

Empty 指的是变量处于其默认值。因此,如果您检查一个值为 0 的单元格,如果等于 Empty,那么它将返回 true。

IsEmpty 指的是没有初始化任何值。

简而言之,如果您想查看单元格是否为空(即其值中不存在任何内容),则使用 IsEmpty。如果您想查看某个变量当前是否处于其默认值,则使用 Empty


1
我之前不知道0是Excel单元格的默认值,但现在知道了,这很好。 - Christian
5
使用IsEmpty函数来检查单元格是否为空。但是,Empty只是一个值为零的常量,它并不指代变量处于其默认值:它只是vbEmpty的一种快捷方式,vbEmpty是枚举类型之一,并具有值为零。Excel单元格的默认值是没有值(即IsEmpty):如果将其分配给数字变量,则会被转换为零。 - Charles Williams
@Jean-Francois:你是正确的:从VBA帮助文档中可以看到,“Empty”关键字用作变体子类型。它表示未初始化的变体变量值。 - Charles Williams

4

帮助文档中提到:
IsEmpty 函数用于判断变量是否未初始化或者明确设置为 Empty,如果是,则返回 True;否则返回 False。如果表达式包含多个变量,则始终返回 False。
IsEmpty 仅对 Variant 类型的变量有意义

若要检查单元格是否为空,可以使用 cell(x,y) = ""
您最终可以通过使用 Range("X:Y").SpecialCells(xlCellTypeBlanks) 或者 xlCellTypeConstants 或者 xlCellTypeFormulas 来节省时间。


5
cell(x,y) = "" 如果作用于非空单元格且包含 ="",将会返回 True。因此使用 IsEmpty(cell(x,y)) 更加一致。顺便提一下,cell(x,y) 返回一个 Variant 类型,所以这是 IsEmpty 的一个典型案例。 - Jean-François Corbett

-4

我相信IsEmpty只是一个方法,它获取单元格的返回值并检查其是否为空,因此:IsEmpty(.Cell(i,1)) ->

return .Cell(i,1) <> Empty

@Christian 你有没有考虑到你的逻辑中的“Not”?Not IsEmpty(Sheets("Results").Cells(i, 1)) - nikola-miljkovic
很不幸,在我的系统上无法实现这个功能。当我执行以下代码时:`Do While Not IsEmpty(Sheets("Results").Cells(i, 1)) Sheets("Results").Cells(i, 2).Value = (Sheets("Results").Cells(i, 1) <> Empty) Loop`得到的是一个相邻的布尔列,其中0对应False,其他值对应True。 - Christian
Not IsEmpty() 应该在逻辑上等同于 <>Empty,你觉得呢?也就是说,如果 <>Empty 语句的结果为假,那么带有 Not IsEmpty() 条件的循环应该终止。 - Christian
IsEmpty() = False 在逻辑上等同于 Not IsEmpty(),因此从后者转换到前者没有任何意义。 - Jean-François Corbett

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