【问题标题】:Excel Filtered Data Validation from other Table not using macro and helper columnsExcel从其他表过滤数据验证不使用宏和帮助列
【发布时间】:2019-08-07 19:36:20
【问题描述】:

如何在 Excel 中创建预过滤数据验证下拉列表,同时:

  • 不使用 VBA/宏
  • 没有或尽可能少的帮助列
  • 不要手动创建单独的命名范围,因为基础数据会随着每次刷新而改变(源表是 OData-feed)
  • 不要在下拉列表中显示空值
  • 目前还不能使用新的 Excel 数组函数,如 FILTER() 或 UNIQUE()
  • 按字母顺序对下拉列表进行排序

这个问题很接近,但我无法让the answer 在我的情况下工作。 这个answer uses an array,但是当我使用如图所示的公式时,结果为空:

{=IFERROR(INDEX(Table1[Item];SMALL(IF(Table1[Type]="PT";ROW(1:5);"");ROW(1:5)));"")}

也许可以使用 PowerQuery (DAX) 对 OData 提要进行预过滤,但我想知道如何在常规 Excel 公式中完成此操作。

表格如下所示:

所需的下拉列表显示 Type = "PT" 的每个项目,因此其值为:DEF、KLM 和 RST

【问题讨论】:

  • 我正在使用 EXCEL 2016,但找不到满足您所有要求的纯公式解决方案。 EXCEL 365 中有一个SORT 函数,它可能有助于满足您的排序要求。话虽如此,如果您可以使用 帮助表,您可以在其上根据您的 Odata 创建数据透视表,将 Item 列在行标签中并进行排序,按PT 过滤,并使用OFFSET 函数动态引用该范围和name 函数,然后在数据验证下拉菜单中使用名称。如果你想看演示,请告诉我:)
  • 我在 Office365 Pro 中使用 Excel,但我没有 SORT 功能(或 UNIQUE 或 FILTER)。那会让事情变得容易得多。我认为它似乎可以通过在数据验证中使用名称范围以及 INDEX、MATCH 的组合来工作。问题是我把公式放在数据验证中,但我必须先把它放在命名范围内,然后在数据验证列表中使用命名范围。另外,我参考了另一个工作簿,然后公式需要一个 INDEX 才能继续运行。使用 INDEX 和 MATCH 时,列顺序也很重要。使用 PowerQuery 对有帮助的列进行预过滤。

标签: excel validation excel-formula


【解决方案1】:

今天早上再试一次,我能够用 2 个辅助列找到解决方案。

如下图,第一个helper列是查找对应Type“PT”的Item名称,第二个helper列是按字母顺序排列结果。

以下是此解决方案的两个限制

1) 项目名称不能是纯数字(例如 123 或 456);

2) 对于给定的类型,不能有重复的匹配项目名称(例如,不能有两个名为 ABC 的项目以 PT 作为类型)。

在显示我的公式之前,我需要定义一些名称,如下所示:

Item - 这是我的解决方案中 A 列的名称;

类型 - 这是我的解决方案中 B 列的名称;

过滤器 - 我在名称管理器中将其硬编码为“PT”。如果愿意,可以将其存储在一个单元格中;

高度 - 它是一个动态值,用于计算满足给定类型的项目数。它在我的解决方案中的以下 OFFSET 公式中用作 height 引用。

过滤 - 它是 C 列(Helper 1)中的一个动态范围,捕获除空白之外的所有值。公式为=OFFSET(Sheet1!$C$1,1,,Height,)

List - 这是 D 列(Helper 2)中的另一个动态范围,捕获除空白之外的所有值。公式为=OFFSET(Sheet1!$D$1,1,,Height,)

C2单元格中的公式如下。由于它是一个数组公式,您需要按Ctrl+Shift+Enter aka CSE 使其工作。只需将其向下拖动即可全面应用。

{=IFERROR(INDEX(Item,SMALL(IF(Type=Filter,ROW(Item)-1,""),ROW()-1),),"")}

D2单元格中的公式也是数组公式,输入CSE后也可以向下拖动。

{=IFERROR(INDEX(Filtered,MATCH(ROWS($1:1),COUNTIF(Filtered,"<="&Filtered),0)),"")}

最后,使用 List(预定义名称)作为数据验证的来源,如下所示。

结论

我认为上述解决方案可能不太实用,尤其是在数据量很大的情况下,但是我喜欢学习使用 SMALL 有条件地定位一系列数据,并使用 COUNTIF 按字母顺序对文本值进行排序。

我还注意到 OFFSET 的限制,即它不能用于存储在名称中的动态范围,因为没有有效的起始单元格或单元格范围。否则可能不需要辅助列。

最后,我认为解决这个问题的最佳方法是 Power Query,它可以很容易地过滤和排序所需的数据范围,即使是大量数据。如果可以选择添加帮助表,还有一种方法可以使用 数据透视表 对所需列表进行过滤和排序。干杯:)

【讨论】:

    猜你喜欢
    • 2015-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-12
    • 2013-03-18
    • 1970-01-01
    相关资源
    最近更新 更多