2016-05-17 40 views
2

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

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

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

其他范围仅在CF栏中完全相同。

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

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

回答

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 

然后,你将需要一个辅助细胞,因为我不t认为UDF在“数据验证”对话框中工作。在E11中,输入=RetrieveRangeForName(E9)

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

+0

非常感谢,伟大的工作! – baelaelael

1

它不能像讨论here一样工作的原因是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