将一个列表中的项目与第二个列表中的相应项目进行比较

时间:2015-01-04 13:57:59

标签: excel list vba validation

我已经被要求在工作中整理一种快速的方法来验证Excel中的数据列表,但是通过嵌套的IF这样做太复杂了所以我试图做通过宏观。

关于数据的背景知识:

我们开设课程,每门课程都有相应的附加功能。人们必须选择2个课程,这意味着2个相应的附加组件。

在Excel的每一行中,2个课程在F和G列中,相应的附加组件在H和I列中。

轻微的问题是,H和I列中的数据不一定在“正确的”字样中。 order - F列中课程的附加组件可能在一行的第一列中,另一行中的列H中(与G列的附加组件相同)

第二张表中有一个表格,其中列出了哪些附加组件适用于哪些课程(A栏有课程,B栏有匹配的附加组件)。

什么是最好/最简单的方法来突出哪些行是正确的,哪些行不正确?

如果需要,我可以将文件的小型匿名样本上传到Dropbox,但数据的快速布局如下:

| 1st Course Choice | 2nd Course Choice | 1st Add-on | 2nd Add-on | Result
---------------------------------------------------------------------------
|     Subject 1     |     Subject 2     |  Add-on 1  |  Add-on 2  | Correct
|     Subject 2     |     Subject 1     |  Add-on 1  |  Add-on 2  | Correct
|     Subject 3     |     Subject 9     |  Add-on 9  |  Add-on 3  | Correct
|     Subject 5     |     Subject 4     |  Add-on 1  |  Add-on 2  | Error
|     Subject 8     |     Subject 2     |  Add-on 7  |  Add-on 8  | Error

1 个答案:

答案 0 :(得分:2)

如果提供了 Courses Add-ons 的交叉引用表,那么所需的公式根本不会令人反感。

enter image description here

E2中的标准公式是

 
=IF(AND(OR(C2=IFERROR(VLOOKUP(A2, $G$2:$H$10, 2, FALSE), IFERROR(VLOOKUP(B2, $G$2:$H$10, 2, FALSE), NA())), D2=IFERROR(VLOOKUP(A2, $G$2:$H$10, 2, FALSE), IFERROR(VLOOKUP(B2, $G$2:$H$10, 2, FALSE), NA()))), OR(C2=IFERROR(VLOOKUP(B2, $G$2:$H$10, 2, FALSE), IFERROR(VLOOKUP(B2, $G$2:$H$10, 2, FALSE), NA())), D2=IFERROR(VLOOKUP(B2, $G$2:$H$10, 2, FALSE), IFERROR(VLOOKUP(B2, $G$2:$H$10, 2, FALSE), NA())))), "Correct", "Error")
 

根据需要填写。使用IFERROR(自Excel 2007起可用)可以轻松地将VLOOKUP等函数加倍。如果第一个版本失败,您可以简单地将控制权交给第二个版本的函数。虽然这些仍然需要加倍以考虑所有可能性,但不应该有大的计算负荷。

您是否需要额外条件以确保C列不与D列重复?

编辑:添加重复检查

检查A:B和C:D中的重复项应该不是问题,因为它们可以添加到现有的AND函数中。这是对A:B和C的修改:d

 
=IF(AND(A2<>B2, C2<>D2, OR(C2=IFERROR(VLOOKUP(A2, $G$2:$H$10, 2, FALSE), IFERROR(VLOOKUP(B2, $G$2:$H$10, 2, FALSE), NA())), D2=IFERROR(VLOOKUP(A2, $G$2:$H$10, 2, FALSE), IFERROR(VLOOKUP(B2, $G$2:$H$10, 2, FALSE), NA()))), OR(C2=IFERROR(VLOOKUP(B2, $G$2:$H$10, 2, FALSE), IFERROR(VLOOKUP(B2, $G$2:$H$10, 2, FALSE), NA())), D2=IFERROR(VLOOKUP(B2, $G$2:$H$10, 2, FALSE), IFERROR(VLOOKUP(B2, $G$2:$H$10, 2, FALSE), NA())))), "Correct", "Error")