2012-08-09 63 views
0

SnapshotExcel中 - 返回值,之后细胞已被匹配,报头

在这里,我再次请求帮助这个伟大的社区之间。 我希望我能像你有一天做的那样尽情发挥。

图中的第4列(D)是预期的输出。

这是我如何把这个问题:

  • 如果数字为负/或有A(在A行数始终为负值);

    • 使用MATCH来检查范围内(标题之间)是否有对应(正数)的数字;

    • 如果存在匹配输出已匹配的F ID(第一列)的值,然后,输出该已匹配

  • 如果A的ID没有,什么也不做,或将一个0

的问题是:

  • 它需要LOO p,因为负值可以在正值之后出现;

  • 搜索必须包含在标题之间。

我试图修改,并从我放在其他问题的技巧和代码创建自己的解决方案,但没有成功..

太谢谢你了!

回答

2

尝试粘贴此进入VBE立即窗口,按下回车键:

Names.Add "i", "=$A$1:$A$12": _ 
Names.Add "v", "=$B$1:$B$12": _ 
Names.Add "m", "=$D$1:$D$12": _ 
Names.Add "h", [IF({1},LOOKUP(ROW(i),ROW(i)/(v=INDEX(v,1))))]: _ 
Names.Add "l", [IF({1},LOOKUP(ROW(i),ROW(i)/(v=INDEX(v,1)),FREQUENCY(-ROW(i),IF(v=INDEX(v,1),-ROW(i),0))-1))]: _ 
[m]=[IF(COUNTIF(OFFSET(v,h,,l),"=-"&v),CONCATENATE("=",ADDRESS(ROW(i),COLUMN(i),4),"&"" AND ""&INDEX(",ADDRESS(h+1,COLUMN(i)),":",ADDRESS(h+l,COLUMN(i)),",MATCH(-",ADDRESS(ROW(v),COLUMN(v),4),",",ADDRESS(h+1,COLUMN(v)),":",ADDRESS(h+l,COLUMN(v)),",0))"),"")]: _ 
Names("h").Delete: _ 
Names("l").Delete 

的输出在问题的示例数据为:

D5 =A5&" AND "&INDEX($A$2:$A$6,MATCH(-B5,$B$2:$B$6,0)) 
D11 =A11&" AND "&INDEX($A$11:$A$12,MATCH(-B11,$B$11:$B$12,0)) 

:此方法使用命名数组来存储标头位置h和段长度l的中间结果,并且当范围名称i(id),v(值)和m(匹配)扩展到40,000行时需要大约3-4秒。一个简单的公式可能是可能的,但是填充大型数据集的效率会很低。

+0

耶!我希望配方大师能够提出一些不需要全面的VBA解决方案的东西。 ROW(i)'在'FREQUENCY'函数中如何工作以检查下一个头部发生(我发现它确实使数组成长,但不知道“-ROW(i)'意味着什么为数据数组)? – Zairja 2012-08-10 13:15:12

+0

该死的,这个网站充满了天才! lori_m,我得寄给你一个蛋糕或者你送给我的所有帮助! Trully赞赏! – tracer 2012-08-10 14:48:34

+1

我很高兴这有帮助,它花了一段时间才弄清楚,并且使用函数只是一个有趣的挑战 - 一个VBA解决方案肯定会更容易遵循,但可能也会更长。 @Zairja:ROW前面的'-'确保频率计数与输出数组中的标题位于同一行。 – 2012-08-10 15:43:06

1

这是我会使用的公式。请注意,您必须明确引用标题的范围。您可能需要定义命名范围以避免拼写错误并减轻可读性。这个公式将被放入D2(填充 - 拖动到D6)。

=IFERROR(IF(B2<0,INDEX($A$2:$A$6,MATCH(B2*-1,$B$2:$B$6,0),1) & " AND " & A2,""),"")

工作原理:IFERROR只是赶上#NA当没有比赛。如果值B2为负数(小于0),则返回具有匹配正值的行的第一列中的值。我们对INDEXMATCH使用绝对引用,因为当公式被拖入其他单元格时,我们不想查看A3:A7A4:A8等。只有被比较的值和相应的ID应该是相对的(A2/B2),因为我们希望对每一行都进行更改。

下面是它的外观。请记住,因为我的价值观是从A1:B6我的公式就变为INDEX($A$1:$A$6...MATCH(B1*-1,$B$1:$B:$6,0)...

XL

+0

谢谢,这很好。但是,我真的需要自动化标题部分,因为我有超过40,000行并逐一定义它们会花费很多时间 – tracer 2012-08-09 14:29:04

+0

您对VBA的熟悉程度如何? – Zairja 2012-08-09 14:37:39

+0

我可以做一些初学者的东西,但如果我不明白我会谷歌它.. – tracer 2012-08-09 14:47:28