Excel VBA - Удалить строки при определенных условиях - PullRequest
1 голос
/ 31 октября 2019

Если строка имеет значение НЕАКТИВНО в column D и # Н / Д в column H, я хочу удалить эту строку.

Iпытался добиться этого с помощью моего кода ниже, но ни одна строка на самом деле не удаляется.

Dim ws3 As Worksheet
Dim r As Integer
Set ws3 = ThisWorkbook.Sheets("Sheet2")
With ws3
For r = Sheet2.UsedRange.Rows.Count To 2 Step -1
If Cells(r, "D").Value = "INACTIVE" And Cells(r, "H").Value = "#N/A" Then
Sheet2.Rows(r).EntireRow.Delete
End If
Next
End With

1 Ответ

2 голосов
/ 31 октября 2019

Несколько проблем.

  • Вы не можете правильно квалифицировать объекты диапазона.
    • Вы (правильно) используете With ws3, но затем никогда не обращаетесь к нему
  • Если #N/A является фактическим значением ошибки, а не текстовой строкой,ваш макрос потерпит неудачу с ошибкой несоответствия типов.
  • Если первая строка UsedRange не является строкой 1, то rows.count.row не будет отражать последнюю строку
  • r должно бытьобъявлен как Long, а не Integer.
    • Integer ограничен значением 32768, и на рабочем листе может быть гораздо больше строк.
    • VBA в любом случае будет внутренне преобразовывать Integer в Long.
  • Кроме того, как указано @FoxfireAndBurnsAndBurns, Sheets("Sheet2") может не совпадать с Sheet2. Вы, кажется, используете их взаимозаменяемо в своем коде. Установите ws3 на тот, который вы действительно хотите. И проверьте vba HELP для CodeName, чтобы понять разницу.

Может работать следующая модификация вашего кода:

Option Explicit
Sub due()
  Dim ws3 As Worksheet
  Dim r As Long
  Dim lastRow As Long

Set ws3 = ThisWorkbook.Sheets("Sheet2")
With ws3
    lastRow = .Cells(.Rows.Count, "D").End(xlUp).Row
    For r = lastRow To 2 Step -1
        If .Cells(r, "D").Value = "INACTIVE" And .Cells(r, "H").Text = "#N/A" Then
            .Rows(r).EntireRow.Delete
        End If
    Next
End With

End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...