在我的数据中查找与其他行相比具有最匹配值的行

时间:2019-05-28 11:54:25

标签: excel vba

我有一个看起来像这样的数据集:

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

现在,我想将这个数据集的整个行与整个标准集进行比较,以显示与我查看的单行相比,具有最匹配值的行。

例如。我有一个新条目PersonC。我希望能够(在分析选项卡中)显示与数据集中的那个人具有最共同值的其他人。

2 个答案:

答案 0 :(得分:1)

您可以尝试:

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

答案 1 :(得分:1)

我不知道您的数据是如何存储的,但是我制作了一个样本来模拟您所说的数据外观。我希望您能适应您的需求。

我做到了:

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个或更多人员匹配,并且所有人都匹配获得最大值。通过这种设计,您会看到这是因为两个单元格都将变为绿色。

希望您可以使其适应您的需求。