Excel 查找与我的数据中的其他行相比具有最多匹配值的行
我的数据集如下所示:Excel 查找与我的数据中的其他行相比具有最多匹配值的行,excel,vba,Excel,Vba,我的数据集如下所示: Person A, Value 1, Value 2, Value 3, Value 4 Person B, Value 1, Value 2, Value 3, Value 4 现在,我想将此数据集的单行与整个集合进行比较,并使用条件显示与我查看的单行相比具有最匹配值的行 比如说。我有一个新的输入人员C。我希望能够显示(在“分析”选项卡中)数据集中与该人员具有最常见值的其他人员。您可以尝试: Option Explicit Sub test() Dim La
Person A, Value 1, Value 2, Value 3, Value 4
Person B, Value 1, Value 2, Value 3, Value 4
现在,我想将此数据集的单行与整个集合进行比较,并使用条件显示与我查看的单行相比具有最匹配值的行
比如说。我有一个新的输入人员C。我希望能够显示(在“分析”选项卡中)数据集中与该人员具有最常见值的其他人员。您可以尝试:
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
选项显式
子测试()
暗淡的最后一行一样长,我一样长,总计一样长,j一样长
作为变体的Dim-arr
使用此工作簿。工作表(“表1”)
LastRow=.Cells(.Rows.Count,“A”).End(xlUp).Row
arr=.Range(“A2:E”和LastRow)
对于i=LBound(arr)到UBound(arr)
对于j=LBound(arr)至UBound(arr)
如果arr(i,1)arr(j,1),那么
'检查值1
如果arr(i,2)=arr(j,2),那么
总计=总计+1
如果结束
'检查值2
如果arr(i,3)=arr(j,3),那么
总计=总计+1
如果结束
'检查值3
如果arr(i,4)=arr(j,4),那么
总计=总计+1
如果结束
'检查值4
如果arr(i,5)=arr(j,5),那么
总计=总计+1
如果结束
如果.Range(“G”&i+1).Value=”“则
.范围(“G”&i+1).值=arr(j,1)
.范围(“H”和i+1).值=总计/4
ElseIf Total/4>.Range(“H”&i+1)。然后选择值
.范围(“G”&i+1).值=arr(j,1)
.范围(“H”和i+1).值=总计/4
如果结束
总数=0
如果结束
下一个j
接下来我
以
端接头
结果:
您可以尝试:
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
选项显式
子测试()
暗淡的最后一行一样长,我一样长,总计一样长,j一样长
作为变体的Dim-arr
使用此工作簿。工作表(“表1”)
LastRow=.Cells(.Rows.Count,“A”).End(xlUp).Row
arr=.Range(“A2:E”和LastRow)
对于i=LBound(arr)到UBound(arr)
对于j=LBound(arr)至UBound(arr)
如果arr(i,1)arr(j,1),那么
'检查值1
如果arr(i,2)=arr(j,2),那么
总计=总计+1
如果结束
'检查值2
如果arr(i,3)=arr(j,3),那么
总计=总计+1
如果结束
'检查值3
如果arr(i,4)=arr(j,4),那么
总计=总计+1
如果结束
'检查值4
如果arr(i,5)=arr(j,5),那么
总计=总计+1
如果结束
如果.Range(“G”&i+1).Value=”“则
.范围(“G”&i+1).值=arr(j,1)
.范围(“H”和i+1).值=总计/4
ElseIf Total/4>.Range(“H”&i+1)。然后选择值
.范围(“G”&i+1).值=arr(j,1)
.范围(“H”和i+1).值=总计/4
如果结束
总数=0
如果结束
下一个j
接下来我
以
端接头
结果:
我不知道您的数据是如何存储的,但我制作了一个示例,模拟您所说的数据外观。我希望你能根据自己的需要来调整 我做了这个: 左边的数据集是带有值的数据,右边的数据集是您的分析。我用的公式是:
=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))))
它可能看起来很复杂,但比看起来容易。该公式由几个部分组成:
INDEX($B:$B;MATCH($I2;$A:$A;0))
将返回同一行中的人员的条件,但返回列B间接(“B”和匹配(J$1;$A:$A;0)和“:E”和匹配(J$1;$A:$A;0))
将返回右数据集中匹配的人的左数据集(标题数据)的值范围作为范围COUNTIF(间接(“B”和匹配(J$1;$A:$A;0)&“:E”和匹配(J$1;$A:$A;0));索引($B:$B;匹配($I2;$A:$A;0))
IF
仅用于显示X