过滤具有结果条件的多个列

时间:2016-05-04 23:34:31

标签: excel excel-vba excel-formula vba

我正在尝试找到一种突出显示多种条件的结果的方法。我不知道数据透视表。我宁愿使用公式或宏。该表由经销商组织。

Acc NAME添加经销商总数
68687 Sara 11 Wood 111A 0
68687 Sara 11 Wood 111A 0
32187 Sara 11 Wood 111A 0
12345 Tom 10 Main 7878C 2
12345 Tom 10 Main 7878C 2
54321 Tom 10 Main 7878C 2

我的表与上面的表类似。我想选择总计大于0的位置。对于每个经销商,每个唯一的帐号都会以某种方式突出显示最低的帐号。

所以上面表格我想要的结果是:经销商7878C,账户 12345 ,54321。

12345是两者中的较低者,它突出显示。

我不介意将结果复制到另一张纸上,因为我不想从纸张中删除任何数据。我开始只是过滤Totals为> 0并且我正在考虑尝试过滤Account中的唯一值,但它是我坚持的下一步。一个公式吗?

这张纸非常大,我只是不确定哪种方法最适合尝试。

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

基于您的样本数据并假设第1行中的标题行和左列为A列。

=COUNTIF($A$2:A2,A2)

将其放在F2中并复制下来。然后对辅助列= 1

进行过滤

答案 1 :(得分:0)

这是一个很好但很复杂的方法。

使用原始数据: Sheet view original data 随着数据的变化: Sheet view edited data

正如您所看到的,我已将您的数据放入A1:E7。 我使用两个数组公式,一个用于G2:G5中的经销商,另一个用于帐户H2:N5。经销商公式是垂直的,而帐户公式是水平的。

经销商将此数组公式放在G2中(按Ctrl+Shift+Enter输入):

=IFERROR(INDEX($D$2:$D$7,SMALL(IF(($E$2:$E$7>0)*(COUNTIF($G$1:$G1,$D$2:$D$7)=0),ROW($D$2:$D$7)-1),ROW($G$1:$G1))),"")

现在将G2复制到G3:G5以获取其他相关经销商。

对于帐户,将此数组公式放在H2

=IFERROR(SMALL(IF(($D$2:$D$7=$G2)*(COUNTIF($G2:G2,$A$2:$A$7)=0),$A$2:$A$7),1),"")

现在将H2复制到右侧I2:N2,然后复制到H3:N5

要将第一个帐户加粗,我只需将H列格式化为粗体

您可以根据需要进一步复制这些公式。请注意,位置很重要。如果要将公式放在其他位置,则需要相应地更改引用。

解释公式

这些公式的作用是检查您的条件,然后在大多数上/左侧单元格中获取尚未检索到的最小值。

这两个公式大致相同,除了在账号中我们可以使用实际数字,而在经销商处我们使用行号代替。

经销商公式由内而外:

  1. 条件在公式的IF部分设置,乘数*为逻辑ANDTRUE*TRUE=TRUE FALSE*TRUE=FALSE)。
  2. IF(($E$2:$E$7>0)*(COUNTIF($G$1:$G1,$D$2:$D$7)=0),...中的第一个条件检查行的总值是否大于零,第二个条件检查经销商是否已存在于G列中。第二个条件在第一个单元格中无关紧要,但在第二个单元格G3中,如果经销商已存在,则变为COUNTIF($G$1:$G2,...,返回大于0,并评估为FALSE
  3. 如果符合条件,IF将使用其行减1 ROW($D$2:$D$7)-1返回经销商的索引,其中第一个等返回1,因为起始行为2.否则返回{{ 1}}被忽略。
  4. FALSE函数返回第k个最小项。它忽略了SMALL项,在我们的例子中返回满足条件的第k个最小索引(总计> 0且结果中尚未存在)。第一个单元格中的FALSE返回第一个项目。第二个单元格SMALL(...,ROW($G$1:$G1)中的ROW($G$1:$G2)计算结果为2并返回第二个最小项目,依此类推。
  5. G3函数只根据索引从数据中返回经销商。
  6. 最后,INDEX只是为了在结果到达时隐藏错误。