У меня есть файл Excel с необработанными данными на одном листе (данные прогноза) и списком значений на другом листе (NonNSX). Я пытаюсь написать код, который будет циклически проходить по столбцу D в данных, и если он найдет список значений в NonNSX, удалите всю строку в данных.

Мне нужно, чтобы он проверил все строки данных на предмет первого значения, отличного от NNX, затем вернулся к началу данных и проверил наличие 2-го значения на языке, отличном от NNX, и зациклил все это до завершения. В данных часто встречается несколько дубликатов одного и того же значения в NSX, и мне нужно удалить их все.

Приведенный ниже код работает, но он удаляет ОДНУ из строк в Data для каждого значения каждый раз, когда я запускаю код. Есть идеи? Примечание: «d = d-1» внутри IF - это настройка номера строки для просмотра следующего, если строка действительно удалена)

Вот код:

Sub Remove()

    Set nsx = Sheets("NonNSX")
    Set fc = Sheets("Forecast Data")
    Dim n As Integer
    Dim d As Integer
    Dim r As Integer
    n = 1
    d = 2
    r = 1
    NumRows = fc.Range("D2", fc.Range("D2").End(xlDown)).Rows.Count

    Do Until IsEmpty(nsx.Range("A" & n))
        For r = 1 To NumRows
            If nsx.Range("A" & n) = fc.Range("D" & d) Then
                fc.Range("D" & d).EntireRow.Delete
                Exit For
                d = d - 1
            End If
            d = d + 1
        Next r
        d = 2
        n = n + 1
    Loop

End Sub

1 ответ1

1

Мы можем заменить один из циклов на Match.

Мы также хотим вернуться назад снизу вверх.

Sub Remove()
Dim nsx As Worksheet
Dim fc As Worksheet

Set nsx = Sheets("NonNSX")
Set fc = Sheets("Forecast Data")

Dim lookUp As Range
Dim n As Long
Dim d As Long

NumRows = fc.Range("D1", fc.Range("D2").End(xlDown)).Rows.Count

Set lookUp = nsx.Range("A1", nsx.Range("A1").End(xlDown))

For n = NumRows To 2 Step -1
    d = 0
    On Error Resume Next
        d = Application.WorksheetFunction.Match(fc.Range("D" & n), lookUp, 0)
    On Error GoTo 0
    If d > 0 Then
        fc.Rows(n).Delete
    End If
Next n



End Sub

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .