我的函数的意图在docstring中解释。但是,当我运行它时,我得到一个"运行时错误' 91'对象变量或者没有设置块变量",并突出显示一行代码,如下所示。我找不到这个问题的根源,特别是因为我对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
答案 0 :(得分:1)
将Dim Val As Variant
更改为Dim Val As Range
答案 1 :(得分:1)
让我们说你的工作表看起来像这样
这是我运行代码时得到的结果
继续我的评论,请参阅此
语法为 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
答案 2 :(得分:1)
此外,提防 这个很少"潜在的语言怪异" ...... (使用任何语言)
当你写道:
If Not Val.Value = False Then
...然后你无疑打算说:(注意括号,小心......)
If Not (Val.Value = False) Then
... (换句话说,"不等于") ......
但是大多数语法实际上比关系运算符(例如Not
)更紧密地绑定=
运算符,产生可能是实际解释的内容,没有语法错误:
If (Not Val.Value) = False Then
... (换句话说,"如果Val.Value
真!")
编译器判断您的语句在语法和语义上是正确的,"事实上它是。但你所写的解释可能不是你想象的那样。如果您包含上面显示的括号,则会删除所有歧义。
奇怪的是,这种问题导致了我写过的第一个程序中的一个错误:#6;长达6行,花了我6个月的时间来编写(在BASIC中)对于分时计算机,现在多久以前没关系,并且有一个错误。"