Сравните два диапазона данных Excel по трем критериям и перенастройте результаты - PullRequest
0 голосов
/ 10 апреля 2019

Мне нужно сравнить два диапазона данных по трем критериям (EID, Код, Опция) на одном листе Excel, а затем на том же листе, мне нужно получить результаты, но с выровненными данными в каждом из двух диапазонов на основев соответствии с тремя критериями.

Электронная таблица содержит 29 столбцов, а макет выглядит следующим образом:

  1. Каждый диапазон данных имеет четырнадцать заголовков (EID, Имя, Код, Опция,Число, PDate, Продукт, Стоимость, Стоимость2, Стоимость3, Тип, Льгота, ДДат, ЭДАТ).

  2. В столбцах с «A» по «N», столбце «O» имеются данныеесть пробелы, затем больше данных в столбцах от «P» до «AC».

First range columns A-N...
EID Name    Code    Option  Number  PDate   Product Cost    Cost2   Cost3   Type    Benefit DDate   EDate
437A    WAN 2120    LTD-150 458969601   03/17/2017  DI  42.56   0.00    0.00    EO  2800    05/26/2017  05/01/2017
437A    WAN 2120    LTD-180 1   03/09/2018  DI  32.66   0.00    0.00    EO  2300    05/01/2018  05/01/2018
230B    LTER    2120    LTD-180 757672001   09/13/2016  DI  15.62   0.00    0.00    EO  1100    10/29/2016  10/01/2016
434C    GTON    2120    LTD-150 812918702   10/01/2014  DI  38.00   0.00    0.00    EO  2500    10/01/2014  10/01/2014
438G    LERS    2120    LTD-180 112886201   10/01/2014  DI  38.34   0.00    0.00    EO  2700    10/01/2014  10/01/2014
Second range columns P-AC...    
EID Name    Code    Option  Number  PDate   Product Cost    Cost2   Cost3   Type    Benefit DDate   EDate
437A    WAN 2120    LTD-180 458969601   03/09/2018  DI  32.66   0.00    0.00    EO  2300    05/01/2018  05/01/2018
437A    WAN 2132    STD-14-180  1   03/26/2019  DI  28.80   0.00    0.00    EO  1000    05/01/2019  05/01/2019
230B    LTER    2120    LTD-180 757672001   09/13/2016  DI  15.62   0.00    0.00    EO  1100    10/29/2016  10/01/2016
230B    LTER    2132    STD-14-180  1   03/14/2019  DI  37.44   0.00    0.00    EO  1300    05/01/2019  05/01/2019
434C    GTON    2132    STD-14-180  812918702   03/25/2019  DI  72.00   0.00    0.00    EO  2500    05/01/2019  05/01/2019
438G    LERS    2120    LTD-180 112886201   10/01/2014  DI  38.34   0.00    0.00    EO  2700    10/01/2014  10/01/2014
438G    LERS    2132    STD-30-180  1   03/11/2019  DI  46.98   0.00    0.00    EO  2700    05/01/2019  05/01/2019
434D    TOIN    2132    STD-14-180  1   03/11/2019  DI  23.04   0.00    0.00    EO  800 05/01/2019  05/01/2019
439F    YBIE    2132    STD-14-180  1   03/15/2019  DI  23.04   0.00    0.00    EO  800 05/01/2019  05/01/2019

Я нашел несколько превосходных VBA, написанных Джиндоном здесь: https://www.ozgrid.com/forum/forum/help-forums/excel-general/135799-align-rows-of-2-data-sets-with-multiple-columns/page2

и я изменил его, как показано ниже, чтобы выполнить большую часть того, что я указал.Тем не менее, мой модифицированный VBA генерирует результаты на основе только одного критерия (EID).Я не смог выяснить, как изменить код VBA для трех критериев (EID, код, опция).

Option Explicit
'04/09/2019 - Align_Data_w_1Criteria module is modified from original VBA found here...
'https://www.ozgrid.com/forum/forum/help-forums/excel-general/135799-align-rows-of-2-data-sets-with-multiple-columns/page2

Sub Align_Data_w_1Criteria()
    Dim a, i As Long, ii As Long, iii As Long, w, myIndex As Long, x, y, flg As Boolean, temp
    With Sheets("Results With 1 Criteria")
        With .Range("a1", .Cells.SpecialCells(11)).Resize(, 29)
            a = .Value: .ClearContents
            ReDim x(1 To 1), y(1 To 1)
            x(1) = a(1, 1): y(1) = Application.Index(a, 1, 0)
            For ii = 1 To UBound(a, 2) Step 15
                For i = 2 To UBound(a, 1)
                    If a(i, ii) <> "" Then
                        For iii = 1 To UBound(x)
                            If UCase$(a(i, ii)) = UCase$(x(iii)) Then
                                myIndex = iii: flg = True: Exit For
                            End If
                        Next
                        If flg Then
                            w = y(myIndex)
                        Else
                            myIndex = Application.Max(iii, myIndex)
                            ReDim Preserve x(1 To myIndex), y(1 To myIndex)
                            x(myIndex) = a(i, ii)
                            ReDim w(1 To UBound(a, 2))
                            y(myIndex) = w
                        End If

                        For iii = ii To ii + 13
                            w(iii) = a(i, iii)
                        Next
                        y(myIndex) = w: flg = False
                    End If
                Next
            Next
            For i = 2 To UBound(x) - 1
                For ii = i + 1 To UBound(x)
                    If x(i) > x(ii) Then
                        temp = x(ii): x(ii) = x(i): x(i) = temp
                        temp = y(ii): y(ii) = y(i): y(i) = temp
                    End If
                Next
            Next
            .Resize(UBound(y)).Value = Application.Index(y, 0, 0)
        End With
    End With
End Sub

Если кто-то может помочь мне с тем, как применить эти три критерия, он будет очень признателен!

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