设置基于vlookup的下拉值

时间:2012-05-18 18:21:54

标签: excel validation

我的工作表UserEntry有两列,BlockAddress。我想基于另一个具有相同列名的工作表Validation来验证这两者。 Validation表单上的数据如下:

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

...

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

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

我尝试使用以下公式进行自定义验证:

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

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

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

2 个答案:

答案 0 :(得分:6)

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

第1步

创建块地址关系的主表。确保在Block上排序。我用了Sheet1:

Master Table

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

第2步

创建命名范围。 Refers to:中的公式就是您在上面的E3中看到的公式,您可以在此处看到对单元格E2的引用。方便的公式是

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

Dynamic Range

第3步

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

enter image description here

第4步

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

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步

享受。您的数据验证现在对上下文敏感。例子:

enter image description here enter image description here

答案 1 :(得分:4)

您可以使用动态命名范围。

假设:

  1. 验证列表按A..Z
  2. 排序
  3. 验证列表位于Validation!A:B
  4. 范围内
  5. 验证清单包括第1行的标题
  6. 在工作表UserEntry上,要验证的Address单元格是ented Block
  7. 右侧的一个单元格
  8. 在Excel 2010上试用并测试
  9. 创建命名范围以用作验证来源(我使用了名称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)
    

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

    1. 使用INDIRECTADDRESSCELL来引用相对于活动单元格输入 Block 的用户
    2. 使用MATCHCOUNTIF获取验证列表中匹配的 Blocks 的位置和大小
    3. 使用OFFSET设置与输入匹配的 addreesses 的返回范围