Excel动态下拉列表

时间:2016-01-14 04:05:47

标签: excel excel-formula

我有两个从数据库查询动态创建的表;第一个表是下拉列表的源,第二个表是我将通过数据验证应用下拉列表的表。第一张表:

enter image description here

和第二个表:

enter image description here

我所需要的,理想情况是通过Excel公式,是一个智能设计的下拉列表,仅显示与相关维度相关联的维度值。

因此在单元格B3:B10中,下拉列表将显示a,b,c。在单元格C3:C10中,下拉列表将显示1,2,3。在单元格D3:D10中,下拉列表将显示x,y,z。等等。

我需要这个是动态的,因为从现在起一周后我的数据库查询可能会返回需要遵循相同方法的第四个维度。

如果不写一些VBA,不确定这是否可能,但我想我会看到是否有人有任何创意。干杯!

2 个答案:

答案 0 :(得分:0)

您必须使用Name Manager=INDIRECT()公式来实现这一目标。
首先下载示例文件。 Sample File

请参阅此提示(由我)。它将帮助您逐步查看屏幕截图。 Link is here

现在,对于您的数据,您必须使用一些公式来在新数据到来时自动过滤数据。这样新数据就可以组织动态组合框。如果你不能那样做,我也可以帮你。然后与我分享您的样本工作簿。

答案 1 :(得分:0)

这很可能,但并不简单。有几种方法可以实现这一点,具体取决于您的要求,它需要的动态性以及数据的预期结构(正如我在评论中提到的那样)。

我将给出一个可能的解决方案,这个解决方案主要是动态的,并且是最简单的解释。您可以使用类似的逻辑使其全部动态化。

此解决方案将根据维度名称检索表#1中的数据(假设它未排序),并按表中给出的顺序返回值。

对于某些范围,我为了简单起见创建名称,有些是强制性的。为了遵循公式逻辑,您需要我使用的命名范围。

  1. 为表#1创建命名范围:(使用名称框或使用名称管理器Ctrl + F3):

    • 对于Dimension列中的数据: DimName = B3:B11
    • 对于列Dimenstion值: DimValue = C3:C11
  2. 在新工作表中创建维值列表:

    • 将尺寸名称放在B2 ="Customer"中。 (可以动态创建可用的维度名称,但我正在跳过此部分以简化)。
    • B3(数组公式 - Ctrl + Shift + Enter)=IFERROR(INDEX(DimVal,SMALL(IF(DimName=B$2,ROW(DimName)-ROW(INDEX(DimName,1))+1),ROWS(B$3:B3)),1),"")。此公式返回“客户”维度的第k个值。
    • 将B3复制到您认为需要的行数。假设B4:B10,那么B3:B10将具有数组公式。由于IFERROR功能,第一个单元格将具有可用值,其余单元格将为空。
    • 在B1中,我们将使用公式=SUMPRODUCT(--(B3:B10<>"")计算可用值。
    • 对C列和D列中的“产品”和“地理位置”执行相同操作。
  3. 为列表创建动态命名范围:(使用名称管理器Ctrl + F3)

    • 对于列表的数据 DimLists = B3:D10。
    • 对于列表标题 DimListHeaders = B2:D2。
    • 对于列表的计数 DimListCounts = B1:D1。
    • *这些名称对于数据验证必须在另一张表中使用。
  4. 设置表#2数据验证列表来源:

    • 在表#2中选择B3:B10。
    • 转到数据&gt;数据验证,然后选择允许:列表
    • 将以下公式放入来源:=OFFSET(INDEX(DimLists,,MATCH(B$2,DimListHeaders,0)),,,INDEX(DimListCount,,MATCH(B$2,DimListHeaders,0)))。此公式根据表#2中的列标题在 DimLists 中查找正确的列表,并根据列表计数设置返回的范围高度。
  5. 希望这有帮助。