首页 文章

使用动态命名范围进行级联数据验证的问题

提问于
浏览
2

我正在使用带有数据验证的两个单元格 - 第一个单元格(E9)只是根据A2:A6范围创建一个下拉菜单,第二个单元格(E10)验证使用源INDIRECT(E9),它将始终引用到五个不同命名范围之一 .

当我修改了命名范围(即A2:A250)时,第二个下拉工作,但我真的需要动态范围,到目前为止我一直使用以下“源”公式创建命名范围:

=OFFSET(LookupLists!$B$2,0,0,COUNTA(LookupLists!$B:$B),1)

其他范围仅在C-F列中完全相同 .

当我写出这个公式时,它突出显示屏幕上的正确区域,但是当下拉列表显示正在突出显示的确切区域时,单元格E10中的下拉按钮完全没有响应 .

作为注释,列表本身是使用数组公式和一些VBA代码创建的,以基于电子表格的另一部分创建排序的唯一列表,因此我无法使用表来创建范围,因为其他一些网站建议 .

2 回答

  • 2

    INDIRECT 不适用于动态范围 . 感谢这些家伙的解决方案:

    http://chandoo.org/forum/threads/passing-a-named-range-to-a-formula-with-indirect.5854/#post-32423

    首先,将模块插入到工作表中并粘贴到UDF中:

    Option Explicit
    
    Function RetrieveRangeForName(psRange As String) As String
        RetrieveRangeForName = Range(psRange).Address
    End Function
    

    那么你将需要一个辅助单元,因为我不认为UDF在数据验证对话框中有效 . 在E11中,输入 =RetrieveRangeForName(E9) .

    然后在数据验证中设置为List,您可以输入: =INDIRECT(E11)

  • 1

    它没有像here讨论的那样工作的原因是INDIRECT需要一个可以评估的字符串来提供引用 . 但是,您的命名范围已经是参考 . 从逻辑上讲,在INDIRECT中使用它的唯一方法是首先将它转换为字符串,然后使用UDF将其转换为:

    Function GetAddress(Name As String) As String
    Dim rng As Range, addr As String
    Set rng = Worksheets("Sheet1").Range(Name)
    addr = rng.Address
    GetAddress = addr
    End Function
    

    然后使用它来定义一个名为NewRange的范围: -

    =INDIRECT(GetAddress(Sheet1!$E$9))
    

    最后,这可以用于E10的验证(命名范围ListB在问题中定义,ListA等对应于列A到E) .

    enter image description here

相关问题