答案1
以下是两种解决方案,与我在问题评论中提出的建议相对应。对于这两种解决方案,我都假设 A1:C30 包含问题中的数据。
使用数据库函数
第一个解决方案使用 Excel 的数据库函数。数据库函数都将单元格区域视为数据库,其中每行是一条记录,每列是字段。第一行包含列名。数据库函数还将另一组单元格作为搜索条件,其中第一行是列名,第二行是实际条件。鉴于此,在 E1:F2(或任何地方,但这些示例中我将其放在此处)中输入:
E F
1 Store # Date
2 414 11/9/15
这就是标准。然后在 E4(或任何地方)输入=DGET(A1:C30,"Data",E1:F2)
。这将使用DGET
数据库函数查找给定数据库(A1:C30
)、列名("Data"
)和标准(E1:F2
)的列值。在本例中,这将导致132
。将 F2 的内容更改为11/2/15
将更改DGET
值到55
,等等。
这也许是最简洁的方法,因为如果数据中有额外的列,并且有要用于匹配这些列的条件,则很容易扩展。您还可以重用条件的部分内容来执行其他操作。例如,=DSUM(A1:C30,"Data",E1:E2)
将对商店 414 的所有数据值求和,=DSUM(A1:C30,"Data",F1:F2)
将对 11/9/15 的所有数据值求和,等等。它也不假设列的排序顺序。缺点是,如果您不经常使用数据库函数(像我一样 :-) ),则每次使用它们时都必须重新阅读它们的帮助(就像我为此做的那样 :-) ),因此它可能不那么易于维护。
使用索引和查找公式
第二种方法结合了Excel的一些查找公式。
设置与上述相同的工作表,问题的数据在 A1:C30 中,条件在 E1:F2 中。请注意,在本例中,我们只使用 E2 和 F2,但您可以将 E1 和 F1 保留为 E2:F2 中内容的标签。
然后在 E4 中输入:
=VLOOKUP(F2,INDEX(B:B,MATCH(E2,A:A,0),1):INDEX(C:C,MATCH(E2,A:A,1),1),2)
从内到外分解如下:
MATCH(E2,A:A,0)
0
这将在第一列 ( A:A
) 中找到与 store # in 匹配的第一个匹配项 ( ) E2
。它返回相对位置,在本例中,由于第一列的全部内容都是查找数组,因此位置将是 store # in E2 中第一次出现的行号。使用示例数据,如果您将其单独放在单元格中,则其值为7
。
INDEX(B:B,MATCH(E2,A:A,0),1)
这将生成对由和 列B:B
确定的行中第二列 ( ) 单元格的引用。如果您将其单独放在单元格中,则值将是引用单元格的值,在本例中,将是 B7 中的值,或。MATCH
1
11/10/14
MATCH(E2,A:A,1)
这将在第一列中找到与商店编号匹配的最后一个匹配项(1
)。如果将其单独放在单元格中,则值将为25
。
INDEX(C:C,MATCH(E2,A:A,1),1)
这将生成对由和 列C:C
确定的行中第三列 ( ) 单元格的引用。如果您将其单独放在单元格中,则值将是引用单元格的值,在本例中,将是 C25 中的值,或。MATCH
1
132
INDEX(B:B,MATCH(E2,A:A,0),1):INDEX(C:C,MATCH(E2,A:A,1),1)
这将结合两个INDEX
公式来生成一个用于搜索日期的引用。对于示例数据,它将是 B7:C25(如果您将它单独放在单元格中,您将得到 ,#VALUE!
因为它会产生多个值。如果您将它作为数组公式单独放在单元格中,您将得到左上角单元格的值,或11/10/14
)。
=VLOOKUP(F2,INDEX(B:B,MATCH(E2,A:A,0),1):INDEX(C:C,MATCH(E2,A:A,1),1),2)
这将所有内容结合在一起。它用于在由两个公式 (B7:C25) 生成的单元格区域内VLOOKUP
查找日期,并返回匹配行的第二列(最后一列)。F2
INDEX
2
瞧!