如何在Excel数据验证中使用结构化表引用?

时间:2016-06-29 18:56:26

标签: excel validation excel-formula

我尝试为Excel表格中的列创建数据验证。验证需要引用表中的另一列。

有2列," f1"和" f2"。每列可以包含" Y"或" N"。

使用单元格寻址工作正常:

enter image description here

我的问题是:如何使用结构化表格寻址制作验证公式?

结构化参考的优秀概述:http://peltiertech.com/structured-referencing-excel-tables/

对列" f2"进行所需的验证是:

=Table1[f1]&Table1[f2]<>"YN"

此图片显示了表格旁边的表格和验证公式,显示了预期的验证结果:

Pic1

我将上述公式添加到数据验证中 - &gt;自定义,用于&#34; f2&#34;中的单元格。失败 - 它拒绝有效的条目(即该公式计算为True的条目)。

然后,我尝试使用该公式创建一个定义的名称,基于这篇文章,并使用该名称作为我的自定义验证。那也失败了。 https://superuser.com/a/480660

然后我尝试在我定义的名称中使用INDIRECT,基于这篇文章: http://www.get-digital-help.com/2012/10/15/how-to-use-a-table-name-in-data-validation-lists-and-conditional-formatting-formulas/

enter image description here

enter image description here

但有效的参赛作品仍然被拒绝。

怎么做?

我认为结构化引用在验证公式中失败的原因是因为TableName [FieldName]评估整个列,而不仅仅是当前行。因此,我正在探索将验证公式限制为当前行的方法。

到目前为止我想到了这些方法:

我认为在结构化引用中,当前行用@标识。

所以,公式是:

Table1[@f1] & Table1[@f2]<>"YN"

Table1[[@[f1]] & Table1[@[f2]]<>"YN"

这实际上适用于工作表,但仍不能作为验证公式。

我的下一个尝试是使用INDEX来拉动当前行。公式是:

INDEX(Table1[f1] & Table1[f2],1,0)

同样,这适用于工作表,但不是验证公式。不过,我认为这是一个很有希望的方向!

3 个答案:

答案 0 :(得分:1)

  • 解决方案是使用查找列表进行验证。
  • 此解决方案使用实际寻址,不需要INDIRECT。如果需要,您可以在工作表上构建公式,并获取地址自动完成。
  • 此解决方案使用结构化表格引用。
  • 在问题中,我们有一个包含2列的表对象(在此答案中命名为&#34; Col1&#34;和&#34; Col2&#34;用户可以在其中输入&#34 ; Y&#34;或&#34; N&#34;在任一栏中。
  • 在问题中,我们将接受除&#34; Y N&#34;之外的所有组合,这将提出标准数据验证警报。

<强>步骤

  1. 在table-object之外创建2个命名范围(如果需要,可以在单独的隐藏工作表上):
    • rngY:Y
    • rngYN:Y,N
  2. 创建以下定义名称(注意,此公式不应输入到工作表中;它只能在定义名称的定义中。)
    • &#34; validFmla&#34;:=IF(Table1[@Col1]="Y", rngY, rngYN)
  3. 在Col2的数据单元格中创建以下数据验证。
    • 列表类型验证
    • 来源:=validFmla
    • 可选:取消选中&#34; In-cell下拉菜单&#34;
  4. 完成。
  5. enter image description here

    <强>结果

    • 现在,Col1包含&#34; N&#34;,您可以输入&#34; Y&#34;或&#34; N&#34;进入Col2。
    • Col1包含&#34; Y&#34;,您只能输入&#34; Y&#34;进入Col2。

    enter image description here

    请注意,我在此图片的工作表上显示验证公式仅用于说明目的 - 它通常不会输入到此解决方案的工作表中。

    奇怪的是,这可以使用选择列表,而原始问题中的公式不起作用,但Excel以神秘的方式工作。

答案 1 :(得分:0)

我不确定这是否正是您所寻找的。您可以使用INDIRECT公式在验证中引用表。

=INDIRECT("TableName[ColumnName]")

如果选择了List验证,这将根据列中的数据验证数据。

答案 2 :(得分:0)

通过创建这样的结构化表

enter image description here

然后像这样使用 INDIRECT 进行引用:

enter image description here

奖励:您甚至可以像这样使用双 INDIRECT。内部 INDIRECT 为您提供结构化表的列标题,其名称在命名范围的 TargetTable 中提及。外部 INDIRECT 返回这些值供用户选择。然后将第一张图片中的公式推入使用 VBA 的 TargetColumn 范围名称的数据验证中。

enter image description here

enter image description here

enter image description here