VBA - удалить строки на основе значения столбца - PullRequest
0 голосов
/ 13 января 2019

Я пытаюсь написать небольшой кусочек кода для кнопки управления ActiveX. Я не лучший в VBA и делаю это только в свободное время, так что сэкономьте мне немного изящества ... У меня есть таблица "Master Inventory". Столбцы с «B» по «N» содержат данные об инвентаре. Как только инвентарь отправлен, он отмечается в столбце «N» буквой «Y» (для «Да»).

  1. Я хочу, чтобы кнопка управления Activex удаляла ТОЛЬКО строки (B3: N98), где столбец "N" = "Y".
  2. Я не хочу, чтобы форматирование или формулы удалялись - ТОЛЬКО значения.
  3. Я бы хотел, чтобы данные были сжаты и помещены в начало списка после удаления строк.

Я успешно справился с № 2, но не с № 1 или № 3. Я удаляю все строки, но, похоже, не могу получить правильное выражение «If», чтобы распознавать только эти значения «Y».

Любая помощь очень ценится.

Private Sub CommandButton1_Click()
    On Error Resume Next
    For I = 3 To 498
        If Range(I, "N").Text = "Y" Then
            Range("B3:N27").SpecialCells(xlCellTypeConstants).ClearContents
        End If
    Next I
End Sub

Ответы [ 2 ]

0 голосов
/ 13 января 2019

Гораздо более быстрый способ - создать объект диапазона, содержащий все строки, помеченные для удаления, а затем выполнить удаление сразу в конце. Удаление строк один за другим внутри цикла может быть мучительно медленным в Excel, особенно с учетом увеличения количества строк.

Попробуйте это:

Public Sub DeleteRowsWithRange()

Dim rngLoop As Range
Dim rngMyRange As Range

    For Each rngLoop In Columns("N").Cells

    If rngLoop.Value = "" Then ' This is your exist clause. You can change this depending on your worksheet structure.
        Exit For  
    ElseIf rngLoop.Value = "N" Then
        If rngMyRange Is Nothing Then
            Set rngMyRange = rngLoop.EntireRow
        Else
            Set rngMyRange = Union(rngMyRange, rngLoop.EntireRow)
        End If
    End If

    Next rngLoop

    rngMyRange.Delete xlShiftUp

    Set rngLoop = Nothing
    Set rngMyRange = Nothing

End Sub
0 голосов
/ 13 января 2019

При удалении строк необходимо начинать снизу и работать вверх, чтобы оставшиеся номера строк не менялись. Столбец "N" равен 14, так что вы можете использовать логику вот так.

Sub DeleteRows()
Dim I As Long
For I = 498 To 3 Step -1
If Cells(I, 14).Value = "Y" Then
Rows(I).EntireRow.Delete
End If
Next I
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...