Удаление строк с помощью обратной петли - VB - PullRequest
1 голос
/ 06 июня 2019

У меня есть набор данных, который содержит кучу информации о клиентах.Я хочу, чтобы эта информация была перенесена на другой лист, когда Yes введен в ячейку в строке K, и исходная строка, содержащая информацию, которая будет удалена с первого листа

Я делаю это с помощьюнажмите кнопку.Работает нормально, и строки были удалены, но, конечно, когда он удаляет строку, номера строк сдвигаются на единицу, и поэтому следующая строка пропускается (строка 15 удаляется, а затем строка 16 становится строкой 15 и т. Д.), Поэтому яЯ подумал, что обратный путь - это путь, но я не могу понять, насколько это возможно - я думал, что это будет просто!Вот код, который я использую:

Private Sub UpdateSheet2_Click()

Dim c As Range
Dim Source As Worksheet
Dim Target As Worksheet

    'Change worksheet designation as needed
    Set Source = ActiveWorkbook.Worksheets("Sheet1")
    Set Target = ActiveWorkbook.Worksheets("Sheet2")

    For Each c In Source.Range("K:K") 'Covers all rows          
        If c = "yes" Then
            Source.Range("A" & c.Row & ":B" & c.Row).Copy Target.Range("A" & Rows.Count).End(xlUp).Offset(1, 0)
            Source.Range("D" & c.Row & ":F" & c.Row).Copy Target.Range("C" & Rows.Count).End(xlUp).Offset(1, 0)
            Source.Range("H" & c.Row & ":J" & c.Row).Copy Target.Range("F" & Rows.Count).End(xlUp).Offset(1, 0)    
        End If

'        If c = "yes" Then
'            Source.Rows(c.Row).EntireRow.Delete
'        End If
    Next c

    For i = 500 To 1 Step -1
        If Source.Range("K" & i) = "yes" Then
            Source.Rows(i.Row).EntireRow.Delete
        End If  
    Next i 

End Sub

Сейчас я просто устанавливаю номера строк от 1 до 500, я изменю это, когда у меня будет работать базовая функциональность.Вы можете увидеть, где я закомментировал оригинальный метод удаления в цикле For Each.В настоящее время я получаю сообщение об ошибке «Требуется объект» в строке Source.Rows(i.Row).EntireRow.Delete

1 Ответ

3 голосов
/ 06 июня 2019

Как правило, более эффективно удалять все строки одновременно.

Set c = Nothing 'reset your range
For i = 1 To 500 'or 500 To 1 Step -1 - doesn't make a difference
    If Source.Range("K" & i) = "yes" Then
        If c Is Nothing Then
            Set c = .Cells(i, 1).EntireRow 'if the range is empty then set it to the required row
        Else
            Set c = Union(c, .Cells(i, 1)).EntireRow 'otherwise add this row
        End If
    End If
Next
If Not c Is Nothing Then c.Delete xlUp 'if the range is not empty then delete all the rows

(Я должен добавить, что использование Cells(x,y).EntireRow - это исключительно личное предпочтение. Я всегда использую этот формат, как нахожулегче отлаживать.)

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