如何在Excel VBA中创建动态依赖列表?

时间:2016-04-11 10:22:21

标签: excel vba excel-vba

我需要在Excel中创建两个下拉列表。第二个依赖于第一个。所以我有动态数据(我将不断改变车辆和引擎):

enter image description here

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

我已经浏览了互联网,建议为每辆车创建一个名称范围,但我希望有一个更好的解决方案,如VlookUp,它会返回一个列表。

我使用以下内容将车辆和引擎放入名称范围:

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" 

2 个答案:

答案 0 :(得分:2)

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

考虑:

enter image description here

我们在 A1 中有一个下拉列表,可以选择 fruit dog cat 。我们想在 A2 中设置一个下拉列表,以显示正确的子列表。

我们点击 A2 并使用列表选项设置 DV 以及来源中的以下公式: < / p>

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

enter image description here

这仅适用于主要下拉菜单中的三个选项。如果您的案例在主要下拉菜单中有太多选项,则 IF() 的嵌套可能是一个限制。

答案 1 :(得分:2)

使用参考单元名称,动态参考单元名称和一些数据验证列表,我们可以实现这一目标......

示例表:

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                  

垂直表示的车辆类型及其水平相关引擎

我将具有&#39; Vehicle&#39;写在&#39; VE&#39;中,然后使用以下公式在Cell $ C $ 12中使用数据验证创建第一个下拉列表:

  

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

然后我创建了一个名为&#39; VItem&#39;的动态命名范围。具有以下公式:

  

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

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

对于第二个下拉框,我再次使用以下公式进行数据验证:

  

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

一些注意事项:列表的大小取决于偏移量内指定范围内存在的非空白单元格数(在此代码中使用了10x1单元格集)。由于它是自动调整大小,车辆列表应垂直连续,水平列出的引擎应该是连续的

车辆名称必须是独一无二的,以便&#39; VItem&#39;已正确分配