Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
添加方法VBA上的运行时错误_Vba_Excel_Excel 2010 - Fatal编程技术网

添加方法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

我的函数的意图在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

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