运行-添加方法的时间错误VBA

Run-Time error on add method VBA

我的函数的意图在文档字符串中有解释。但是,当我 运行 它时,我得到一个 "Run-Time error '91': Object variable or With block variable not set",并且一行代码被突出显示,如下所示。我找不到这个问题的根源,特别是因为我是 VBA 的新手。任何帮助将不胜感激!

'==============================|Range_Collection FUNCTION|=============================='
' Given a collection and a range, add each value in that range to the collection, except
' for False values.
Function Range_Collection(col As Collection, rng As Range) As Collection

    Dim Val As Variant
    For Each Val In rng
        If Not Val.Value = False Then
            col.Add Val.Value ;************** THIS CODE IS HIGHLIGHTED************
        End If
    Next Val
    Set Range_Collection = col

End Function

Dim Val As Variant更改为Dim Val As Range

假设您的工作表如下所示

这是我 运行 代码

时得到的结果

关于我的评论,请参阅此

语法为col.add"Item","Key"。密钥必须是唯一的。如果您有重复值,则按照我的建议使用 OERN 或使用唯一键。

Sub Sample()
    Dim c As New Collection

    For Each itm In Range_Collection(c, Range("A1:A5"))
        Debug.Print itm
    Next
End Sub
Function Range_Collection(col As Collection, rng As Range) As Collection

    Dim rVal As Variant

    For Each rVal In rng
        If Not rVal.Value = False Then
            On Error Resume Next
            col.Add rVal.Value, CStr(rVal.Value)
            On Error GoTo 0
        End If
    Next rVal

    Set Range_Collection = col
End Function

此外,注意 这个 小 "potential language oddity" ... (任何语言)

当你写道:

If Not Val.Value = False Then

...那么你无疑打算说:(注意括号,仔细...)

 If Not (Val.Value = False) Then 

...(换句话说,"not equal to") ...

但大多数语法实际上比 = 等关系运算符更紧密地绑定 Not 运算符,产生可能是这种 actual 解释,没有语法错误:

 If (Not Val.Value) = False Then

...(换句话说,"if Val.Value is True!")

编译器将你的语句判断为 "syntactically and semantically correct,",事实上它 是。 但它 解释 你所拥有的写的可能不是你想的那样。如果您像我上面显示的那样包含括号,则所有歧义都将消除。

  • 如果您想要"not equal to"始终使用适当的运算符。
  • 使用逻辑运算符时,请充分使用括号以使编译器和其他人都清楚地了解您的意图。

奇怪的是,这种问题导致了我编写的 very first 程序中的错误:"was 6 lines long, took me 6 months to write (in BASIC for a timesharing computer, nevermind how long ago now), and had a bug in it."