设置基于vlookup的下拉值

sig*_*gil 1 validation excel

我有一个工作表UserEntry2列,BlockAddress.我想基于Validation具有相同列名的另一个工作表验证这两个.Validation表格上的数据如下:

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

...
Run Code Online (Sandbox Code Playgroud)

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

我的目标是,如果用户Block在工作UserEntry表的列中输入值,则列中的下拉选项Address将更改为与之对应Block.

我尝试使用此公式的自定义验证:

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

但那评估错误.我在各种论坛中看到了一些涉及设置命名范围的解决方案,然后让VLOOKUP()搜索适当的命名范围,但似乎这不起作用,因为我必须创建11000个命名范围.

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

and*_*day 6

你没有提到VBA,但这是一个使用它的解决方案.

步骤1

创建块地址关系的主表.确保按此排序Block.我用了Sheet1:

主表

细胞E2很重要.你实际上不必在那里放任何东西,但宏将使用它.Cell E3仅用于显示,但您将使用公式(此处已注释掉,以便您可以看到它).

第2步

创建命名范围.公式Refers to:就是你在E3上面看到的,你可以在E2这里看到对单元格的引用.方便的公式是

=OFFSET($A$1,MATCH($E$2,$A:$A,0)-1,1,COUNTIF($A:$A,$E$2),1)
Run Code Online (Sandbox Code Playgroud)

动态范围

第3步

设置一个新工作表(Sheet2),其中将发生数据输入.为Address列创建数据验证,如图所示.

在此输入图像描述

第4步

打开VBA编辑器并将此代码粘贴到模块中Sheet2.Debug如果您愿意,可以删除该声明.还是要注意引用单元格E2Sheet1:

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
Run Code Online (Sandbox Code Playgroud)

第5步

请享用.您的数据验证现在对上下文敏感.例子:

在此输入图像描述 在此输入图像描述