Какой лучший способ сравнить два листа в книге Excel - PullRequest
5 голосов
/ 13 января 2010

Учитывая, что у меня есть следующее

<Sheet 1>
Item    QTY
A        5
B        1
C        3


<Sheet 2>
Item    QTY
A        15
B        4
C        1
D        8

Как лучше всего создать отчет, показывающий разницу между листом 1 и 2?

Как

<Difference>
Item    QTY
A        10
B        3
C       -2
D        8

Ответы [ 5 ]

3 голосов
/ 13 января 2010

Вам не нужен VBA для этого.

Вот что вы делаете:

  1. Создайте новый лист (Sheet3).

  2. Настройте его так:

    альтернативный текст http://img16.imageshack.us/img16/2451/consolidationsheet.jpg

  3. Вот формулы, которые вам понадобятся (вставьте каждую в соответствующую ячейку):

    Примечание: первые два являются «формулами массива» - после вставки в формулу дважды щелкните ячейку и выполните Ctrl-Shift-Enter (скобки {} должны появиться вокругформула)

    ------------------------------------------------------------------------------
    Cell Formula
    ------------------------------------------------------------------------------
     B2  =SUM(IF(Sheet1!A:A="",0,1)) <-- array formula: use Ctrl-Shift-Enter instead of Enter
     B3  =SUM(IF(Sheet2!A:A="",0,1)) <-- array formula: use Ctrl-Shift-Enter instead of Enter            
     D2  =IF(D1=D$1,2,IF(OR(D1=B$2,D1=""),"",D1+1))
     E2  =IF(D2="",IF(D1="",IF(OR(E1=B$3,E1=""),"",E1+1),2),"")
     G2  =IF(D2<>"",INDEX(Sheet1!A:A,D2),IF(E2<>"",INDEX(Sheet2!A:A,E2),""))
     H2  =IF(D2<>"",-INDEX(Sheet1!B:B,D2),IF(E2<>"",INDEX(Sheet2!B:B,E2),""))
    
  4. Перетащите формулы в D2: H2 вниз, чтобы охватить все данные для листов 1 и 2.

  5. Выберите все данные в столбцах G & H (включая заголовки).

  6. Вставьте> Сводная таблица и нажмите ОК.

  7. Щелкните на сводной таблице и перетащите []Item в поле «Метки строк» ​​и []QTY в поле «Значения».

Вот и все.Сводная таблица будет содержать сводку по каждому элементу.Ни один элемент не будет повторен, и ни один элемент не будет пропущен.Столбец «Сумма QTY» будет фактически содержать разницу (поскольку в формуле используется отрицательное значение для всех количеств листа 1).

2 голосов
/ 13 января 2010

В Excel VBA используйте словарь . Используйте ваши элементы с одного из листов в качестве ключей, QTY как значения. Поместите пары элемент / Кол-во листа 1 в словарь, затем просмотрите элементы листа 2 и обновите словарь соответствующим образом, чтобы получить различия в нем. Наконец, поместите результат в лист 3.

РЕДАКТИРОВАТЬ: здесь приведен полный пример кода (для его работы необходимо установить ссылку на среду выполнения сценариев Microsoft):

Option Explicit
Sub CreateDiff()

    Dim dict As New Dictionary
    Dim sh1 As Worksheet, sh2 As Worksheet, sh3 As Worksheet
    Dim i As Long, v As String

    Set sh1 = ThisWorkbook.Sheets("Sheet1")
    Set sh2 = ThisWorkbook.Sheets("Sheet2")
    Set sh3 = ThisWorkbook.Sheets("Sheet3")
    For i = 2 To sh1.Cells.SpecialCells(xlCellTypeLastCell).Row
        v = Trim(sh1.Cells(i, 1).Value)
        dict(v) = -sh1.Cells(i, 2).Value
    Next
    For i = 2 To sh2.Cells.SpecialCells(xlCellTypeLastCell).Row
        v = Trim(sh2.Cells(i, 1).Value)
        If dict.Exists(v) Then
            dict(v) = dict(v) + sh2.Cells(i, 2).Value
        Else
            dict(v) = sh2.Cells(i, 2).Value
        End If
    Next
    For i = 0 To dict.Count - 1
        v = dict.Keys(i)
        sh3.Cells(i + 2, 1) = v
        sh3.Cells(i + 2, 2) = dict(v)
    Next

End Sub
1 голос
/ 13 января 2010

Зачем использовать VBA? На листе сравнения 3 перечислите все возможные элементы из листов 1 и 2 в столбце A, затем в столбце B используйте следующую формулу. Начиная с B2, затем скопируйте вниз.

= если (ISERROR (ВПР (А2, Лист2 '$ A $ 2: $ B $ 5,2, ложь), 0 ВПР (А2, Лист2' $ A $ 2: $ B $ 5,2, ложно)) - если (ISERROR (ВПР (А2, Лист1 '$ A $ 2: $ B $ 5,2, ложь), 0, ВПР (А2, Лист1' $ A $ 2: $ B $ 5,2, ложь))

При необходимости измените диапазон таблицы.

1 голос
/ 13 января 2010

Одной из возможностей является использование ADO

Dim cn As Object
Dim rs As Object
Dim strFile As String
Dim strCon As String
Dim strSQL As String

''http://support.microsoft.com/kb/246335

strFile = Workbooks("Book1.xls").FullName

''Note HDR=Yes, the names in the first row of the range
''can be used.
strCon = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strFile _
    & ";Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"";"

Set cn = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.Recordset")

cn.Open strCon

strSQL = "SELECT s2.Item, s2.Qty-IIf(s1.Qty Is Null,0,s1.Qty) FROM [Sheet2$] s2 " _
& "LEFT JOIN [Sheet1$] s1 ON s2.Item=s1.Item"

rs.Open strSQL, cn, 3, 3

Workbooks("Book1.xls").Worksheets("Sheet3").Cells(2, 1).CopyFromRecordset rs
1 голос
/ 13 января 2010

вы можете объединить оба набора данных в один лист бок о бок (item1, qty, item2, qty), а затем использовать функцию Excel VLOOKUP () для поиска данных из противоположного набора.

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