Excel 如何根据另一行中的值计算每行中的匹配项?

Excel 如何根据另一行中的值计算每行中的匹配项?,excel,vba,Excel,Vba,我有两组数据,一组是每个用户为他们的完美宠物选择的特征,另一组是与每个宠物匹配的特征的完整列表 我想要一个代码,它使用答案作为参考,遍历每个宠物(一行中的所有特征),并从答案中计算匹配的特征。计算完所有宠物的分数后,它应该返回分数最高的宠物 Pet数据采用这种格式,并映射了各种其他特征 我用这个来计算匹配项: If Sheet2.Range("aj3").Value = "yes" Then Sheet2.Range("ak3").Value = WorksheetFunction.C

我有两组数据,一组是每个用户为他们的完美宠物选择的特征,另一组是与每个宠物匹配的特征的完整列表

我想要一个代码,它使用答案作为参考,遍历每个宠物(一行中的所有特征),并从答案中计算匹配的特征。计算完所有宠物的分数后,它应该返回分数最高的宠物

Pet数据采用这种格式,并映射了各种其他特征

我用这个来计算匹配项:

If Sheet2.Range("aj3").Value = "yes" Then
    Sheet2.Range("ak3").Value = WorksheetFunction.Count(WorksheetFunction.Match(Sheet1.Range("a2:k2"), Sheet2.Range("b3:ai3")))
Else: Sheet2.Range("ak3").Value = "Not Compatible

为每行执行此操作并返回具有最高得分的对应值。

TILAK,考虑Siddharth建议的建议中的这个选项,使用辅助列(或两个)通过函数而不是VBA:

解决此问题。

我添加了一个列来评估每只宠物与被评估的潜在家庭的匹配程度(“K列中的总体得分”),然后添加了一个列来对得分进行排序(“L列中的排名”)

“总分”列中的基本公式只查看每个单元格,并将其与表1中的类似单元格进行比较。由于Excel将TRUE视为1,将FALSE视为0,因此我只对结果进行了汇总。以下是基本公式:

=SUM(B3=$K$3,C3=$L$3,D3=$M$3,E3=$N$3,F3=$O$3,G3=$P$3)
我把它提高了一个等级,这样我就可以让它直接在“总分”下面的单元格中查找我在单元格中键入的任何内容(在我的例子中是K2单元格)。它看起来比实际更复杂:

=SUM(B3=VLOOKUP($K$2,Sheet1!$A$3:$J$3,2,FALSE),C3=VLOOKUP($K$2,Sheet1!$A$3:$J$3,3,FALSE),D3=VLOOKUP($K$2,Sheet1!$A$3:$J$3,4,FALSE),E3=VLOOKUP($K$2,Sheet1!$A$3:$J$3,5,FALSE),F3=VLOOKUP($K$2,Sheet1!$A$3:$J$3,6,FALSE),G3=VLOOKUP($K$2,Sheet1!$A$3:$J$3,7,FALSE),H3=VLOOKUP($K$2,Sheet1!$A$3:$J$3,8,FALSE),I3=VLOOKUP($K$2,Sheet1!$A$3:$J$3,9,FALSE),J3=VLOOKUP($K$2,Sheet1!$A$3:$J$3,10,FALSE))
关于您编写的VBA,我无法让它以您所说的方式运行。但是,如果您仍然想走这条路线,那么为每行运行它的答案是创建一个循环。也许是这样的:

Dim AvailCell, AvailRange As Range

Set AvailRange = Sheet2.Range("AJ2:AJ10")

For Each AvailCell In AvailRange
    If AvailCell.Value = "Yes" Then
        AvailCell.Offset(0, 1).Value = WorksheetFunction.Count(WorksheetFunction.Match(Sheet1.Range("a2:k2"), Range(AvailCell.Offset(0, -29).Address & ":" & AvailCell.Offset(0, -1).Address))) ' Sheet2.Range("b3:ai3")))
    Else
        AvailCell.Offset(0, 1).Value = "Not Compatible"
    End If
Next

但是,你使用的WorkStEt函数对我来说并不像我认为的那样对函数起作用。

