基于连接参考数据的动态数据验证

Dra*_*nna 5 excel vba excel-formula

我无法找到正确的公式来验证基于“连接”参考数据和实际数据的数据。

我在参考表中有两个参考数据组:

水果ID 水果名称 篮子ID 篮子类型 水果ID
1 苹果 BAS-1 10 1
2 香蕉 BAS-1 10 2
3 菠萝 BAS-1 20 1
BAS-2 10 2

参考FRUIT了可用数据。参考BASKET了可用的篮子,但有一条规则规定每个篮子中只允许放置一些水果。上表旨在明确:

  • 有 3 种水果可供选择,由 ID 标识
  • 有 2 个篮子可供选择,由复合 [ID、类型] 标识
  • 每个篮子都有一组有限的可选水果
    • [BAS-1, 10] 可以选择苹果和香蕉
    • [BAS-1, 20]可选择苹果
    • [BAS-2, 10] 可以选择香蕉

然后,我在另一张表中拥有数据,用户应该能够在其中进行交互,并且我希望数据验证通过下拉列表仅显示上下文中允许的值。例如:

篮子ID 篮子类型 水果
1 BAS-1 10 X
2 BAS-1 20 X
3 BAS-2 10 X

我的目标是在列中设置一个下拉FRUIT列表,仅允许 row_1 选择 Banana 和 Apple,row_2 选择 Apple,row_3 选择 Banana。我还没有找到一种方法来加入数据来显示实际的水果名称。到目前为止我得到的最接近的是这个公式:

=OFFSET(FRUIT; MATCH(BASKET_ID; REFS_BASKET_ID ; 0) - 1; 0; COUNTIF(REFS_BASKET_ID; BASKET_ID); 1)
Run Code Online (Sandbox Code Playgroud)

但这个公式还不够,因为:

  • 它不考虑篮子类型,因为只有 ID/TYPE 对是唯一的。
  • FRUIT_ID当我需要时它会显示FRUIT_TYPE

我怎样才能实现这个目标?模板不是一个强烈的要求。

Jvd*_*vdV 3

这可能是一项艰难的任务。也许我不知道更好的选择,但我所做的是我首先在参考选项卡上创建了一个溢出的动态数组。然后我将此数据引用为自定义列表数据验证。它看起来像:

在此输入图像描述

公式为N2

=IFERROR(DROP(REDUCE(0,I2:I4,LAMBDA(x,y,HSTACK(x,LET(z,TOROW(FILTER(F2:F5,(D2:D5=INDEX(J2:J4,y))*(E2:E5=INDEX(K2:K4,y)))),FILTER(B2:B4,MMULT(N(A2:A4=z),SEQUENCE(COUNT(z),,,0))))))),,1),"")
Run Code Online (Sandbox Code Playgroud)

然后我选择L2:L4并添加了自定义参考:

在此输入图像描述

现在,我们可以选择每个单元格,它将有自己的自定义下拉列表:

在此输入图像描述

我一开始尝试将错误保留在溢出数组中,并尝试TOCOL()在源中使用,但是 Excel 似乎不允许这样做。因此,您将留下一些空字符串值。

希望其他人有一个更简单的解决方案供您使用=)


编辑:

同样的事情,更大的输入列表:

在此输入图像描述

  • 哇,我考虑使用命名的 lambda 类似 `=LAMBDA(x,y,XLOOKUP(FILTER(E2:E5,(C2:C5=x)*(D2:D5=y)),A2:A4,B2: B4))(@J:J,@K:K)` 但是在命名它时它可以在单元格中工作,但是在下拉列表中引用该名称将不起作用。这是一个很好的公式解决方案,但我认为要获得真正干净的解决方案,我们需要 VBA。也许我们可以对索引值进行排序,以使空白出现在底部? (2认同)
  • @JvdV,谢谢,这是一个非常好的答案!尝试您的示例后,我在实际数据上进行了尝试,但是当范围大于数据时,不会生成此溢出数组,这似乎使工作表非常限于预定义的数据集,或者也许我的适应是不正确的。我尝试了“间接”范围和大范围。但无论如何,溢出的表可能不足以容纳可能有数千种不同“水果”和“篮子”的数据 (2认同)
  • @pb,刚刚发现只有一个空字符串(请参阅最新的 GIF,当我单击 ROW 5 时)。如果超过 1,数据验证列表似乎会自动删除。那么现在对答案非常满意! (2认同)