6

データを要求するための関数呼び出しが多数含まれているスプレッドシートがあります。セルにエラー値「#VALUE」などが含まれているかどうかを確認する関数を(VBAで)作成しています。

現時点では、行ごと、列ごとに繰り返し、最初にセルに数式が含まれているかどうかを確認し、含まれている場合は 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. SpecialCells数式のループにエラーが含まれています (他の解決策による)
  2. Find(1) のすべてのセルを単純にループするのではなく、特定の数式を検出するために使用します。

このコードはR1C1メソッドを使用して にフィードするFindため、コードは必要に応じてこのApplication設定を変更します (その後、最後に戻ります)。

見つけたい数式を記録してから入力することをお勧めします。R1C1表記法の大きな利点は、実際の行と列の位置にとらわれないことです。

たとえば、A1表記法では

  • =SUM(A1:A4) in では、 B5`A5に対して別の検索が必要になります。SUM(B1:B4) in
  • 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 に答える