Excel 无需向下拖动即可从日期列中提取 Unique Distinct 值的公式

Excel formula to extract Unique Distinct values from a Date column without dragging down

我在 Calc Sheet 中有一个 Selected Countries table,每个单元格都有下拉列表,允许我从“假期”table select 特定国家.我在 Calc Sheet 的单元格 E2 中写了一个公式,selects 来自那些 selected 国家列的日期。

=IFERROR(INDEX(HolidayList[#All],ROW(HolidayList[#All]),TRANSPOSE(MATCH(CHOOSE({1;2;3;4;5},$A,$A,$A,$A,$C),TRANSPOSE(HolidayList[#Headers]),0))),"")

在 L 列中,我编写了一个公式来合并 selected 国家/地区日期并创建唯一不同值(非重复值)的单个日期列。

=IFERROR(SMALL(SelectedHolidays,ROW(INDIRECT("1:"&COUNT(SelectedHolidays)))),)

此公式会自动列出所有日期,而无需我将公式向下拖动到每个单元格。我需要有人帮我修改这个公式来生成一个唯一的不同日期列的列表。我不需要必须向下拖动到后续单元格的公式。

我还在 NamedRanges Sheet 上列出了我在工作簿中创建的命名范围。

附上 sample workbook 供您阅读。

编辑:

我能够使用 FREQUENCY 函数在不拖拽公式的情况下计算出一个独特的日期列表。但是,公式中 MATCH 生成的行数组中有#Values(用于重复项)。我如何排除此数组中的#Values?

=SMALL(MDHolidays,IF(FREQUENCY(MDHolidays,MDHolidays)>0,MATCH(MDHolidays,MDHolidays,0),""))
  1. 我们可以通过将 COUNTIF(SelectedHolidays,0) 添加到行号来去除 L 列中的零,也就是 1/0/1900,得到

=IFERROR(SMALL(SelectedHolidays,COUNTIF(SelectedHolidays,0)+ROW(INDIRECT("1:"&COUNT(SelectedHolidays)))),"")

  1. 我们将得到一个独特的假期范围,添加一个带有数组公式的附加列(例如,M)

=IFERROR(INDEX(MDHolidays,MATCH(0,COUNTIF(M:M1,MDHolidays),0)),"")

EXCEL365方法----------------------------

UNIQUE 将每一行或每一列视为一个“元组”,然后比较每个元组,因此当您将矩阵放入其中时,例如 A1:C3,它看起来是按行的(例如 {A1,B1 ,C1} 与 {A2,B2,C2} )或按列(例如 {A1;A2;A3} 与 {B1;B2;B3} )确定元组是否唯一。它不会查看每个单元格,因此您必须将单元格复用到单个列(或行)中,然后将 UNIQUE 应用于该复用范围。

这里有一个公式,您可以将其放入 L2 中,它将根据您的 XLS 提供一组动态的唯一日期(感谢分享 - 这使得这更容易明白):

=LET( range, E3:I9,
       Cols, COLUMNS( range ),
       Rows, ROWS( range ),
       iSeq, SEQUENCE( Rows * Cols,,0 ),
       RowIndex, iSeq / Cols + 1,
       ColIndex, MOD( iSeq, Cols ) + 1,
       rawList, UNIQUE( INDEX( range, RowIndex, ColIndex ) ),
       SORT( FILTER( rawList, ( rawList <> "" ) * ( rawList > 0 ) ) )
      )

我设置了 range = E3:I9 以便它在您的输出中包括比利时 - 不确定这是否是您想要实现的目标。

这个 LET 公式将 range 作为一个变量,然后测量它的维度。

调制与复用

然后准备调制,以便可以将范围多路复用到单个列中。 iSeq 是对范围内的每个单元格进行计数的序列,它将垂直调制为 RowIndex 并水平调制为 ColIndex。这些用于通过应用 INDEX( range, RowIndex, ColIndex ).

来复用 range

应用 UNIQUE 和过滤

rawList 将 UNIQUE 应用于多路复用列以获得唯一值但是......这些将包含一些不需要的输出,例如 blank0需要过滤,所以结果作为rawList的过滤器传递。然后对最终输出进行排序。

Also, with this formula, you can change your count of unique dates formula in N2 to =COUNTA(L2#).

EXCEL 2013 方法 (Plumhoff-Bartholomew) ---------------- ----------

您的 MDHolidays 现在将成为一组辅助单元格,使用与您指定的名称相同的名称(暂时不要重命名,否则会造成混淆)。我们将使用另外两个助手来:

  1. 生成一组唯一的日期
  2. 没有零值日期

首先,创建两个新的命名范围:

k 是一个基于 row

的老式序列生成器
= ROW( MDHolidays ) - 1

unique.idx 是 k 的布尔掩码,用于消除重复项、空白和零日期:

= IF( ISNUMBER( MDHolidays ),
         IF( ( MATCH( MDHolidays, MDHolidays , 0 ) = k ) * ( MDHolidays <> 0 ), 
               k ) )

这两个可以创建为命名范围,而无需将它们放在任何地方。只需打开名称管理器并使用上面的公式将它们创建为新名称。

现在,您可以创建输出。您可以在单元格 M2 中对此进行测试。它将是:

= IFERROR( INDEX( IF( MDHolidays > 0, MDHolidays ), SMALL( unique.idx, k ) ), "" )

如果您喜欢这个结果,那么让我们做最后的清理。将 MDHolidays 重命名为 MCHolidays(合并、合并的假期),然后打开名称管理器并将 MDHolidays 的当前动态范围公式替换为:=OFFSET(Calc!$L,0,0,COUNTA(Calc!$L:$L)-1) 为您当前(并且非常好的)公式L2=IFERROR(SMALL(SelectedHolidays,ROW(INDIRECT("1:"&COUNT(SelectedHolidays)))),)。这将虚拟化这些值,以便它们不占用任何单元格-space.

现在您可以通过打开名称管理器重新使用旧的 MDHolidays 名称,使用上面 M2 中当前的公式创建一个新的 MDHolidays。要完成清理,将 L2 中的公式更改为简单的 = MDHolidays 并删除 M2.

中的公式

这种梳理 UNIQUE 的方法是由 Bernd Plumhoff 和 Peter Bartholomew 开发的。

对于您的第一个问题,您可以通过将单元格格式化为 m/d/yyyy;; 来简单地隐藏零值。但是,可以修改您的公式以排除 TRANSPOSE 函数...

=IFERROR(INDEX(HolidayList[#All],ROW(HolidayList[#All])-MIN(ROW(HolidayList[#All]))+1,MATCH(CHOOSE({1,2,3,4,5},$A,$A,$A,$A,$C),HolidayList[#Headers],0)),"")

对于第二个问题,select 个单元格 L2:L33,因为最多有 32 个可能的值,请输入以下公式,然后按 Ctrl + Enter...

=IFERROR(SMALL(IF(SelectedHolidays>0,IF(ISNA(MATCH(SelectedHolidays,L:L1,0)),SelectedHolidays)),1),"")

编辑

我有点不明白您为什么使用 MDHolidays 而不是 SelectedHolidays。无论如何,您可以修改最新的公式 您已发布如下...

=IFERROR(SMALL(IF(FREQUENCY(IF(MDHolidays>0,MATCH(MDHolidays,MDHolidays,0)),ROW(MDHolidays)-MIN(ROW(MDHolidays))+1)>0,MDHolidays),ROW(INDIRECT("1:"&COUNT(MDHolidays)))),"")