Excel 基于vlookup设置下拉值
我有一个工作表Excel 基于vlookup设置下拉值,excel,validation,Excel,Validation,我有一个工作表UserEntry,有两列,Block和Address。我想基于另一个具有相同列名的工作表Validation来验证这两个。验证表上的数据如下: Block | Address --------------- 001 | 101 001 | 101.3 001A | 35 020-1 | 203 020-1 | 203.5 020-1 | 204.1 ... 大约有11000个不同的块,大约40000个块/地址对 我的目标是,如果用户在UserEntry工作表的Blo
UserEntry
,有两列,Block
和Address
。我想基于另一个具有相同列名的工作表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
列中输入一个值,Address
列中的下拉选项将更改为与该Block
对应
我尝试对以下公式使用自定义验证:
=VLOOKUP(UserEntry!A2,Validation!A2:B40000)
但这被认为是一个错误。我在各种论坛上看到了一些解决方案,其中包括设置命名范围,然后使用VLOOKUP()搜索适当的命名范围,但在这里似乎不起作用,因为我必须创建11000个命名范围
如何使
地址
的验证下拉列表包括与给定块
值对应的所有值 您可以为此使用动态命名范围
假设:
验证中!A:B
UserEntry
上,要验证的地址
单元格是ented块右侧的一个单元格
ValList
):
向所需单元格添加数据验证:允许列表
,源=ValList
间接
、地址
和单元格
获取相对于活动单元格的用户输入块的引用MATCH
和COUNTIF
获取验证列表中匹配块的位置和大小OFFSET
将返回范围设置为与输入块匹配的addreesses您可以为此使用动态命名范围 假设:
验证中!A:B
UserEntry
上,要验证的地址
单元格是ented块右侧的一个单元格
ValList
):
向所需单元格添加数据验证:允许列表
,源=ValList
间接
、地址
和单元格
获取相对于活动单元格的用户输入块的引用MATCH
和COUNTIF
获取验证列表中匹配块的位置和大小OFFSET
将返回范围设置为与输入块匹配的addreesses您没有提到VBA,但这里有一个使用它的解决方案 第一步 创建块地址关系的主表。确保已在
块上对其进行排序
。我使用了表1:
单元格E2
很重要。实际上,您不必在那里放置任何内容,但宏将使用它。单元格E3
仅用于显示,但您将立即使用公式(此处已注释,以便您可以查看)
步骤2
创建一个命名范围。中的公式引用:
是您在上面的E3
中看到的,您可以在这里看到对单元格E2
的引用。方便你的公式是
=OFFSET($A$1,MATCH($E$2,$A:$A,0)-1,1,COUNTIF($A:$A,$E$2),1)
步骤3
设置一个新的工作表(表2),在其中输入数据。为地址
列创建数据验证,如图所示
步骤4
打开VBA编辑器并将此代码粘贴到工作表2的模块中。如果愿意,可以删除Debug
语句。再次注意sheet 1
上对单元格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
享受。您的数据验证现在是上下文敏感的。示例:
您没有提到VBA,但这里有一个使用它的解决方案
第一步
创建块地址关系的主表。确保已在块上对其进行排序
。我使用了表1:
单元格E2
很重要。实际上,您不必在那里放置任何内容,但宏将使用它。单元格E3
仅用于显示,但您将立即使用公式(此处已注释,以便您可以查看)
步骤2
创建一个命名范围。中的公式引用:
是您在上面的E3
中看到的,您可以在这里看到对单元格E2
的引用。方便你的公式是
=OFFSET($A$1,MATCH($E$2,$A:$A,0)-1,1,COUNTIF($A:$A,$E$2),1)
步骤3
设置一个新的工作表(表2),在其中输入数据。为地址
列创建数据验证,如图所示
步骤4
打开VBA编辑器并将此代码粘贴到工作表2的模块中。如果愿意,可以删除Debug
语句。再次注意sheet 1
上对单元格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
享受。您的数据验证现在是上下文敏感的。示例:
我采用了这种方法,效果很好。谢谢你的详细解释,我采用了这种方法,效果很好。谢谢你的详尽解释。我选择了@andyholoday的解决方案,因为它需要更少的假设,因此足够灵活以满足我现有的需求。如果你仔细观察,你会发现它使用了相同的假设。关键的区别在于his使用VBA访问活动单元格,而我的使用单元格
功能,这是一个非常复杂的问题