Excel VBA函数提供奇怪的返回

时间:2016-02-15 18:07:47

标签: excel vba excel-vba

我的情况如下:

我有一个功能:

Function test(TestValue As String, TargetRange As Range) As String
     Dim rng2 As String   Dim C As Range


  For Each C In TargetRange
    If C.Text = TestValue Then
        If rng2 <> vbNullString Then
            rng2 = rng2 & "," & C.Address
        Else
            rng2 = C.Address
        End If
    End If
    Next   test = rng2 
End Function

这个查找具有特定值的单元格的范围,并将单元格地址添加到字符串中。这非常有效。

其次我有2号功能:

Function CountCellsByColor2(rData As String, cellRefColor As Range) As Long
    Dim indRefColor As Long
    Dim cellCurrent As Range
    Dim cntRes As Long
    Dim test As Long

    'Application.Volatile
    cntRes = 0
    indRefColor = cellRefColor.Cells(1, 1).Interior.Color
    For Each cellCurrent In Range(rData)
        If indRefColor = cellCurrent.Interior.Color Then
            cntRes = cntRes + 1
        End If
    Next cellCurrent

    CountCellsByColor2 = cntRes
End Function

这个使用带有地址的字符串并检查给定颜色的单元格,并返回一个数字具有给定颜色的单元格数。

到目前为止非常简单。

现在我的问题是,当我的字符串不超过20个单元格地址时,一切都很完美但是当我添加到31左右时,Color函数返回#Value!。

当我从其他工作表中使用它时,可以说=CountCellsByColor2(test("Apple";!SomeSheetF2:F300);H5)。我得到一些输入或正确答案或#Value!。

所以如果我反对excel或Vba的某些限制,我真的不会。或者也许我的细胞串变大了。我希望有人能快速看到出了什么问题。

3 个答案:

答案 0 :(得分:1)

我相信您使用Union运算符(逗号)遇到了限制。 Union方法本身有30个参数的限制,因此,使用您的字符串创建方法,在31处返回错误会有所帮助。

编辑:似乎不是适用的联盟限制。相反,问题是Range对象的参数长度。当我测试时,我没有看到错误,直到我在论证中有大约40个单元格。进一步的实证测试表明,当Range对象的参数大于255个字符时会产生错误。此限制也可能适用于其他VBA对象或语句或方法的参数。

对于现有代码的最小更改,请尝试以下操作,将逗号分隔的范围列表拆分并逐个测试。

这是为了帮助您了解编码问题。那里 但是,这可能是更有效的编码方法。

def reverse(text):
    length = len(text) - 1
    a = ''
    for pos in range(length,-1,-1):
        a += text[pos]
    return a

答案 1 :(得分:0)

让第一个arg是 String

enter image description here

答案 2 :(得分:0)

为什么使用String来收集细胞?集合使它变得如此简单。

Function Test(TestValue As String, TargetRange As Range) As Collection
    Dim c As Range

    'Initialize collection
    Set Test = New Collection

    'Loop through range
    For Each c In TargetRange
        If (c.Text = TestValue) Then
            Test.Add c
        End If
    Next c
End Function

Function CountCellsByColor2(rData As Collection, cellRefColor As Range) As Long
    Dim indRefColor As Long
    Dim cellCurrent As Range

    'Determine color
    indRefColor = cellRefColor.Cells(1, 1).Interior.Color

    'Loop through all cells
    For Each cellCurrent In rData
        If (cellCurrent.Interior.Color = indRefColor) Then
            CountCellsByColor2 = CountCellsByColor2 + 1
        End If
    Next cellCurrent
End Function