1

我有一个UserEntry包含 2 列的工作表,Block并且Address. 我想根据另一个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.

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

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

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

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

4

2 回答 2

6

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

步骤1

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

主表

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

第2步

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

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

动态范围

第 3 步

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

在此处输入图像描述

第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 步

享受。您的数据验证现在是上下文相关的。例子:

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

于 2012-05-18T23:00:50.023 回答
4

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

假设:

  1. 验证列表按 A..Z 排序
  2. 验证列表在范围内Validation!A:B
  3. 验证列表包括第 1 行中的标题
  4. 在工作表上,要验证的单元格是输入右侧的一个单元UserEntryAddressBlock
  5. 在 Excel 2010 上试用和测试

创建一个命名范围以用作验证源(我使用了 name 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)

数据验证添加到所需的单元格: Allow List, Source=ValList

  1. 使用INDIRECT,ADDRESSCELL获取用户输入的Block相对于活动单元格的引用
  2. 使用MATCHandCOUNTIF获取验证列表中匹配块的位置和大小
  3. 用于OFFSET将返回范围设置为与输入匹配的地址
于 2012-05-18T22:57:01.933 回答