带有条件语句的下拉列表

Dropdown list with a conditional statement

我在 B 列中有一些材料,其中一些在名为 Material_List 的 Table 定义中。在 D49 中,我试图编写一个条件语句,如果 B49 中的数据已经存在于 table 定义中,则打印 header 名称或 INDIRECT($49)。 C49 有独立的下拉列表,D49 将是从属的。

在 D49 中,我在 Data-->Data Validation-->Source=

中使用了以下公式
=IF(MAX((ISNUMBER(MATCH(Material_List;$B49;0))*COLUMN(Material_List)))=0;
INDIRECT($C49);
INDEX(Material_List[#Headers];1;MAX((ISNUMBER(MATCH(Material_List;$B49;0))*
COLUMN(Material_List))))))

使用允许=列表。但是它说错误“这个公式有问题”

直接在 D50 单元格中输入以下公式时,效果很好,但显然没有下拉列表。

=IF(MAX((ISNUMBER(MATCH(Material_List;$B50;0))*COLUMN(Material_List)))=0;
INDIRECT($C50);
INDEX(Material_List[#Headers];1;MAX((ISNUMBER(MATCH(Material_List;$B50;0))*
COLUMN(Material_List))))))

我正在尝试根据上述条件构建下拉列表。谁能告诉我我的公式有什么问题?

我认为你的公式的主要问题是你不能在数据验证中使用 table 引用。

别问我为什么。我认为这只是一个尚未修复的突出 Excel 错误。请参阅此 link 了解更多信息:https://exceloffthegrid.com/using-an-excel-table-within-a-data-validation-list/

我发现解决此问题的最佳方法是创建一个命名范围,该范围引用您需要的 table 引用(“Material_List”和“Material_List[# Headers]" 在你的情况下)。然后,您可以在数据验证中使用这些命名范围,而不是直接使用 table 引用。

但是,我认为您的公式还存在其他问题。例如这部分:

MATCH(Material_List;$B50;0)

通常 MATCH 的格式为:

MATCH(<single value to look for>, <range to look in>, 0)

你似乎把它颠倒了,这意味着它应该总是 return 一个 #VALUE! 错误。

此外,我认为您不能在二维数组上使用匹配,因此如果您的“Material_List”table 不止是一列,那也会导致它 return 一个 #VALUE! 错误。

更新:

我处理依赖下拉菜单的方式如下。 我会创建一个类似于下面的“Material_List”table(可以在隐藏的 sheet 上):

然后我将创建 3 个命名范围。 一个用于 table body 范围,称为“MaterialList_TblRange”:

=Material_List

一个用于 table header 范围,称为“MaterialList_TblHeaderRange”:

=Material_List[#Headers]

还有一个是指相关的下拉选项,称为“DropDownOptions”(这是迄今为止最复杂的部分):

=INDEX(MaterialList_TblRange,1,MATCH(Sheet1!$B23,MaterialList_TblHeaderRange,0)):INDEX(MaterialList_TblRange,COUNTA(INDEX(MaterialList_TblRange,1,MATCH(Sheet1!$B23,MaterialList_TblHeaderRange,0)):INDEX(MaterialList_TblRange,ROWS(MaterialList_TblRange),MATCH(Sheet1!$B23,MaterialList_TblHeaderRange,0))),MATCH(Sheet1!$B23,MaterialList_TblHeaderRange,0))

稍后我会解释这是做什么的。

最后一步是在我们想要列表的地方设置数据验证。

我们希望主列表出现的地方,我们可以简单地输入:

=MaterialList_TblHeaderRange

被告下拉验证可以输入为:

=DropDownOptions

这是结果:

现在回到长长的“DropDownOptions”命名范围公式...

基本上,我们使用 INDEX:INDEX 到 select 我们要在下拉列表中使用的范围内的 first/last 单元格。

第一个INDEX:

=INDEX(MaterialList_TblRange,1,MATCH(Sheet1!$B23,MaterialList_TblHeaderRange,0))

只需 select 列中 header 与第一个下拉列表中的 selection 匹配的第一个单元格。

第二个索引做同样的事情,除了它不是 select列中的第一个单元格,而是计算包含文本的单元格的数量并将其用作范围中的最后一个单元格。

这确实意味着我们在这个 table 中不能有任何空隙,否则可能会漏掉最后一个选项。

我希望这是有道理的。