6

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

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

但是,我想知道是否会更快地模拟在 excel 中单击整个列,然后在 VBA 中单击“ctrl + f”获取值……。

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

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

EDIT2 我实际上需要记录一个返回结果的宏,就像“查找全部”一样。我用过“查找”,我可以得到一个布尔值,但“查找所有”不记录任何 VBA 代码....

4

2 回答 2

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
于 2013-03-07T10:44:48.013 回答
1

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

  1. 通过公式 chichi 循环SpecialCells包含错误(根据其他解决方案)
  2. 用于Find检测特定公式,而不是通过 (1) 中的每个单元格进行简单循环

此代码使用该R1C1方法输入,Find因此代码在必要时更改此Application设置(然后在最后返回)

我建议您记录您希望找到的公式,然后将其输入。R1C1符号的最大优点是它与实际的行和列位置无关。

例如在A1符号中的一个公式

  • =SUM(A1:A4) inA5需要对SUM(B1:B4) inB5进行不同的搜索
  • 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
于 2013-03-10T03:17:16.433 回答