【问题标题】:Excel Create Data Validation Unique items for dynamic Drop Down List without new ColumnExcel为没有新列的动态下拉列表创建数据验证唯一项目
【发布时间】:2018-03-25 11:32:24
【问题描述】:

我的表随着数据刷新而增长的列表如下:

Balham Halfords - P83690
Balham Halfords - P83690
Gloucester & Durham St - P83680
Gloucester & Durham St - P83680

在另一张表中,我希望仅显示下拉列表中的数据验证:

Balham Halfords - P83690
Gloucester & Durham St - P83680

问题是,我不想在书中的任何地方创建一个与表 A 不同的列表,并且我希望数据验证列表能够智能地处理进入表 A 的新记录。

【问题讨论】:

  • 我不确定是否有任何方法可以在没有辅助列的情况下完成此操作。数据验证(无论如何都用于下拉列表)本质上是非智能的。它只允许您输入一系列单元格 - 不允许使用公式。
  • 谢谢。因此,我认为我最好的选择是在新记录进入时通过宏创建一个不同的单列表。然后让数据验证列表范围为所述表。但并不理想,因为用户在添加到表 A 时必须单击按钮,而人们无法处理此类指令。
  • 我同意需要一个帮助列。如果您想避免使用 VBA,可能可以使用公式来完成。
  • 我发布了一个新答案,修改了不使用OFFSET 的@KresimirL.,这可能会对您有所帮助。

标签: excel list validation dynamic unique


【解决方案1】:

如果您想在公式中使用 Helper 列方法,请尝试此解决方案。

如果您的数据在 A 列中,请在单元格 D2 中输入此公式 =IFERROR(INDEX($A$2:$A$900, MATCH(0,COUNTIF($D$1:D1, $A$2:$A$900), 0)),""),然后将其向下拖动,只要您估计会有不同的值。您必须使用 CTRL+SHIFT+ENTER 输入它,因为它是一个数组公式。

然后使用数据验证,选择列表并在源下输入此公式=OFFSET(D2,0,0,198-COUNTBLANK(D2:D200),1)

现在,每当向表中添加新值时,它们也会自动添加到您的数据验证列表中。

【讨论】:

  • 很好的解决方案。不知道数据验证允许使用公式。
  • 谢谢,现在我很感兴趣,是否可以将整个数组存储在 DataValidation 列表中,从而不再需要辅助列...?
  • 谢谢克雷西米尔。新的数组公式有效,但让这本书变得很慢。新条目进入后正在重新计算,您可以在右下角看到计算百分比。 VBA 选项只是为了快速创建唯一的数据验证列表还是比这更复杂?
  • 是的,这个数组公式往往会大大降低工作簿的速度,因此它应该只用于小型数据集。为此创建 VBA 解决方案并不难,请尝试查看 this 以获取更多信息。您还可以创建一个数据透视表并在每次在表中添加新行时刷新它......这将消除对 VBA 的需要......
【解决方案2】:

@DasalKalubowila,这是对@KresimirL 答案的修改,可能是您正在寻找的。​​p>

首先,为您的输入数据创建一个定义的名称。为此,请转到功能区上的公式,然后单击定义名称组下的名称管理器

在我的示例中,我将输入数据范围称为InputData。我使用的公式是

=Sheet1!$A$2:INDEX(Sheet1!$A$2:$A$501,MATCH("Ω",Sheet1!$A$2:$A$501))

在哪里

  • Sheet1 是输入数据所在的工作表的名称,

  • $A$2 是包含输入范围内数据的第一个单元格(我称之为锚点),

  • $A$2:$A$501 是您的数据所在列的最大区域,并且可能在未来存在,并且

  • "Ω" 是欧米茄字母。您可以通过按住 ALT 并按 2 然后按 3 然后按 4 在 10 键数字键盘上(也可以在 Windows 的字符映射应用程序中找到)。

此公式根据存在的条目数有效地扩大或缩小您的数据范围。


接下来,您需要创建一个帮助列。我知道这是不希望的,但这将是唯一/更好的方法之一。我把我的和我的输入数据放在同一个工作表上,但你不必这样做。我在E2中使用的公式是

=IFERROR(INDEX(InputData,MATCH(0,COUNTIF($E$1:$E1,InputData),0)),"")

您需要使用 Ctrl+Shift+Enter 来提交它,因为它是一个数组公式。然后将该公式向下拖动到尽可能远的位置。基本上,您会想要尽可能多地往下走,因为您认为您将拥有唯一的条目。


然后,我需要再创建一个已定义的名称,这将在下一步的 数据验证 下使用。我将这个新定义的名称称为 ValidationList(这需要限定为工作簿)。我用于 ValidationList 的公式是

=Sheet1!$E$2:INDEX(Sheet1!$E$2:$E$501,COUNTIF(Sheet1!$E$2:$E$501,">*"))

请参阅上面的 InputData 注释以更好地理解此公式。唯一的区别是,这个公式使用COUNTIF,而不是MATCH。这是因为如果您的唯一值尚未填充整个范围,您将公式向下拖动到 Column E(在上一步中),以与以前相同的方式使用 MATCH 最终会抓住一大堆空白我们不想要。 COUNTIF 因此只计算那些包含大于“*”的值的单元格,星号是任何字符的通配符(并且“”不包含任何字符,因此不包括这些项目)。


现在,创建您的数据验证并将其设置如下:

现在你应该得到这个:

当您将信息添加到您的 InputData 区域时,您的 ValidationList 范围应该扩大到包括最新的唯一性,而这些唯一性又将填充到您的 Data 中验证区域,例如:

我发现这似乎并没有显着降低我的工作簿速度,但我很想知道它在你的工作簿中的表现。

【讨论】:

  • totsiemae - 非常感谢您愿意提供帮助。最后,我选择了轻量级的 VBA,而不是较重的索引和匹配公式。用户现在添加到表 A 并运行创建辅助列的宏。数据验证源现在是所述列或 =INDIRECT("Table5[Description + Code]")
猜你喜欢
  • 1970-01-01
  • 2013-07-05
  • 1970-01-01
  • 1970-01-01
  • 2016-08-15
  • 2013-11-12
  • 2021-06-01
  • 1970-01-01
  • 2018-03-03
相关资源
最近更新 更多