Как сравнить 2 столбца рабочих книг и показать дубликаты в виде нового списка? - PullRequest
1 голос
/ 28 июля 2011

У меня есть две разные рабочие книги с приблизительно 15 столбцами и 50 тыс. Строк в одной рабочей книге и 10 столбцами и 1000 строк в другой рабочей книге, и только 2 общих столбца (partnumber, changelevel) являются общими. Поэтому я хочу получить два отчета из этих двух рабочих книг.

  1. Записывает с общим номером детали и уровнем изменения в другую рабочую книгу как один отчет.
  2. Я хочу удалить общий номер детали и записи уровня изменения из первой рабочей книги и скопировать все оставшиеся записи в другую рабочую книгу в качестве другого отчета.

Ответы [ 2 ]

1 голос
/ 28 июля 2011

Энджи. , .

У вас есть пара вопросов, на которые нужно будет ответить, прежде чем кто-нибудь сможет вам в этом помочь.

  1. Это единовременная сделка, когда вы пытаетесь очистить данные и найти новую отправную точку, и вам не нужно будет запускать этот процесс снова и снова?

  2. Можно ли предположить, что строки данных не находятся в одной строке рабочего листа в обеих книгах?

Если ответ на оба вопроса ДА, то я должен был бы сказать, что Excel определенно НЕ является тем Офисным приложением, которое вам следует использовать. Я бы предложил импортировать обе книги в базу данных Access в виде отдельных таблиц. Таким образом, вы можете использовать SQL для выполнения сопоставлений и поиска практически без кода. Вы можете легко экспортировать результаты запроса обратно в книгу Excel, если у вас есть нужные результаты. Вы могли бы получить ответ через час. Если вы воспользуетесь этой опцией, вы также можете связать рабочие листы с БД Access и избежать их импорта. Это будет не так быстро, но будет работать.

В противном случае, если вы застряли в Excel, то у вас либо есть значительный объем кода для написания, который в значительной степени состоит из циклического прохождения всех записей в одной рабочей книге, поиска значений в другой рабочей книге и генерации вывода в еще больше рабочих тетрадей. , , или же . , , Вы можете попробовать скопировать рабочий лист с 1000 записями в другую рабочую книгу, а затем использовать функции рабочего листа VLOOKUP и / или HLOOKUP для создания большого количества формул. (Я не могу с чистой совестью одобрить этот второй подход, но если вы не очень опытны в VBA, тогда он может быть лучшим подходом для вас).

В любом случае, вы будете использовать решение Excel, и вам потребуется много работы.

Если у вас есть какие-то специфические проблемы с кодированием, вы находитесь в правильном месте. Но сначала вам нужно будет выбрать подход.

Удачи!

Дуг

0 голосов
/ 26 июля 2012

На вопрос легко ответить, проблема состоит из двух частей.

  1. Как быстро работает ваш компьютер?
  2. Как часто вам нужно запускать этот код?

Причина, по которой я задаю эти вопросы, заключается в том, что любой код выполняется на 50 000 строк независимо от того, насколько мал код, чтобы сделать этот кодработа ... вам нужен достаточно надежный компьютер, в противном случае этот код остановит ваш компьютер или, по крайней мере, преуспеет от хорошей минуты до трех минут + в зависимости от того, насколько быстро и сколько у вас памяти на самом деле.

Не видя свою книгу, вам нужны очень простые формулы, но вам нужно добавить еще одну строку в книгу.В столбце P вам нужна формула проверки.Эта формула проста, но она будет зависеть от того, сколько точек отсчета вам требуется.

=COUNTIFS('Sheet2'!$A:$A,$A3,'Sheet2'!$E:$E,$E3)

Оттуда вы можете увидеть, что является дубликатами или нет.Затем в столбце Q вы можете получить следующую формулу:

=IF($P3,"SAME","")

И она сообщит вам, совпадают ли данные или нет.По сути, он говорит, что если в ячейке P3 есть что-то, кроме 0, то будет сказано, что есть что-то такое же, в противном случае это не так.

Оттуда вам нужен код вроде этого:

Sub Update_TNOOR()
    Dim wsS1 As Worksheet
    Dim wsS2 As Worksheet
    Dim lastrow As Long, fstcell As Long

    Set wsS1 = Sheets("Sheet1")
    Set wsS2 = Sheets("Sheet2")

    With Application
        .ScreenUpdating = False
        .DisplayAlerts = False
        .EnableEvents = False
    End With

    With wsS1
        wsS1.Columns("P:Q").ClearContents
        ThisWorkbook.Sheets("Sheet1").Cells(1, 16).Value = “=COUNTIFS('Sheet2'!$A:$A,$A3,'Sheet2'!$E:$E,$E3)"
        ThisWorkbook.Sheets("Sheet1").Cells(1, 17).Value = “=IF($P3,"Same",””””)"
    wsS2.Columns("P:Q").ClearContents
        ThisWorkbook.Sheets("Sheet2").Cells(1, 16).Value = “=COUNTIFS('Sheet1'!$A:$A,$A3,'Sheet1'!$E:$E,$E3)"
        ThisWorkbook.Sheets("Sheet2").Cells(1, 17).Value = “=IF($P3,"Same",”Different”)"

    End With


    With Intersect(wsS1, wsS1.Columns("Q"))
        .AutoFilter 1, "<>Same"
        With Intersect(.Offset(2).EntireRow, .Parent.Range("B:Q"))
            .EntireRow.Delete
        End With
        .AutoFilter
    End With

    'Blow away rows that are useless
    lastrow = wsS2.Range("A2").End(xlDown).Row
    wsS2.Range("P1:Q1").Copy wsS2.Range("P2:Q" & lastrow)

    With Intersect(wsS2.UsedRange, wsS2.Columns("Q"))
        wsS2.Range("P:Q").Calculate
        .AutoFilter 1, "<>Different"
        .SpecialCells(xlCellTypeVisible).EntireRow.Delete
    End With

    With wsS2
        lastrow = wsS2.Range("A1").End(xlDown).Row
        Intersect(.UsedRange, .Range("A1:N" & lastrow)).Copy wsS1.Cells(Rows.Count, "B").End(xlUp).Offset(1)
    End With


    With Application
        .ScreenUpdating = True
        .DisplayAlerts = True
        .EnableEvents = True
    End With
End Sub

это должно помочь вам ... если я прочитаю то, что вы пытаетесь сделать правильно.

Однако, как говорили люди, то, что вы хотите сделать, может быть сделано в Excel, если я не знаю ... Кажется, что люди здесь думают, что нет, но если вам нужно использовать Excel, это должночтобы вы пошли.

Опять же, я не знаю, как выглядит ваша книга, поэтому я надеюсь, что это поможет.Это сравнивает данные и объединяет их в первый лист.ЭТО не сделает все, что вы хотите сделать ... но это должно помочь вам.

...