1

考虑以下 VBA 函数:

Function getFirstColumn(Optional sheetName As String) As Long
    'In particular the IF statement below.
    If sheetName = "" Or sheetName = Null Then sheetName = ActiveWorkbook.ActiveSheet.Name
    With ActiveWorkbook.Worksheets(sheetName)
        getFirstColumn = .Cells.Find("*", .Cells(1), xlFormulas, xlWhole, xlByColumns, xlNext).Column
        If Err <> 0 Then getFirstColumn = 0
    End With
End Function

使用此功能时,从第二张打开的工作表中使用它时没有问题。

但是,当代码更改为基于函数的等效代码时,'If IsEmpty(sheetName) Or IsNull(sheetName) Then sheetName = ActiveWorkbook.ActiveSheet.Name如果我尝试使用不拥有它的工作表中的函数,我会遇到问题:

Erro em tempo de execução '9':
Subscrito fora do intervalo。

它们之间有什么区别?为什么会准确触发这样的错误?

4

2 回答 2

2

“sheetName”是一个变量。该变量可能是未定义的,可能是指一个对象......或者可能是 NULL。

如果它是一个对象,则该对象本身可能评估为变量值 NULL。因此,“IsNull()”函数。

其他变体包括“IsEmpty()”(您提到过)、“IsNothing()”甚至“IsMissing()”:

于 2012-10-05T17:05:56.890 回答
1

在 VBA 中,未指定的可选字符串的计算结果为空字符串。

因此,如果在没有参数的情况下调用 getFirstColumn,则 sheetName 是空字符串,并且

sheetName = "" is true
isEmpty(sheetName) is false
isNull(sheetName) is false
sheetName = Null is Null btw.

所以选择第一个选项。

于 2012-10-05T17:29:45.130 回答