Удалить строки на основе списка номеров строк

У меня есть список номеров строк, которые мне нужно сохранить. Все остальные строки необходимо удалить.

Этот макрос удаляет целые строки на основе номеров строк в списке. Он работает именно так, как задумано.

Как его можно изменить, чтобы удалить все строки, КРОМЕ этих строк в списке?


Dim deleteRows As Range
Dim data() As Variant
Dim i As Double

Dim SourceWks As Worksheet
Dim oldWks As Worksheet

Set SourceWks = Sheets("TBDws")
Set oldWks = Sheets("TBDsamples")

    With SourceWks
        data = .Range(.Cells(1, 1), .Cells(1, 1).End(xlDown))
    End With

    Set deleteRows = oldWks.Rows(data(1, 1))

    For i = 2 To UBound(data, 1)

        Set deleteRows = Union(deleteRows, oldWks.Rows(data(i, 1)))

    Next i

    deleteRows.Delete Shift:=xlUp

End Sub

Можете ли вы предоставить скриншот примера данных из SourceWks?

TinMan 16.03.2022 21:58
Преобразование HTML-таблицы в профессиональный документ Excel
Преобразование HTML-таблицы в профессиональный документ Excel
Это самый простой способ создания Excel из HTML-таблицы.
Импорт excel в laravel в базу данных
Импорт excel в laravel в базу данных
Здравствуйте, дорогой читатель, в этой статье я расскажу практическим и быстрым способом, как импортировать файл Excel в вашу базу данных с помощью...
1
1
43
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это приведет к удалению всех строк на листе TBDsamples, которые не указаны в столбце A на TBDws.

Sub DeleteThings()
Dim SourceWks As Worksheet
Dim oldWks As Worksheet
Dim deleteRange As Range
Dim arrRows() As Variant
Dim Res As Variant
Dim I As Long

    Set SourceWks = Sheets("TBDws")
    Set oldWks = Sheets("TBDsamples")

    With SourceWks
        arrRows = .Range(.Cells(1, 1), .Cells(1, 1).End(xlDown))
    End With

    For I = 1 To oldWks.Range("A" & Rows.Count).End(xlUp).Row

        Res = Application.Match(I, arrRows, 0)
        If IsError(Res) Then
            If deleteRange Is Nothing Then
                Set deleteRange = oldWks.Rows(I)
            Else
                Set deleteRange = Union(deleteRange, oldWks.Rows(I))
            End If
        End If

    Next I

    deleteRange.Delete Shift:=xlUp

End Sub

Обратите внимание, что Application.Match работает во много раз быстрее с диапазоном, чем с массивом, то есть Dim data As Range: Set data = .Range(.Cells(1, 1), .Cells(1, 1).End(xlDown)) (однако используйте лучшее имя переменной).

VBasic2008 16.03.2022 22:18

Не знал этого. :)

norie 16.03.2022 22:29

Еще один вопрос: хотя этот код работает, когда на листе TBDsamples всего 11 строк, мне нужно, чтобы это число было переменным в зависимости от размера моих данных. Когда я изменяю строку «Для i = 11», чтобы использовать указанную выше переменную, код больше не работает правильно.

MM_1980 17.03.2022 13:51

Извините, это опечатка - я отредактирую ответ позже, чтобы исправить это.

norie 17.03.2022 13:59

Пожалуйста, дайте мне знать, когда вы обновитесь. Я хотел бы изменить свой код как можно скорее. Спасибо!

MM_1980 17.03.2022 19:37

Я обновил код.

norie 17.03.2022 20:28

Другие вопросы по теме