【问题标题】:Using named range for conditional data validation使用命名范围进行条件数据验证
【发布时间】:2014-12-03 20:21:59
【问题描述】:

我有一个名为“myList”的命名范围,定义为 Sheet1 的第 1 到 200 行。共有 20 列,前 8 列是关于员工的信息,后 12 列是 0 或 1,用于包含每个月的员工。

现在,我想创建一个下拉菜单,如果我的命名范围的第 9-20 列中至少有一个 1,它将显示员工的姓名。

目前,我使用以下公式作为数据验证:=INDEX(myList,,1),它会显示 myLast 中的每个名称,无论第 9-20 列是否有 1。

如何更改此设置,以便创建下拉菜单的数据验证中显示的唯一名称是 myList 第 1 列上的名称,其中 myList 第 9-20 列的相应 SUM() >= 1?

【问题讨论】:

    标签: excel validation excel-formula named-ranges


    【解决方案1】:

    这是workabout to your question:
    在最后一列之后创建一列 SUM 并计算每一行的总和。假设您的数据表的 V 列
    然后使用以下数组公式过滤总和为 >=1

    假设您将此公式放入 X1 并向下拖动直到最后一行。

    =IFERROR(INDEX($A$2:$V$31;SMALL(IF($V$2:$V$31>=1;ROW($V$2:$V$31));ROW(1:1))-1;1);"")
    


    这是一个数组公式,所以按ctrl+shift+回车计算公式



    然后在 Z1 中根据 列 X 中的过滤名称创建下拉列表。
    请用 201 替换 31,因为如果是这种情况,您将有 200 行加上一行标题。我在示例表中使用了 30 个项目。
    告诉我它是否有效。
    ***UPDATED***
    抱歉,公式中有错误,现已更正。这是修正后的公式。它现在工作正常。我也更改了下载链接。

    【讨论】:

    • 我不得不下载你的例子来检查我的代码有什么问题,但看起来你也有同样的问题。为什么您的示例中的过滤名称中没有 name1 ?为什么 name30 在这里,因为 V 中的和为 0?然后我注意到缺少 name24 和 name25 而不是 name23 和 name24。如果我从范围 A1:A200 和 V1:V200 而不是 A2:A200 和 V2:V200 开始,它确实有效。
    • 另外,列表最后会显示空白值。我尝试使用 NA() 而不是 IFERROR() 的第二个参数的空单元格,但 #N/A 也只显示在列表菜单中。 “忽略空白单元格”已被选中。所以对于列表,我只使用了=INDIRECT("myList!$W$1:$W$" & myList!$X$2) where X2={MIN(IF($W$1:$W$200="",ROW($W$1:$W$200)))-1}。
    • @dnLL 你是对的。我更新了公式和下载链接,现在可以正常使用了!告诉我是否有问题。
    • 好吧,我从第一行开始修复它,以便它包含列标题(并不介意,因为工作表已隐藏,然后我可以使用第 2 到 201 行进行验证范围)。在验证范围中似乎需要在另一个函数中使用INDIRECT() 来查找列中的第一个空单元格,以避免在菜单中显示空白单元格。所以它现在完美地工作。非常感谢!
    • 您使用=Sheet1!$X$2:$X$26 作为验证范围(好吧,作为您的命名范围)。您如何动态确定您的姓氏在第 26 行?您对其进行了硬编码,哈哈,我不能这样做,因为它会随着新员工的出现在一年中的每个月都发生变化。这就是我使用{MIN(IF($W$1:$W$200="",ROW($W$1:$W$200)))-1} 公式(在您的示例中将返回26)然后使用INDIRECT() 的原因。它只是用于数据验证,所以 INDIRECT 实际上只执行一次,我认为它不会产生太大的影响。
    【解决方案2】:

    您可以在不直接引用一组工作表单元格的情况下编写 DV 列表:

    Sub NotUsingCells()
        Dim StringOfNames As String
        StringOfNames = "Larry,Moe,Curley"
        With Selection.Validation
            .Delete
            .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
            xlBetween, Formula1:=StringOfNames
            .IgnoreBlank = True
            .InCellDropdown = True
            .InputTitle = ""
            .ErrorTitle = ""
            .InputMessage = ""
            .ErrorMessage = ""
            .ShowInput = True
            .ShowError = True
        End With
    End Sub
    

    在您的情况下,您将逐行处理 myList,通过连接符合您条件的名称来构建 StringOfNames。

    【讨论】:

    • 既然绝对可以用 Excel 公式完成,我想尽可能避免使用 VBA。我尝试使用 VLOOKUP() 但它没有被解释为数据验证范围的有效数组。也许我可以研究一个动态命名范围,但我不知道如何以及在哪里设置我的条件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多