如何在Excel VBA中创builddynamic依赖列表?

我需要在Excel中创build两个下拉列表。 第二个是依赖于第一个。 所以我有dynamic数据(我会不断变换车辆和引擎):

在这里输入图像说明

我想要的第一个下拉列表是显示车辆。 第二个将显示可用于该车辆的引擎。

我已经通过互联网看了,build议是为每个车辆创build一个名称范围,但我希望有一个像VlookUp更好的解决scheme,将返回一个列表。

我正在使用以下方式将车辆和发动机置于名称范围内:

Private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target, Columns("B:B")) Is Nothing Then Exit Sub Dim lRow As Integer lRow = Range("B" & Rows.Count).End(xlUp).Row Range("B3:B" & lRow).Name = "VehList" Range("C3:C" & lRow).Name = "CalList" 

对于简单情况,您不需要VBA或定义的名称。

考虑:

在这里输入图像描述

我们有一个A1的下拉select水果 。 我们要在A2中设置一个下拉菜单来显示正确的子列表。

我们点击A2并用List选项设置DV ,并在Source中select以下公式

 =IF(A1="fruit",C1:C4,IF(A1="dog",D1:D4,E1:E4)) 

在这里输入图像说明

在主下拉菜单中只有三个选项。 如果您的情况在主下拉菜单中有太多的选项, IF()的嵌套可能是一个限制。

使用参考单元名称,dynamic参考单元名称和一些数据validation列表,我们可以完成这…

一个示例表格:

 Vehicle Engines V01 V01E01 V01E02 V01E03 V01E04 V01E05 V01E06 V01E07 V02 V02E01 V02E02 V02E03 V02E04 V02E05 V02E06 V03 V03E01 V03E02 V03E03 V03E04 V04 V04E01 V04E02 V04E03 V04E04 V04E05 V05 V05E01 V05E02 V05E03 V05E04 V05E05 V05E06 V06 V06E01 V06E02 V06E03 V06E04 V06E05 V06E06 V06E07 V07 V07E01 V07E02 V07E03 V07E04 V08 V08E01 V08E02 

垂直说明的车辆types和其相关的引擎水平

我将名为“Vehicle”的单元格命名为“VE”,然后使用以下公式在Cell $ C $ 12中使用数据validation创build第一个下拉列表:

= OFFSET(VE,1,0,COUNTA(OFFSET(VE,1,0,10,1)),1)

然后我创build了一个名为“VItem”的dynamic命名范围,它具有以下公式:

= INDEX(OFFSET(VE,1,0,10,1),MATCH($ C $ 12 OFFSET(VE,1,0,10,1),0))

因此VItem被指定为包含在第一个下拉框中指定的车辆的单元格

对于第二个下拉框,我使用下面的公式再次使用数据validation:

= OFFSET(VITEM,0,1,1,COUNTA(OFFSET(VITEM,0,1,1,10)))

一些注意事项:列表的大小取决于偏移量内指定范围内有多less个非空白单元格(在此代码中使用了一组10×1单元格)。 自动resize时,车辆列表应垂直连续,水平列出的引擎应再次连续

车辆名称必须是唯一的,所以“VItem”被正确分配