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

时间:2016-05-17 15:52:18

标签: excel excel-formula

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

当我修改了命名范围(即A2:A250)时,第二个下拉工作,但我真的需要动态范围,到目前为止,我已经使用以下&#创建命名范围34;源"式:

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

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

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

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

2 个答案:

答案 0 :(得分: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)

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

答案 1 :(得分: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