运行-添加方法的时间错误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."
我的函数的意图在文档字符串中有解释。但是,当我 运行 它时,我得到一个 "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."