Excel / VBA Удалите повторяющиеся строки, указав перекрестные ссылки на 2 разных листа и удалив 1 строку

У меня есть 2 отдельных листа, давайте назовем их листом A, листом B. У меня есть данные на листе B, который также находится на листе A. Я хочу найти те строки, которые равны, и удалить их с листа B.

Я не могу объединить 2 листа и использовать фильтры, потому что я использую динамический SQL для запроса разных данных.

На каждом листе есть уникальный ключевой столбец

Я согласен с предложениями VBA и формулами Excel. Пока я не совмещаю листы.

Большое спасибо, ребята!

Извините, видимо я ошибся. Здесь где-то бесконечный цикл. Кстати, это ответ Бена. Я только что перепостил скомпилированную версию.

    Sub CleanDupes()
    Dim wsA As Worksheet
    Dim wsB As Worksheet
    Dim keyColA As String
    Dim keyColB As String
    Dim rngA As Range
    Dim rngB As Range
    Dim intRowCounterA As Integer
    Dim intRowCounterB As Integer


    keyColA = "A"
    keyColB = "A"

    intRowCounterA = 1
    intRowCounterB = 1

    Set wsA = Worksheets("Sheet2")
    Set wsB = Worksheets("Sheet1")

    Do While Not IsEmpty(wsA.Range(keyColA & intRowCounterA).Value)


        Set rngA = wsA.Range(keyColA & intRowCounterA)

         intRowCounterB = 1
        Do While Not IsEmpty(wsB.Range(keyColB & intRowCounterB).Value)

            Set rngB = wsB.Range(keyColB & intRowCounterB)

            If rngA.Value = rngB.Value Then

                 Rows(intRowCounterB).EntireRow.Delete
                 intRowCounterB = intRowCounterB - 1


            End If
              intRowCounterB = intRowCounterB + 1
        Loop
        intRowCounterA = intRowCounterA + 1
    Loop
End Sub

person EKet    schedule 05.08.2010    source источник


Ответы (1)


Sub CleanDupes()
    Dim wsA As Worksheet
    Dim wsB As Worksheet
    Dim keyColA As String
    Dim keyColB As String
    Dim rngA As Range
    Dim rngB As Range
    Dim intRowCounterA As Integer
    Dim intRowCounterB As Integer
    Dim strValueA As String


    keyColA = "A"
    keyColB = "B"

    intRowCounterA = 1
    intRowCounterB = 1

    Set wsA = Worksheets("Sheet A")
    Set wsB = Worksheets("Sheet B")

    Do While Not IsEmpty(wsA.Range(keyColA & intRowCounterA).Value)
        intRowCounterB = 1
        Set rngA = wsA.Range(keyColA & intRowCounterA)
        strValueA = rngA.Value
        Do While Not IsEmpty(wsB.Range(keyColB & intRowCounterB).Value
            Set rngB = wsB.Range(keyColB & intRowCounterB)
            If strValueA = rngB.Value Then
                 'Code to delete row goes here, but I'm not sure exactly'
                 'what it is.'
                 wsB.Rows(intRowCounterB).Delete
                 intRowCounterB = intRowCounterB - 1
            End If
            intRowCounterB = intRowCounterB + 1
        Loop
        intRowCounterA = intRowCounterA + 1
    Loop
End Sub

Это должно вас начать.

person Ben McCormack    schedule 05.08.2010
comment
Привет, Бен, я попробовал твое предложение, но оно не сработало. Я изменил строку строки удаления на ---- wsB.Range (Rows (intRowCounterB)). CompleteRow.Delete, но это тоже не сработало, так что есть идеи относительно того, в чем может быть проблема? Спасибо! - person EKet; 06.08.2010
comment
@Ehsan Вы прошли через код, чтобы убедиться, что он работает правильно? Я написал весь этот код вчера вечером без использования Excel, поэтому, хотя в то время он казался правильным, у меня не было возможности полностью его отладить. Также обратите внимание, что вам может потребоваться изменить имена листов "Sheet A" и "Sheet B" в вашем коде. - person Ben McCormack; 06.08.2010
comment
Бен, спасибо за ответ. На самом деле я изменил код в части наименования ... понятно, но я не просматривал код для проверки синтаксиса, потому что я новичок в VBA, поэтому я поверил вам на слово. Я воспользуюсь этим как возможностью для обучения, пойду выучу синтаксис и вернусь к вам. Спасибо. - person EKet; 06.08.2010
comment
@Ehsan, извините за то, что не отладил код до публикации. Одна вещь, которую вы можете сделать, - это использовать команду Debug.Print для печати в непосредственном окне во время отладки. Например, вы можете указать Debug.Print "Current Row: " & intRowCounterA, чтобы ваша программа печатала текущую строку, в которой она находится. Если он никогда не поднимается выше 1, значит, у вас проблема. - person Ben McCormack; 06.08.2010
comment
Привет, Бен, ты знаешь, как мы можем сделать это быстрее? Ужасно медленно с парой сотен записей. Спасибо за вашу помощь! - person EKet; 06.08.2010
comment
@Ehsan Я не совсем уверен, не пройдя строчку за строчкой. Я быстро изменил свой код, чтобы он сохранил значение из Листа A, что должно несколько ускорить процесс. - person Ben McCormack; 06.08.2010