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

时间:2018-07-25 12:38:17

标签: excel comparison large-data

在大型数据集中-250行和1000列,我需要在一列中将单元格中的每个值相互比较,并遍历所有列。这里是源数据的简化示例:

original table

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

after comparsions

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

是否可以在Excel 2016中执行此操作,或者是否有更好的工具来执行此操作? 我感谢所有人。

2 个答案:

答案 0 :(得分:2)

这种选择有点复杂,但是我们所有人都以不同的方式解决此类问题。如果有帮助,请随时使用。如果不是这样,我可以理解,因为其中一些技术并不是特别常见,并且生成的公式有点难以理解。我这样做是为了使我能够更好地组织行并更轻松地读取匹配/不匹配指标。我从创建一个帮助器列开始,而不是为每个人重复行,以便每一行显示正在比较的两个名称。这是我用来比较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))

我将尝试解释如下使用的公式:

不使用helper列,单元格B8的基本公式如下:

=IF(OR(B$2="N/A",B3="N/A"),3,IF(B$2<>B3,2,1))

,这将适用于范围B8:H11。但是,当我跳到B13时,公式将需要更改为:

=IF(OR(B$3="N/A",B4="N/A"),3,IF(B$3<>B4,2,1))

,这将适用于范围B13:H15。同样,B17和B20为:

=IF(OR(B$4="N/A",B5="N/A"),3,IF(B$4<>B5,2,1))
=IF(OR(B$5="N/A",B6="N/A"),3,IF(B$5<>B6,2,1))

表示各自的范围。我回避了必须记住每个部分需要更改的公式(天堂禁止我写任何注释或阅读注释)。

为此,我使用人员列(A)和帮助者列(I)确定要比较的行。

MATCH($I8,$A$1:$A$6,0) 

在比较中从A1:H6中给出图表中人员值的行

MATCH($A8,$A$1:$A$6,0) 

在比较中从A1:H6给出图表中的辅助值行

由于要比较的数据始终在同一列中,因此我仅使用COLUMN()确定要使用的列。

在单元格B8中,MATCH($ I8,$ A $ 1:$ A $ 6,0)会告诉我这是第二行,而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列和

中的值
INDIRECT("R"&MATCH($A8,$A$1:$A$6,0)&"C"&COLUMN(),FALSE)

给出第3行(对于Joey),第2列和

中的值

在以上两种方法中,我都将R和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列是您没有要求的负担,并且我意识到公式过于复杂,但是我可以自由地将此公式复制到具有两个名称的任何列中,并将对此进行比较星期几。

以下是我所描述的图片:

Spreadsheet with formula in B8


添加了评论

仅需进一步介绍一下,假设您有一个Sheet1,该表具有要比较的数据行,并假设它限于250行,具有相同的7列(而不是1000列)。我可以创建另一个与上述类似的表格以及另一个辅助单元格(我将其放在A1中),以自动填充人员列和辅助列,如下所示:

新辅助单元格值: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指定的数据行之后的第一行开始。如果您有更多的标题或其他数据,则需要在这两个列的+ ROW()部分中添加额外的数量公式中出现的次数。第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)))

与第一个公式的主要区别是添加了对“ Sheet1”的表外引用,并且该公式的扩展名涵盖了250行。

这是单元格A1设置为1的图片。

Cell A1 set to 1

这是单元格A1设置为3的图片。

Cell A2 set to 3

使用此方法,您的Sheet1值将保持不变,您可以创建一个通用的比较表来比较Sheet1各个行的值。这些可以通过更改A1中的值来动态构建,也可以创建数十个相似的图纸,每个图纸的不同之处在于A1中的值。

不确定这是否有意义。

祝你好运

答案 1 :(得分:1)

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

=IF(B3=B2;1;IF(B3="N/A";3;2))

Print of it working

对每一行都执行此操作,只需将其从头到尾拖动即可。 编辑:如果要确保两者都不是“ N / A”,则应该在第二次执行or

=IF(OR(B3="N/A";B2="N/A";3;IF(B3=B2);1;2))