根据vlookup设置下拉值
我有一个工作表UserEntry
与2列, Block
和Address
。 我想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个命名范围。
如何使Address
validation下拉列表包含与给定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的命名范围。
假设:
- validation列表已分类A..Z
-
Validation!A:B
validation列表在范围内Validation!A:B
- validation列表包括第1行的标题
- 在图表
UserEntry
上,要validation的Address
单元是位于已设定Block
的右侧的一个单元格 - 在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
- 使用
INDIRECT
,ADDRESS
和CELL
来获得一个引用到相对于活动单元格inputBlock的用户 - 使用
MATCH
和COUNTIF
来获取validation列表中匹配块的位置和大小 - 使用
OFFSET
将返回范围设置为与enterd 块匹配的addrees