Как вы можете удалить все строки в диапазоне? - PullRequest
0 голосов
/ 15 января 2020

Я новичок в vba, и я написал код ниже, но не могу понять, почему он не работает.

Sub DataValidationDeleteWrongOrigin()
'
'Description: Goes through and deletes rows that are called out on the delete entry column.
'


'Dimension Worksheet
Dim DataValWs As Worksheet
Set DataValWs = Worksheets("Data Validation")

'Find the size of the table and store it as LastDataRow
Dim LastDataRow As Long
LastDataRow = DataValWs.Range("A5").End(xlDown).Row


'ThisRow will be the current row as the for loop goes through each row.
Dim ThisRow As Long
Dim DeleteRange As Range
Dim CurrentRow As Range
'Start the for loop from row 5
For ThisRow = 5 To LastDataRow

    'Check the Delete Entry row to see if it says Yes, delete the row. Use DeleteRange to add cells to it and delete them all at the end (much _
    faster than deleting them one at a time, and you don't have to re-find the size of the table after each row is deleted).

    If Cells(ThisRow, 16) = "Yes" Then
        If Not DeleteRange Is Nothing Then
            Set CurrentRow = DataValWs.Rows(ThisRow)
            Set DeleteRange = Union(CurrentRow, DeleteRange)
        Else
            Set DeleteRange = DataValWs.Cells(ThisRow, 16)
        End If


    End If

Next ThisRow

'DeleteRange.Select
DeleteRange.EntireRow.Delete



End Sub

В настоящее время код дает мне

Ошибка выполнения 1004: сбой при удалении метода класса Range.

"DeleteRange.Select", который закомментирован в конце кода, выбирает правильный диапазон, поэтому я знаю, что диапазон строится точно.

Я хочу иметь возможность просто отбросить все строки, которые будут удалены с листа, - количество удаляемых строк в этом приложении может быть довольно большим, и я бы предпочел это запускать не вечно.

Я посмотрел в Интернете и нашел пару решений, которые включают итеративное прохождение DeleteRange и удаление каждой строки из него, но это дает мне ту же проблему удаления строк один за раз. Есть ли лучший способ справиться с этим? Или, что еще лучше, я запутался в определении DeleteRange?

Спасибо!

Редактировать:

Было ли какое-то тестирование с разными наборами строк, и оказалось, что у него нет проблем с удалением строк, если они все рядом друг с другом. Только приводит к ошибке времени выполнения, если между строками есть промежутки между ними ...

Ответы [ 2 ]

0 голосов
/ 15 января 2020

Я мог бы воспроизвести вашу проблему только тогда, когда рядом с диапазоном находился объект (т.е. ListObject)

enter image description here

Проверьте данные в вашей рабочей таблице, и в этом случае используйте rDelete.Delete Shift:=xlUp

Предполагая, что ваши ДАННЫЕ находятся в диапазоне A5:P# (где # - последняя строка данных), используйте этот код.

Sub Delete_Rows()
Dim ws As Worksheet
Dim rDelete As Range
Dim rData As Range, rRow As Range, lRw As Long

    Set ws = Worksheets("Data Validation")
    With ws
        lRw = .Range("A5").End(xlDown).Row
        Set rData = Range(.Range("A5"), Range("P" & lRw))    'adjust as required
    End With

    For Each rRow In rData.Rows
        If rRow.Cells(16) = "Yes" Then
            If rDelete Is Nothing Then
                Set rDelete = rRow

            Else
                Set rDelete = Union(rDelete, rRow)

    End If: End If: Next

    rDelete.Delete Shift:=xlUp

    End Sub
0 голосов
/ 15 января 2020

Добавьте свойство «FullRow» в строку следующим образом:

Set DeleteRange = DataValWs.Cells(ThisRow, 16).EntireRow
...