Excel VBA: L oop для удаления строк, если значение ячейки находится в другом диапазоне - PullRequest
0 голосов
/ 11 июля 2020

Я новичок в VBA. У меня есть столбец из 500 имен. На другом листе у меня есть более короткий столбец с именами, все найденные в более длинном.

Я пытаюсь пройти l oop через более длинный столбец и удалить все строки, в которых значение ячейки не найдено в более коротком. Мой код работает, но удаляет строки только с приращением, и для выполнения задачи его нужно запускать примерно 10 раз.

Я знаю, что циклы, включающие удаление, могут быть сложными. Любая помощь будет оценена!

 Sub FindMatches()
    Application.ScreenUpdating = False
    
   
    Dim var As Variant, iSheet As Integer, iRow As Long, iRowL As Long, bln As Boolean
    
      
       iRowL = Cells(Rows.Count, 1).End(xlUp).Row
      
       For iRow = 1 To iRowL
      

          If Not IsEmpty(Cells(iRow, 1)) Then
             For iSheet = ActiveSheet.Index + 1 To Worksheets.Count
                bln = False
                var = Application.Match(Cells(iRow, 1).Value, Worksheets(iSheet).Columns(1), 0)
                
                If Not IsError(var) Then
                   bln = True
                   Exit For
                End If
             Next iSheet
          End If
          
       
          If bln = False Then
        
             Cells(iRow, 1).EntireRow.Delete
             Else
             Cells(iRow, 1).Font.Bold = True

           End If
       
       Next iRow
    Application.ScreenUpdating = True
End Sub

Ответы [ 2 ]

0 голосов
/ 12 июля 2020

Я рекомендую другой подход и начну с сопоставления строк, которые вы хотите удалить, и после завершения l oop просто удалите объединение строк (пример ниже) другим подходом будет использование обратного l oop, поэтому начиная снизу и продвигайтесь вверх до первой записи, и если вы не найдете то, что ищете, удалите строку. Таким образом, вам не нужно учитывать строки, которые смещаются из-за удаления.

Sub DeleteBlankRows()
Dim delRange As Range
Dim lrow As Long, i As Long
Dim WS As Worksheet

Set WS = ActiveSheet

    With WS
        lrow = .Range("A" & .Rows.Count).End(xlUp).Row

 '--> Delete All rows where Cell A and Cell B are empty
        For i = 6 To lrow
            
            If Len(Trim(.Range("A" & i).value)) = 0 Or Len(Trim(.Range("B" & i).value)) = 0 Then
                If delRange Is Nothing Then
                    Set delRange = .Rows(i)
                Else
                    Set delRange = Union(delRange, .Rows(i))
                End If
            End If
        Next i

        If Not delRange Is Nothing Then delRange.Delete
        
        Set delRange = Nothing
    End With
End Sub
0 голосов
/ 12 июля 2020

Я тоже столкнулся с этим, когда вы удаляете строку, и она сбрасывает ваш счет, фактически пропуская строку, поскольку, например, строка 100 теперь стала строкой 99.

Я думаю, если в аргументе if, в котором вы удаляете строку, просто напишите строку после того, как сделаете это для iRow = iRow - 1, тогда она go вернет строку, которую вы только что удалили, и продолжит оттуда.

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