Итерация по ячейкам в диапазоне - PullRequest
3 голосов
/ 28 февраля 2011

В настоящее время я использую следующий код для проверки столбца A в определенном диапазоне ячеек на значение # N / A, и, если он найден, я удаляю эту строку.

With Sheets(Sheet)
        For LRow = 45 To 29 Step -1
            With .Cells(LRow, "A")
                If (CVErr(.Value) = CVErr(xlErrNA)) Then .EntireRow.Delete
            End With
        Next LRow
    End With

Мне нужно расширить это, чтобы я проверял все столбцы с 1 по 10, а не только A. Я попробовал эту небольшую модификацию (вложив еще один цикл), но она не работает. Есть предложения?

With Sheets(Sheet)
        For LRow = 45 To 29 Step -1
            For LCol = 10 To 1 Step -1
                With .Cells(LRow, LCol)
                    If (CVErr(.Value) = CVErr(xlErrNA)) Then .EntireRow.Delete
                End With
            Next LCol
        Next LRow
    End With

Ответы [ 4 ]

2 голосов
/ 28 февраля 2011

Это может не работать на других языках, кроме английского

Sub DeleteNA()

    Dim rRange As Range
    Dim rFound As Range

    Const sNA As String = "#N/A"

    Do
        Set rRange = Sheet1.Range("A29:F49")
        Set rFound = rRange.Find(sNA, , xlValues, xlWhole, xlByRows)
        If Not rFound Is Nothing Then
            rFound.EntireRow.Delete
        Else
            Exit Do
        End If
    Loop

End Sub

Измените A29: F49 в соответствии с вашими данными.

2 голосов
/ 28 февраля 2011

две проблемы здесь:

  • вложенный с

  • в любой строке после того, как N / A найден, вам нужно прервать операциюцикл

try

Set sh = Sheets(Sheet)
For LRow = 45 To 29 Step -1
    For LCol = 10 To 1 Step -1
        If (CVErr(sh.Cells(LRow, LCol).Value) = CVErr(xlErrNA)) Then 
            sh.Cells(LRow, 1).EntireRow.Delete
            Exit For ' Exit the LCol loop
        End If
    Next LCol
Next LRow
0 голосов
/ 28 февраля 2011

Я полагаю, что во вложенных предложениях 'with' возникли проблемы.

Вы можете определить правильный диапазон и использовать цикл «для каждого», который сделает вещи более понятными и удобными для чтения. Для тестирования я назвал диапазон «MyRange».

Sub test()

    Dim cell As Excel.Range

    For Each cell In [myRange]

        If CVErr(cell.Value) = CVErr(xlErrNA) Then cell.EntireRow.Delete

    Next cell

End Sub
0 голосов
/ 28 февраля 2011

Вы можете использовать немного другой подход

Sheets("Sheet1").Select
Set cols = Range("A1:D80")
For Each Cell In cols
    If Cell.Value = "XXX" Then
        Cell.EntireRow.Delete
    End If
Next
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...