根据vlookup设置下拉值

我有一个工作表UserEntry与2列, BlockAddress 。 我想validation这两个基于另一个工作表Validation具有相同的列名称。 Validation表上的数据如下:

 Block | Address --------------- 001 | 101 001 | 101.3 001A | 35 020-1 | 203 020-1 | 203.5 020-1 | 204.1 ... 

大约有11000个不同的块,大约40000个块/地址对。

我的目标是,如果用户在UserEntry表单的Block列中input一个值, Address列中的下拉选项将更改为与该Block相对应。

我尝试使用这个公式的自定义validation:

=VLOOKUP(UserEntry!A2,Validation!A2:B40000)

但是,评估到一个错误。 我在各种论坛上看到了一些解决scheme,其中包括设置命名范围,然后使用VLOOKUP()search适当的命名范围,但似乎不能在这里工作,因为我必须创build11000个命名范围。

如何使Addressvalidation下拉列表包含与给定Block值对应的所有值?

你没有提到VBA,但这是一个使用它的解决scheme。

步骤1

创build一个Block-Address关系的主表。 确保这是sorting在Block 。 我用Sheet1:

主表

细胞E2是重要的。 你实际上并不需要放任何东西,但macros将使用它。 单元格E3仅用于显示,但您将使用公式(这是注释出来,所以你可以看到它)瞬间。

第2步

创build一个命名的范围。 这里的公式就是你在E3中看到的,你可以在这里看到对E2单元格的引用。 你方便的公式是

 =OFFSET($A$1,MATCH($E$2,$A:$A,0)-1,1,COUNTIF($A:$A,$E$2),1) 

动态范围

第3步

build立一个新的工作表(Sheet2)数据录入将发生。 为Address栏创build数据validation,如图所示。

在这里输入图像说明

步骤4

打开VBA编辑器并将此代码粘贴到Sheet2的模块中。 如果您愿意,可以删除Debug语句。 请再次注意Sheet1上对单元格E2的引用:

 Private Sub Worksheet_SelectionChange(ByVal Target As Range) Debug.Print "fired on " & ActiveCell.Address If Not Application.Intersect(Target, Range("B:B")) Is Nothing Then Sheets("Sheet1").Range("E2").Value = ActiveCell.Offset(0, -1).Value End If End Sub 

第5步

请享用。 您的数据validation现在是上下文相关的。 例子:

在这里输入图像说明在这里输入图像说明

你可以使用一个dynamic的命名范围。

假设:

  1. validation列表已分类A..Z
  2. Validation!A:Bvalidation列表在范围内Validation!A:B
  3. validation列表包括第1行的标题
  4. 在图表UserEntry上,要validation的Address单元是位于已设定Block的右侧的一个单元格
  5. 在Excel 2010上尝试和testing

创build一个命名的范围作为validation源(我已经使用名称ValList ):

 =OFFSET(Validation!$B$1,MATCH(INDIRECT(ADDRESS(CELL("row"),CELL("col")-1)),Validation!$A:$A,0)-1,0,COUNTIF(Validation!$A:$A,INDIRECT(ADDRESS(CELL("row"),CELL("col")-1))),1) 

数据validation添加到所需的单元格:允许List ,来源=ValList

  1. 使用INDIRECTADDRESSCELL来获得一个引用到相对于活动单元格inputBlock的用户
  2. 使用MATCHCOUNTIF来获取validation列表中匹配的位置和大小
  3. 使用OFFSET将返回范围设置为与enterd 匹配的addrees