如何在MS Excel中比较每个单元格?

如何在MS Excel中比较每个单元格?,excel,comparison,large-data,Excel,Comparison,Large Data,在大型数据集中(250行和1000列),我需要在一列中比较单元格中的每个值,并遍历所有列。以下是源数据的简化示例: 这就是我所需要的(不需要格式化,也不需要两个空行)-如果找到匹配项,则生成“1”,如果不生成匹配项“2”,如果其中一个或两个为N/A,则生成“3”: 比较只能是“单面的”,例如Terry和Joey与Joey和Terry相同,因此不需要对已经比较过的两对进行进一步比较 是否可以在Excel 2016中执行此操作,或者是否有更好的工具? 谢谢大家。只需使用这样的函数(例如,单元格B

在大型数据集中(250行和1000列),我需要在一列中比较单元格中的每个值,并遍历所有列。以下是源数据的简化示例:

这就是我所需要的(不需要格式化,也不需要两个空行)-如果找到匹配项,则生成“1”,如果不生成匹配项“2”,如果其中一个或两个为N/A,则生成“3”:

比较只能是“单面的”,例如Terry和Joey与Joey和Terry相同,因此不需要对已经比较过的两对进行进一步比较

是否可以在Excel 2016中执行此操作,或者是否有更好的工具?
谢谢大家。

只需使用这样的函数(例如,单元格B4):

对每一行执行此操作,并将其从头到尾拖动。 编辑:如果要使两个都不为“N/A”,则应在第2行执行


只需使用如下函数(单元格B4的示例):

对每一行执行此操作,并将其从头到尾拖动。 编辑:如果要使两个都不为“N/A”,则应在第2行执行


这个选择有点复杂,但我们都会以不同的方式解决这样的问题。如果它对你有帮助,请随意使用它。如果不是的话,我可以理解,因为这些技术中的一些并不特别常见,并且得出的公式有点不可读。我这样做是为了更好地组织行,更容易地读取匹配/不匹配的指示符。我首先创建了一个helper列,而不是为每个人重复这些行,以便每一行都显示两个被比较的名称。这是我用B8的信息比较的公式:

=IF(OR(INDIRECT("R"&MATCH($I8,$A$1:$A$6,0)&"C"&COLUMN(),FALSE)="N/A",INDIRECT("R"&MATCH($A8,$A$1:$A$6,0)&"C"&COLUMN(),FALSE)="N/A"),3,IF(INDIRECT("R"&MATCH($I8,$A$1:$A$6,0)&"C"&COLUMN(),FALSE)<>INDIRECT("R"&MATCH($A8,$A$1:$A$6,0)&"C"&COLUMN(),FALSE),2,1))
给出图表中比较中A1:H6的人员值行

MATCH($A8,$A$1:$A$6,0) 
从比较中的A1:H6给出图表中辅助值的行

MATCH($A8,$A$1:$A$6,0) 
因为被比较的数据总是在同一列中,所以我只使用column()来确定要使用哪一列

在B8单元格中,MATCH($I8,$A$1:$A$6,0)会告诉我它是第2行,MATCH($A8,$A$1:$A$6,0)会告诉我它是第3行。因此,我想使用第2行第2列中的值与第3行第2列中的值进行比较

要让Excel比较第2行、第2列和第3行、第2列是相当简单的,但是创建一个可以在单元格之间复制而无需每次修改的公式并不是那么容易,因为每个部分都有点不同,并且在部分之间可能有空白行。我所做的是使用“R1C1”语法的间接单元格表示法,而不是更常见的“A1”单元格引用

换句话说,在第B8列中:

INDIRECT("R"&MATCH($I8,$A$1:$A$6,0)&"C"&COLUMN(),FALSE)
在第2行(Terry)、第2列和第2列中给出值

INDIRECT("R"&MATCH($A8,$A$1:$A$6,0)&"C"&COLUMN(),FALSE)
给出第3行(针对Joey)、第2列和第3列中的值

INDIRECT("R"&MATCH($A8,$A$1:$A$6,0)&"C"&COLUMN(),FALSE)
在上述两种情况下,我将and R和a C连接到MATCH()和COLUMN()函数返回的数字,并使用FALSE参数告诉Excel将连接的结果视为“R1C1”表示法。换言之,这:

OR(INDIRECT("R"&MATCH($I8,$A$1:$A$6,0)&"C"&COLUMN(),FALSE)="N/A",INDIRECT("R"&MATCH($A8,$A$1:$A$6,0)&"C"&COLUMN(),FALSE)="N/A")
换言之:

OR(R2C2="N/A",R3C2="N/A")
我意识到helper列是您没有要求的负担,并且我意识到公式过于复杂,但是我可以将此公式免费复制到任何具有这两个名称的列中,它将对一周中的那一天进行比较

下面是我正在描述的图片:


补充评论 为了进一步说明以上内容,假设您有一个Sheet1,其中包含要比较的数据行,并且假设这被限制为250行,其中包含相同的7列(而不是1000列)。我可以创建另一个类似于上面的工作表以及另一个辅助单元格(我将其放在A1中),以自动填充person列和helper列,如下所示:

新辅助单元格值:1(基本上说是从顶部开始)。这将使用以下公式填充单元格A2:

=IFERROR(IF(INDEX(Sheet1!$A$1:$A$250,NUMBERVALUE(RIGHT($A$1,3)+ROW()))=0,"",INDEX(Sheet1!$A$1:$A$250,NUMBERVALUE(RIGHT($A$1,3)+ROW()))),"")
基本上,这只是一个公式:

=INDEX(Sheet1!$A$1:$A$250,NUMBERVALUE(RIGHT($A$1,3)+ROW()))
但他首先检查结果是否为零,然后用空格替换错误。将此单元格向下复制到列A将使用从A指定的数据行后的第一行开始的名称填充该列。如果您有更多标题或其他数据,则需要在公式中两次出现的+行()部分中添加额外的amountst。第I列中大致填充了以下内容:

=IF(A2="","",INDEX(Sheet1!$A$1:$A$250,NUMBERVALUE(LEFT($A$1,3)+1)))
但是,该值不会因行而异

现在已填充辅助列,您可以填充与上面(使用相同的工作表)稍有不同的公式,例如在B2中:

=IF($A2="","",IF(OR(INDIRECT("Sheet1!R"&MATCH($I2,Sheet1!$A$1:$A$250,0)&"C"&COLUMN(),FALSE)="N/A",INDIRECT("Sheet1!R"&MATCH($A2,Sheet1!$A$1:$A$250,0)&"C"&COLUMN(),FALSE)="N/A"),3,IF(INDIRECT("Sheet1!R"&MATCH($I2,Sheet1!$A$1:$A$250,0)&"C"&COLUMN(),FALSE)<>INDIRECT("Sheet1!R"&MATCH($A2,Sheet1!$A$1:$A$250,0)&"C"&COLUMN(),FALSE),2,1)))
=IF($A2=“”,“”),IF(或(间接(“Sheet1!R”&MATCH($I2,Sheet1!A$1:$A$250,0)和“C”&COLUMN(),FALSE)=“N/A”,间接(“Sheet1!R”&MATCH($A2,Sheet1!A$1:$A$250,0)和“C”&COLUMN(),FALSE)=“N/A”),3,IF(间接(“Sheet1!R”&MATCH($I2,Sheet1!A$1:$A$250,0)和“C”&COLUMN(),FALSE)间接匹配($A,$A2!Sheet1,A!$1,A,$1,FALSE)&COLUMN())
与第一个公式的主要区别在于添加了对“Sheet1”的表外引用,并将公式扩展到250行

下面是单元格A1设置为1的图片:

下面是单元格A1设置为3的图片:

使用此选项,Sheet1的值将保持不变,您可以创建一个通用比较表来比较Sheet1各行的值。可以通过更改A1中的值来动态构建这些图纸,也可以创建几十个类似的图纸,每个图纸的值与A1中的值不同

我不确定这些是否有意义


祝你好运

这个选择有点复杂,但我们都以不同的方式解决类似的问题。如果它对你有帮助,请随意使用它。如果不是的话,我可以理解,因为这些技术中的一些并不特别常见,并且得出的公式有点不可读。我这样做是为了更好地组织行并读取匹配/不匹配的指示符m
=IFERROR(IF(INDEX(Sheet1!$A$1:$A$250,NUMBERVALUE(RIGHT($A$1,3)+ROW()))=0,"",INDEX(Sheet1!$A$1:$A$250,NUMBERVALUE(RIGHT($A$1,3)+ROW()))),"")
=INDEX(Sheet1!$A$1:$A$250,NUMBERVALUE(RIGHT($A$1,3)+ROW()))
=IF(A2="","",INDEX(Sheet1!$A$1:$A$250,NUMBERVALUE(LEFT($A$1,3)+1)))
=IF($A2="","",IF(OR(INDIRECT("Sheet1!R"&MATCH($I2,Sheet1!$A$1:$A$250,0)&"C"&COLUMN(),FALSE)="N/A",INDIRECT("Sheet1!R"&MATCH($A2,Sheet1!$A$1:$A$250,0)&"C"&COLUMN(),FALSE)="N/A"),3,IF(INDIRECT("Sheet1!R"&MATCH($I2,Sheet1!$A$1:$A$250,0)&"C"&COLUMN(),FALSE)<>INDIRECT("Sheet1!R"&MATCH($A2,Sheet1!$A$1:$A$250,0)&"C"&COLUMN(),FALSE),2,1)))