Excel 使用命名范围进行条件数据验证

Excel 使用命名范围进行条件数据验证,excel,validation,excel-formula,named-ranges,Excel,Validation,Excel Formula,Named Ranges,我有一个名为“myList”的命名范围,定义为Sheet1的第1行到第200行。共有20列,前8列为员工信息,后12列为0或1,用于每个月包含员工 现在,我想创建一个下拉菜单,如果在我的命名范围的第9-20列中至少有一个1,它将显示员工的姓名 现在,我使用以下公式作为数据验证:=INDEX(myList,1)并显示myLast中的每个名称,无论第9-20列中是否有1 如何更改此设置,以便在创建下拉菜单的数据验证中显示的唯一名称是myList第1列上的名称,其中myList第9-20列的相应总和(

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

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

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


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

您可以编写一个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,通过连接符合条件的名称来构建StringOfName。

以下是一个:
在最后一列之后创建一列求和,并计算每行的总和。假设数据表中的列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+enter来计算公式



然后在Z1中,根据列X中过滤的名称创建下拉列表。
请将31替换为201,因为如果是这样,您将有200行加上一行标题。我在示例表中使用了30项。
告诉我它是否有效。
***已更新***


很抱歉公式中有错误,现已更正。这是修正后的公式。它现在运行良好。我还更改了下载链接。

因为它肯定可以用Excel公式完成,所以我希望尽可能避免VBA。我尝试使用VLOOKUP(),但它没有被解释为数据验证范围的有效数组。也许我可以研究一个动态命名范围,但我不知道如何以及在哪里设置条件。我不得不下载你的示例来检查代码中的错误,但看起来你也有同样的问题。在您的示例中,为什么name1不在筛选的名称中?既然V中的和是0,为什么这里的名字是30?然后我注意到name24和name25丢失了,而不是name23和name24。如果我从A1:A200和V1:V200范围开始,而不是从A2:A200和V2:V200范围开始,它确实可以工作。此外,列表将在末尾显示空白值。我尝试使用NA()而不是IFERROR()的第二个参数的空单元格,但是#N/A也显示在列表菜单中。已选中“忽略空白单元格”。所以对于列表,我只是使用了
=INDIRECT(“myList!$W$1:$W$”&myList!$X$2)
其中
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()。这只是为了数据验证,所以间接测试实际上只执行了一次,我不认为它真的会有那么大的区别。