选择整列时,Excel UDF函数运行速度非常慢

时间:2014-08-05 16:38:27

标签: excel vba excel-vba

我有一个从MSDN中获取的函数,它计算一个范围内具有另一个单元格颜色的单元格数。

这是代码

Function countCcolor(range_data As Range, criteria As Range) As Long
    Application.Volatile
    Application.ScreenUpdating = False
    Dim datax As Range
    Dim xcolor As Long
xcolor = criteria.Interior.ColorIndex
For Each datax In range_data
    If datax.Interior.ColorIndex = xcolor Then
        countCcolor = countCcolor + 1
    End If
Next datax
Application.ScreenUpdating = True
End Function

我把整个列放到的唯一原因就是如果该列中的值发生了变化,我需要更新它,实际上可能永远不会有超过200行(现在有85行)所以它不应该这样做。跑得这么慢。

3 个答案:

答案 0 :(得分:3)

  

当我整个进入单元格时,公式countcColor(j:j,H2)例如运行得非常慢。

是的,因为您正在针对1,048,576行(​​Excel 2007 +)运行易失函数

  

如果我做J1:4000它运行良好

我想你回答了自己的问题。您真的是否需要检查列中的每个单元格?很可能不是。所以你需要一些方法告诉它“停止”。这可能会有所帮助:

For each datax in Application.Intersect(range_data, range_data.Parent.usedRange)

答案 1 :(得分:0)

在Excel 2010中,最大行数为1,048,576。因此,当您选择“整个”列时,您将浏览所有这些行。

选择列的更好方法是:

ActiveSheet.UsedRange.Columns(5)

或(忽略格式化但没有值的单元格,仅适用于小文件,因为如果excel文件使用最大行数,rows.count + 1将会中断)

ActiveSheet.Range("A" & ActiveSheet.UsedRange.Rows.Count + 1).End(xlUp)

答案 2 :(得分:0)

也许更好的解决方案是在单元格中使用与内部相同的字体颜色的一些文本使其不可见,例如“R”,“Y”,“G”等。然后您可以使用COUNTIF计算每个字母的出现次数,而不是循环检查内部颜色。