返回与另一列中的定义值匹配的一列中的选定值

时间:2013-04-05 23:30:58

标签: arrays excel vba pivot-table array-formulas

我希望能够输入任何Dept#代表单元格D2,并且已经在单元格A11,A12,A13等中有一个公式,它将自动填充Subaccount个数字,基于Dept#输入。每个单元一个Subaccount。示例:

http://i49.tinypic.com/5bhib.png

一直在看COUNTIF阵列似乎仍然无法弄明白,或者甚至可以在不使用VBA的情况下使用。

请注意我不使用数据透视表,也不使用带有下拉菜单的列表。此外,样本上的单元格F1到H7将位于另一个选项卡上,数据表会更大,列数更多。

4 个答案:

答案 0 :(得分:2)

OP明确指出“我不使用数据透视表”,但一般观点似乎是“走的路”:

SO15845224 example

答案 1 :(得分:1)

有可能,我认为您最好使用Index()Match()Small()Row()。这是一个混乱,这是你在A开始的A11栏中使用的内容:

{=INDEX($G$2:$G$9,MATCH(SMALL(IF($F$2:$F$9=$D$2,$F$2:$F$9,MAX($F$2:$F$9)+1)+
   ROW($F$2:$F$9)/100000,ROW()-10),$F$2:$F$9+ROW($F$2:$F$9)/100000,0))}

注意:我忘了提及上面的 NEEDS 作为数组公式输入。

<强>结果: Output

说明:请记住以下说明的步骤是虚拟的。

  1. 第一步是只保留感兴趣的部门,并将其他部门设置为比列表中任何其他部门更大的其他部分。我使用了Max() + 1。不能在单元格中使用以下内容。

    IF($F$2:$F$9 = $D$2, $F$2:$F$9, MAX($F$2:$F$9) + 1)
    
  2. 更改 Dep#的列表,因此使用current_row_number / 100000时没有相同的内容。

    ... + ROW($F$2:$F$9) / 100000
    
  3. 如果您在第11行,这将是第一个有效的部门编号(如果在ROW()-10A11会给您1),现在列表中有行号,第一个将是第2行。Small()函数将为您提供最小的x:

    {=SMALL(IF($F$2:$F$9=$D$2,$F$2:$F$9,MAX($F$2:$F$9)+1)+
        ROW($F$2:$F$9)/100000,ROW()-10)}
    
  4. 使用Match()现在可以获取x值的行。

    {=MATCH(SMALL(IF($F$2:$F$9=$D$2,$F$2:$F$9,MAX($F$2:$F$9)+1)+
        ROW($F$2:$F$9)/100000,ROW()-10),$F$2:$F$9+ROW($F$2:$F$9)/100000,0)}
    
  5. 现在,您所有相关部门的行都使用Index函数检索相应的子帐户。

    {=INDEX($G$2:$G$9,MATCH(SMALL(IF($F$2:$F$9=$D$2,$F$2:$F$9,MAX($F$2:$F$9)+1)+
        ROW($F$2:$F$9)/100000,ROW()-10),$F$2:$F$9+ROW($F$2:$F$9)/100000,0))}
    

答案 2 :(得分:0)

不确定这是多功能的,但对于提供的样本似乎没问题,所以至少可能是您愿意接受的指针:

A11中输入=VLOOKUP($D$2,F1:$G$8,2,FALSE)(根据您的表位于其他标签上进行调整)。这假设每个部门#总会至少有一个子帐户,因此比A12的公式(要复制到A19)稍微简单一些:

  

= IFERROR(VLOOKUP($ D $ 2,INDIRECT(“F”&amp; MATCH(A11,G:G,0)+ 1&amp;“:$ G $ 8”),2,FALSE),“”)

我认为这证明了您的要求可以得到满足,但我承认可能需要进行一些调整。

答案 3 :(得分:0)

我的另一个答案似乎适用于@glh使用的样本数据,所以希望两者都可行!但是你(在我看来明智地)对建议开放,我会说比这两个答案中的复杂公式更好的是建立一个单独的表,比如Row1每个Dept#在一个单独的列中,在每个Dept#enter下面(主要是一个'一次性')该部门的每个可能的子帐户。然后填充A11:A19非常更容易,我认为你会有更好的控制权,因为这将基于预期的组合而不是实际的组合。

但我的偏好仍然可能是数据透视表。