检查大量单元格的最有效技术是否包含错误?

时间:2013-03-07 10:11:32

标签: excel vba excel-vba

我有一个电子表格,其中包含许多请求数据的函数调用。我正在编写一个函数(在VBA中)来检查是否有任何单元格包含错误值“#VALUE”等。

目前我逐行逐列迭代并首先检查单元格是否包含公式,如果是,则检查instr为“#VALUE”,“#N / A”等。

但是,我想知道是否可以更快地模拟在Excel中单击整列,然后在VBA中“ctrl + f”获取值....

最有效的方法是什么?我正在检查一张27列×1200行大的表。

编辑我刚刚意识到有一些单元格有“#N / A”,这是因为它们不包含特定的公式。我只需要搜索包含特定公式的单元格......这可能吗?

EDIT2我实际上需要记录一个返回resutls的宏,就像“find all”一样。我使用了“find”,我可以得到一个布尔值,但“找到所有”并没有记录任何VBA代码....

2 个答案:

答案 0 :(得分:6)

您可以使用SpecialCells仅返回包含错误的单元格。

Sub Demo()
    Dim sh As Worksheet
    Dim rng As Range, cl As Range

    For Each sh In ActiveWorkbook.Worksheets
        Set rng = Nothing
        On Error Resume Next
        Set rng = sh.UsedRange.SpecialCells(xlCellTypeFormulas, xlErrors)
        On Error GoTo 0
        If rng Is Nothing Then
            Debug.Print "No Errors"
        Else
            For Each cl In rng
                If cl.Formula Like "*" Then  ' <-- replace * with your criteria
                    Debug.Print cl.Address
                End If
            Next
        End If
    Next
End Sub

答案 1 :(得分:1)

鉴于您想要最有效的方法,您可以尝试这种避免慢速循环的方法

  1. 循环SpecialCells公式chichi包含错误(根据其他解决方案)
  2. 使用Find检测特定公式,而不是通过(1)中每个单元格的简单循环
  3. 此代码使用R1C1方法输入Find,以便代码在必要时更改此Application设置(然后返回结尾)

    我建议你记录你想要找到的公式然后输入。R1C1表示法的一大优点是它与实际的行和列位置无关。

    例如,在A1表示法中的公式为

    • = A5中的SUM(A1:A4)需要对SUM(B1:B4) in B5进行不同的搜索
    • R1C1 =SUM(R[-4]C:R[-1]C)这两种情况

    <强>码

    Sub Demo()
        Dim ws As Worksheet
        Dim rng1 As Range
        Dim rng2 As Range
        Dim rng3 As Range
        Dim strAddress As String
        Dim bRefSTyle
    
        If Application.ReferenceStyle = xlA1 Then
            Application.ReferenceStyle = xlR1C1
            bRefSTyle = True
        End If
    
        For Each ws In ActiveWorkbook.Worksheets
            Set rng1 = Nothing
            On Error Resume Next
            Set rng1 = ws.UsedRange.SpecialCells(xlCellTypeFormulas, xlErrors)
            On Error GoTo 0
            If rng1 Is Nothing Then
                Debug.Print ws.Name & ": No Formulae errors"
            Else
                'search errors for particular formula
                'this sample looks for a formula which SUMS the four cells directly above it
                Set rng2 = rng1.Find("=SUM(R[-4]C:R[-1]C)", , xlFormulas, xlWhole)
                If Not rng2 Is Nothing Then
                    strAddress = rng2.Address
                    Set rng3 = rng2
                    Do
                     Set rng2 = rng1.Find("=SUM(R[-4]C:R[-1]C)", rng2, xlFormulas, xlWhole)
                        Set rng3 = Union(rng2, rng3)
                    Loop While strAddress <> rng2.Address
                    Debug.Print ws.Name & ": " & rng3.Address
                Else
                    Debug.Print ws.Name & ": error cells, but no formulae match"
                End If
            End If
        Next
        'restore styles if necessary
        If bRefSTyle Then Application.ReferenceStyle = xlA1
    End Sub