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

时间:2013-10-16 19:52:11

标签: excel excel-vba excel-formula vba

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

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

重要的代码如下:

 For Each CheckCell In Check.SpecialCells(xlCellTypeConstants)

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

任何想法如何让这个更合理地工作?其余的代码非常适合我需要的东西,我只是不想花几秒钟计算这个公式所用的每个单元格的整个列。

完成功能:

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

1 个答案:

答案 0 :(得分:4)

SpecialCells在UDF中不起作用。这是Excel的限制。这是一个在UDF中不起作用的事项列表。

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

您必须单独循环遍历单元格。开始我的限制只检查UsedRange。

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

这可能会让它低于一百万。您可以进一步减少它,但它将根据您的具体情况而定。