使用带筛选条件且忽略零的Excel小函数

使用带筛选条件且忽略零的Excel小函数,excel,formulas,Excel,Formulas,我有一份产品的价格清单,这些产品是多种母产品的变体(不同的尺寸、颜色)。有些产品(出于对这个问题不重要的原因)的价格为零 我正在尝试编写一个excel公式,该公式将返回每个非零父产品的最低价格 我已经做到了这一点: =IF(SUMIFS(I:I,A:A,A3)=0,0,IF(SUMIFS(I:I,A:A,A3)>0,MINIFS(I:I,A:A,A3)>0,MINIFS(I:I,A:A,A3),SMALL(IF(A:A=A3,I:I),2))) 其中I:I是价格列,A:A是父参考列 这在所有情况

我有一份产品的价格清单,这些产品是多种母产品的变体(不同的尺寸、颜色)。有些产品(出于对这个问题不重要的原因)的价格为零

我正在尝试编写一个excel公式,该公式将返回每个非零父产品的最低价格

我已经做到了这一点:

=IF(SUMIFS(I:I,A:A,A3)=0,0,IF(SUMIFS(I:I,A:A,A3)>0,MINIFS(I:I,A:A,A3)>0,MINIFS(I:I,A:A,A3),SMALL(IF(A:A=A3,I:I),2)))

其中I:I是价格列,A:A是父参考列

这在所有情况下都有效,除了我有一个零值的父产品的多个变体

我需要一个小型或小型函数中的变量,该函数将: A.计算中仅包括单个母产品的值 B.在计算最低值时忽略任何零


任何帮助都将不胜感激。

如果输入数据是根据父参考级别排序的,您可以

  • 使用“偏移量”查找包含价格的所需父参考单元格
  • 使用
    SMALL
    公式找到第k个最小值(即最小值)
  • 如果最小值为0,则设置一个if条件以给出第二个最小值
把这个放在第一排

=IF(SMALL(OFFSET($I$1,MATCH(C1,$C:$C,0)-1,0,COUNTIF($C:$C,C1)),1)=0,SMALL(OFFSET($I$1,MATCH(C1,$C:$C,0)-1,0,COUNTIF($C:$C,C1)),2),SMALL(OFFSET($I$1,MATCH(C1,$C:$C,0)-1,0,COUNTIF($C:$C,C1)),1))

您可以使用“传统”数据透视表来执行此操作。看看阿什利多格的回答

您还可以使用基于数据模型的“OLAP”数据透视表来完成此操作,与“传统”数据透视表相比,OLAP数据透视表有一个小优势,即刷新后不需要清除页面过滤器。(更多关于这一点,请参见我的答案底部)

默认情况下,Excel 2013以后的任何Excel版本都内置了DataModel,如果安装Microsoft免费的PowerPivot加载项,您也可以在2010年访问DataModel。使用数据模型,您需要执行以下操作:

使用Ctrl+T键盘快捷键将数据转换为Excel表格:

使用数据透视表,但请确保选中“将此数据添加到数据模型”选项:

将组添加到数据透视表的“行”窗格中,然后右键单击“字段”窗格中的表1并选择“添加度量…”:

为新度量值命名(我称之为不带零的最小值),并在公式框中键入
=CALCULATE(最小值(表1[Price]),表1[Price]>0)
,然后按OK:

在“数据透视表字段”列表中的“最小值不为零”复选框中打勾

宾!数据透视表按价格显示每组的最小值(不包括零)

编辑:如果我自己做这件事,我可能会使用阿什利道格的答案。但有一个警告:如果您在将来添加其他数据并刷新,那么您需要清除过滤器并重新应用零排除,以绝对确保数据中包含任何新的数字。作为演示,如果我从页面字段中过滤掉零,那么我只得到我期望的结果:

…下面是过滤器的外观:

但如果我添加新数据并刷新,请注意数据透视表中没有任何更改:

…如果我看一下过滤器,我就能明白为什么:

这是因为当你从一个过滤器中取消选择某个东西时,你实际上并不是说“给我除了这个东西以外的所有东西”,而是说“给我这个列表中当前可见的其他东西,但不要选择任何新的东西。”


很容易修复:只需清除过滤器并再次取消选择零(或者编写一些VBA代码在刷新时自动执行)

如果需要公式方法,可以使用If语句在值大于零时返回值,否则返回FALSE,因为像MIN这样的函数可以方便地忽略FALSE

根据我的另一个答案,我建议您首先使用Ctrl+T键盘快捷键将数据转换为Excel表格,如下所示。然后,在汇总表中,可以使用E2中输入的以下数组公式:

=MIN(如果(表1[Price]>0,如果(表1[Group]=D2,表1[Price]))

(输入数组表示按Ctrl+SHIFT+ENTER键,而不是像通常那样按ENTER键)

结果如下:


您可以使用透视表轻松创建动态最小值列表。默认情况下,空白单元格被忽略,可以通过几种方式排除零(或您想要的任何其他数字);我认为最简单的方法是使用Pivot表的Filter特性

他们说一张图片值千言万语,所以一张动画GIF一定值一百万……:)


更多信息:
  • Office.com:

  • Office.com:

  • 网站提示:


您不能简单地用一个高数字替换0,或者简单地删除行吗?会让你的生活更轻松
Minifs
不是正常的excel公式。你有没有叫它的VBA函数?如果是,我们需要查看其代码为什么不使用数据透视表从每个组中获取最小值,而不是重写内置功能?@ashleedawg“传统”数据透视表仍将显示最小值为零,OP在计算最小值时希望忽略该值。@RVPSRichard您有什么版本的Excel。如果您有Excel 2013或更高版本,您可以使用基于数据模型的数据透视表,使用DAX度量。(早期版本要求您安装免费的PowerPivot外接程序,以便使用数据透视表执行此操作)。@jeffreyweir绝对不是真的。我刚刚通过几列值(带零和空白)确认了这一点,在不到45秒的时间里,我得到了一个数据透视表,显示了分组的最小值,不包括零。答案很好。及时提醒我,您可以同时在“过滤器”区域和“值”区域中设置一个字段。(从Excel的角度来看,技术上它们是不同的字段)。谢谢你及时的回复