添加方法VBA上的运行时错误
我的函数的意图在docstring中解释。但是,当我运行它时,我会得到一个“运行时错误'91':对象变量或未设置块变量”,并突出显示一行代码,如下所示。我找不到这个问题的根源,特别是因为我对VBA比较陌生。任何帮助都将不胜感激添加方法VBA上的运行时错误,vba,excel,excel-2010,Vba,Excel,Excel 2010,我的函数的意图在docstring中解释。但是,当我运行它时,我会得到一个“运行时错误'91':对象变量或未设置块变量”,并突出显示一行代码,如下所示。我找不到这个问题的根源,特别是因为我对VBA比较陌生。任何帮助都将不胜感激 '==============================|Range_Collection FUNCTION|==============================' ' Given a collection and a range, add each val
'==============================|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
另外,要注意这个小小的“潜在的语言怪癖”。。。(任何语言) 当你写道:
If Not Val.Value = False Then
。。。那么你肯定想说:(小心地记下括号…)
。。。(换句话说,“不等于”)
但大多数语法实际上将Not
运算符绑定得比关系运算符(如=
)更紧密,产生了这种实际解释,没有语法错误:
If (Not Val.Value) = False Then
。。。(换句话说,“如果Val.Value
为True!”)
编译器判断您的语句“在语法和语义上都是正确的”,事实上也是如此。但它对你所写内容的解释可能与你想象的不同。如果像我上面所展示的那样包含括号,那么所有歧义都会被消除
- 如果希望“不等于”,请始终使用适当的运算符
- 在使用逻辑运算符时,请充分使用括号,以便让编译器和其他人都清楚地了解您的意图
奇怪的是,这类问题导致了我编写的第一个程序中的一个错误:它“有6行长,花了我6个月的时间编写(对于分时计算机来说是BASIC,不管现在有多长时间了),并且有一个错误。”
col.Add Val.Value,cstr(Val.Value)
?如果您尝试两次添加同一项目,这将给您带来一个错误,因此您可能必须在错误恢复下一步时的和错误转到0时的之间封装它。不幸的是,尝试后我收到了相同的错误。请参阅注释上的编辑我不再收到错误。你知道可能是什么原因吗?我要出去一个小时。如果您有任何问题,请在我的问题下方留言,我会在回来时回答:)谢谢您指出!我习惯用括号括住Java中的所有内容,所以现在使用VBA时,我会有点困惑,因为许多函数不需要括号,有些函数对它们有不同的需求。这是一种非常“松散”的语法。。。这就是当一种语言试图提供帮助时所得到的结果,这也是为什么Java(嗯…)对括号和其他很多东西非常敏感的原因之一。这两种语言都没有错,但它们是由两个完全不同的团队编写的非常不同的动物。
If (Not Val.Value) = False Then