在电子表格中使用Excel SpecialCells不起作用

我写了一个VBA函数,试图绕过使用数组公式检查一个单元格的范围,并返回一些列偏移量。 它基本上是一个Sumif,而不是返回一个总和,返回一个总结的单元格范围。

我遇到的问题是,在工作表内与另一个函数内部调用时,代码的运行方式不同,特别是.SpecialCells在需要时不会限制范围。 例如,在代码中,我只对具有公式或常量的单元格进行比较,这可以很好地限制从另一个macros或直接窗口调用时执行的计算,但是如果将其作为表单中的公式input,它根本不会限制它(如果我将整列作为比较指定,即使列中的大部分单元格都是空白的,它仍会遍历所有1048576单元格)

重要的代码如下:

For Each CheckCell In Check.SpecialCells(xlCellTypeConstants) 

对于作为范围的检查(“A:A”),理想情况下,这将运行132个单元,其中有一个常量,而是运行整个列。

任何想法如何让这个工作更明智? 其余的代码对我所需要的工作非常好,我只是不想花费几秒钟计算这个公式所用的每个单元格的整个列。

完整的function:

 Function RangeIf(returnColumn As Range, Check As Range, Condition As String) As Range 'Exit Function Dim Operator As Integer, HasOperator As Boolean, TheColumn As String, CheckCell As Range, Passed As Boolean, ReturnRange As Range HasOperator = True Operator = 0 TheColumn = Mid(returnColumn.Cells(1, 1).Address, 2) TheColumn = "$" & Mid(TheColumn, 1, InStr(1, TheColumn, "$")) While HasOperator Select Case Mid(Condition, 1, 1) Case "<" Operator = Operator Or 1 Condition = Mid(Condition, 2) Case ">" Operator = Operator Or 2 Condition = Mid(Condition, 2) Case "=" Operator = Operator Or 4 Condition = Mid(Condition, 2) Case Else HasOperator = False End Select Wend For Each CheckCell In Intersect(Check, Check.Parent.UsedRange).Cells Passed = False 'UpdateStatusBar "Processing Cell: " & CheckCell.Address Select Case Operator Case 0, 4 'No op or Equals If CheckCell.Value = Condition Then Passed = True Case 1 ' Less than If CheckCell.Value < Condition Then Passed = True Case 2 ' Greater than If CheckCell.Value > Condition Then Passed = True Case 3 ' Not If CheckCell.Value <> Condition Then Passed = True Case 5 ' Less or Equal If CheckCell.Value <= Condition Then Passed = True Case 6 ' Greater or Equal If CheckCell.Value >= Condition Then Passed = True End Select If Passed Then If Not ReturnRange Is Nothing Then Set ReturnRange = Union(ReturnRange, Range(TheColumn & CheckCell.Row)) Else Set ReturnRange = Range(TheColumn & CheckCell.Row) End If End If Next CheckCell Set RangeIf = ReturnRange End Function 

SpecialCells不能在UDF中工作。 这是Excel的限制。 以下是在UDF中不起作用的列表。

http://www.decisionmodels.com/calcsecretsj.htm

你必须单独循环单元格。 开始我的限制检查只有UsedRange。

 For Each CheckCell in Intersect(Check, Check.Parent.UsedRange).Cells 

这可能会保持在一百万以下。 你可以进一步减less它,但是这将是特定于你的情况。