我的情况如下:
我有一个功能:
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的某些限制,我真的不会。或者也许我的细胞串变大了。我希望有人能快速看到出了什么问题。
答案 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)
答案 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