Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 查找与我的数据中的其他行相比具有最多匹配值的行_Excel_Vba - Fatal编程技术网

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结合起来,计算同一行中的person值在标题中的person值范围内出现的次数。我们将它们组合为
    COUNTIF(间接(“B”和匹配(J$1;$A:$A;0)&“:E”和匹配(J$1;$A:$A;0));索引($B:$B;匹配($I2;$A:$A;0))
  • 上述公式仅适用于1个标准,因此您需要为每个标准添加额外的COUNIF(在本例中,它将是4个标准,因此4个COUNIF)
  • 如果要分析的交叉点在行和标题中是同一个人,则初始的
    IF
    仅用于显示
    X
  • 之后,您可以在右数据集的每一行中使用条件格式来显示最大值
  • 这种方法的好处是,左侧数据集上的值不需要位于同一列中,就可以正确计数。若你们看这张图片,人名1和人名2完全匹配,即使值的顺序不一样,因为公式始终在整个范围内计数

    我已将一个示例上载到我的Gdrive,以防您想下载并正确检查公式(可能是因为我键入excel时出现翻译错误,因为我的excel是西班牙语的)

    使用VBA,您可能可以执行一个宏,只显示匹配较好的人员的行号,但请确保检查所有数据,因为可能是一个人与两个或更多人匹配,并且所有人都获得了最大值。通过这种设计,您可以看到这一点,因为两个单元都是绿色的

    希望您能根据自己的需要调整此选项。

    I d