【问题标题】:Issue using Dynamic Named Ranges for Cascading Data Validation使用动态命名范围进行级联数据验证的问题
【发布时间】:2016-05-17 15:52:18
【问题描述】:

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

当我固定命名范围(即 A2:A250)时,第二个下拉菜单有效,但我确实需要动态范围,到目前为止,我一直在使用以下“源”公式创建命名范围:

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

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

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

请注意,列表本身是使用数组公式和一些 VBA 代码创建的,以根据电子表格的另一部分创建排序的唯一列表,因此我无法像其他一些一样使用表格来创建范围网站有建议。

【问题讨论】:

    标签: excel excel-formula


    【解决方案1】:

    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)

    然后在Data Validation中,设置为List,可以输入:=INDIRECT(E11)

    【讨论】:

      【解决方案2】:

      它不能像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)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-07
        相关资源
        最近更新 更多