найти строку с наиболее подходящими значениями по сравнению с другой строкой в ​​моих данных - PullRequest
0 голосов
/ 28 мая 2019

У меня есть набор данных, который выглядит следующим образом:

Person A, Value 1, Value 2, Value 3, Value 4
Person B, Value 1, Value 2, Value 3, Value 4

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

Например.У меня есть новая запись Person C. Я хочу иметь возможность (на вкладке анализа) отображать других людей, которые имеют наиболее общие значения с этим человеком из набора данных.

Ответы [ 2 ]

1 голос
/ 28 мая 2019

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

Я сделал это:

enter image description here

Левый набор данных будет вашими данными со значениями, а правый набор данных будет вашим анализом. Формула, которую я использовал, чтобы получить это:

=IF(J$1=$I2;"x";COUNTIF(INDIRECT("B" & MATCH(J$1;$A:$A;0) &":E"& MATCH(J$1;$A:$A;0));INDEX($B:$B;MATCH($I2;$A:$A;0)))+COUNTIF(INDIRECT("B" & MATCH(J$1;$A:$A;0) &":E"& MATCH(J$1;$A:$A;0));INDEX($C:$C;MATCH($I2;$A:$A;0)))+COUNTIF(INDIRECT("B" & MATCH(J$1;$A:$A;0) &":E"& MATCH(J$1;$A:$A;0));INDEX($D:$D;MATCH($I2;$A:$A;0)))+COUNTIF(INDIRECT("B" & MATCH(J$1;$A:$A;0) &":E"& MATCH(J$1;$A:$A;0));INDEX($E:$E;MATCH($I2;$A:$A;0))))

Может выглядеть сложно, но проще, чем кажется. Эта формула состоит из нескольких частей:

  1. INDEX($B:$B;MATCH($I2;$A:$A;0))) вернет критерии человека в той же строке, но в столбце B.
  2. INDIRECT("B" & MATCH(J$1;$A:$A;0) &":E"& MATCH(J$1;$A:$A;0)); вернет в качестве диапазона диапазон значений из левого набора данных человека, которого вы сопоставляете (данные заголовка) в правом наборе данных.
  3. Мы можем объединить оба вышеперечисленных с COUNTIF, чтобы подсчитать, сколько раз значение человека в той же строке появляется в диапазоне значений человека в заголовках. Мы объединяем их как COUNTIF(INDIRECT("B" & MATCH(J$1;$A:$A;0) &":E"& MATCH(J$1;$A:$A;0));INDEX($B:$B;MATCH($I2;$A:$A;0))).
  4. Приведенная выше формула предназначена только для 1 критерия, поэтому вам нужно добавить дополнительный COUNIF для каждого критерия, который вы получили (в этом примере это будет 4 критерия, то есть 4 COUNIF).
  5. Начальное значение IF полезно просто для показа X, если анализируемое пересечение - это один и тот же человек в строке и заголовке.
  6. После этого вы можете использовать условное форматирование в каждой строке правого набора данных, чтобы отобразить максимальное значение.

Хорошая особенность этого метода в том, что значения в левом наборе данных не обязательно должны находиться в одном столбце для правильного подсчета. Если вы посмотрите на изображение, Person 1 и PErson 2 будут идеально совпадать, даже если значения не в одинаковом порядке, потому что формула все время учитывается во всем диапазоне.

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

https://drive.google.com/open?id=1kPAARG8yAkXok7HxYkYswDiCAT37mmEz

С VBA, вероятно, вы могли бы сделать макрос, который просто показывает номер строки человека с лучшими совпадениями, но убедитесь, что вы проверите ВСЕ данные, потому что, возможно, может быть, что человек совпадает с 2 или более людьми, и все они получил максимальные значения. С этим дизайном вы могли видеть это, потому что обе ячейки были бы окрашены в зеленый цвет.

Надеюсь, вы сможете адаптировать это к вашим потребностям.

1 голос
/ 28 мая 2019

Вы можете попробовать:

Option Explicit

Sub test()

    Dim LastRow As Long, i As Long, Total As Long, j As Long
    Dim arr As Variant

    With ThisWorkbook.Worksheets("Sheet1")

        LastRow = .Cells(.Rows.Count, "A").End(xlUp).Row

        arr = .Range("A2:E" & LastRow)

        For i = LBound(arr) To UBound(arr)

            For j = LBound(arr) To UBound(arr)

                If arr(i, 1) <> arr(j, 1) Then

                    'Check Value 1
                    If arr(i, 2) = arr(j, 2) Then
                        Total = Total + 1
                    End If

                    'Check Value 2
                    If arr(i, 3) = arr(j, 3) Then
                        Total = Total + 1
                    End If

                    'Check Value 3
                    If arr(i, 4) = arr(j, 4) Then
                        Total = Total + 1
                    End If

                    'Check Value 4
                    If arr(i, 5) = arr(j, 5) Then
                        Total = Total + 1
                    End If

                    If .Range("G" & i + 1).Value = "" Then
                        .Range("G" & i + 1).Value = arr(j, 1)
                        .Range("H" & i + 1).Value = Total / 4
                    ElseIf Total / 4 > .Range("H" & i + 1).Value Then
                        .Range("G" & i + 1).Value = arr(j, 1)
                        .Range("H" & i + 1).Value = Total / 4
                    End If

                    Total = 0

                End If

            Next j

        Next i

    End With

End Sub

Результаты:

enter image description here

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