Excluindo linhas em uma folha com base em procurar valor em outra folha

0

Eu tenho um arquivo do Excel com dados brutos em uma planilha (Dados de previsão) e uma lista de valores em outra planilha (NonNSX). Eu estou tentando escrever código que irá circular pela coluna D em dados e se ele encontrar uma lista de valores em NonNSX, exclua a linha inteira em dados.

Eu preciso verificar todas as linhas em Dados para o primeiro valor nonNSX, depois voltar para a parte superior de Data e verificar o segundo valor em nonNSX e fazer o loop de tudo isso até terminar. Nos dados, muitas vezes há várias duplicatas do mesmo valor no NSX, e eu preciso excluir todas elas.

O código abaixo funciona, mas apenas exclui uma das linhas em Dados para cada valor toda vez que eu executo o código. Alguma ideia? Nota: o "d = d-1" dentro do IF é para ajustar o número da linha para olhar a próxima, se uma linha é realmente excluída)

Aqui está o código:

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
    
por RobACVVA 13.07.2017 / 21:42

1 resposta

1

Podemos substituir um dos loops por um Match.

Também queremos fazer um loop de trás para baixo.

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
    
por 13.07.2017 / 21:59