Excel UDF函数在select整个列时运行速度非常慢

我有一个函数,我从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),所以它不应该运行这慢。

当我把整个单元格countcColor(j:j,H2)例如它运行得非常慢。

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

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

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

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

在Excel 2010中,最大行数为1,048,576。 所以,当你select和整个列,你正在经历所有这些行。

select列的更好方法是:

 ActiveSheet.UsedRange.Columns(5) 

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

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

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