使用dynamic命名范围进行级联数据validation

我正在使用数据validation的两个单元格 – 第一个单元格(E9)只是基于范围A2:A6创build一个下拉菜单,第二个单元格(E10)validation使用源INDIRECT(E9),它将始终引用五个不同的命名范围之一。

当我命名的范围是固定的(即A2:A250)时,第二个下拉菜单起作用了,但是我真的需要这个范围是dynamic的,到目前为止我一直用下面的“源”公式创build命名范围:

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

与其他范围是完全相同的只有在CF栏。

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

需要注意的是,这些列表本身是使用数组公式和一些VBA代码创build一个基于电子表格另一部分的sorting的唯一列表,所以我一直无法使用表格来创build其他网站所build议的范围。

INDIRECT不适用于dynamic范围。 信贷给这些家伙的解决scheme:

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在Data Validation对话框中工作。 在E11中,input=RetrieveRangeForName(E9)

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

这里讨论不起作用的原因是,INDIRECT期望一个string,它可以评估以提供参考。 但是你的命名范围已经是一个参考。 从逻辑上讲,在INDIRECT中使用它的唯一方法是先将它转换成一个string,然后用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的validation中使用(命名范围列表B被定义为在问题中,ListA等相应地用于列A到E)。

在这里输入图像说明