TILAK,考虑Siddharth建议中的这个选项,使用辅助列(或两个)来解决这个问题,而不是VBA:

我添加了一个列来评估每只宠物与被评估的潜在家庭的匹配程度(“K列中的总体得分”),然后添加了一个列来对得分进行排序(“L列中的排名”)

“总分”列中的基本公式只查看每个单元格,并将其与表1中的类似单元格进行比较。由于Excel将TRUE视为1,将FALSE视为0,因此我只对结果进行了汇总。以下是基本公式:

=SUM(B3=$K$3,C3=$L$3,D3=$M$3,E3=$N$3,F3=$O$3,G3=$P$3)
我把它提高了一个等级,这样我就可以让它直接在“总分”下面的单元格中查找我在单元格中键入的任何内容(在我的例子中是K2单元格)。它看起来比实际更复杂:

=SUM(B3=VLOOKUP($K$2,Sheet1!$A$3:$J$3,2,FALSE),C3=VLOOKUP($K$2,Sheet1!$A$3:$J$3,3,FALSE),D3=VLOOKUP($K$2,Sheet1!$A$3:$J$3,4,FALSE),E3=VLOOKUP($K$2,Sheet1!$A$3:$J$3,5,FALSE),F3=VLOOKUP($K$2,Sheet1!$A$3:$J$3,6,FALSE),G3=VLOOKUP($K$2,Sheet1!$A$3:$J$3,7,FALSE),H3=VLOOKUP($K$2,Sheet1!$A$3:$J$3,8,FALSE),I3=VLOOKUP($K$2,Sheet1!$A$3:$J$3,9,FALSE),J3=VLOOKUP($K$2,Sheet1!$A$3:$J$3,10,FALSE))
关于您编写的VBA,我无法让它以您所说的方式运行。但是,如果您仍然想走这条路线,那么为每行运行它的答案是创建一个循环。也许是这样的:

Dim AvailCell, AvailRange As Range

Set AvailRange = Sheet2.Range("AJ2:AJ10")

For Each AvailCell In AvailRange
    If AvailCell.Value = "Yes" Then
        AvailCell.Offset(0, 1).Value = WorksheetFunction.Count(WorksheetFunction.Match(Sheet1.Range("a2:k2"), Range(AvailCell.Offset(0, -29).Address & ":" & AvailCell.Offset(0, -1).Address))) ' Sheet2.Range("b3:ai3")))
    Else
        AvailCell.Offset(0, 1).Value = "Not Compatible"
    End If
Next

但是,您使用的工作表函数对我来说并不是我认为您希望它们发挥作用的方式。

我有一种感觉(冒着看不到您的数据的风险),这可以通过公式实现。可以查看您的数据吗?重要的是,你愿意用公式来解决这个问题吗?@SiddharthRout是的,我能够找到某个特定用户的答案,但是我相信为了能够自动返回所有用户的答案,我必须使用VBA宏。如果没有,很高兴被纠正?因此,如果我没有错,可以使用helper列解决这个问题。另外,我猜用户做出选择的另一组数据是标题,如
公寓、小房子。。。etc
?如果是,那么最好的方法就是在上表中只使用yes/NO值。在“帮助者”列中,只需使用公式来匹配和计算特征,然后下拉该公式。如果您对使用上述“是/否”方法的示例感兴趣,请告诉我。我有一种感觉(有可能看不到您的数据),这可以通过公式实现。可以查看您的数据吗?重要的是,你愿意用公式来解决这个问题吗?@SiddharthRout是的,我能够找到某个特定用户的答案,但是我相信为了能够自动返回所有用户的答案,我必须使用VBA宏。如果没有,很高兴被纠正?因此,如果我没有错,可以使用helper列解决这个问题。另外,我猜用户做出选择的另一组数据是标题,如
公寓、小房子。。。etc
?如果是,那么最好的方法就是在上表中只使用yes/NO值。在helper列中,只需使用公式来匹配和计算特征,然后下拉该公式。如果您对使用上述YES/NO方法的示例感兴趣,请告诉我?