尝试粘贴此进入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秒。一个简单的公式可能是可能的,但是填充大型数据集的效率会很低。
耶!我希望配方大师能够提出一些不需要全面的VBA解决方案的东西。 ROW(i)'在'FREQUENCY'函数中如何工作以检查下一个头部发生(我发现它确实使数组成长,但不知道“-ROW(i)'意味着什么为数据数组)? – Zairja 2012-08-10 13:15:12
该死的,这个网站充满了天才! lori_m,我得寄给你一个蛋糕或者你送给我的所有帮助! Trully赞赏! – tracer 2012-08-10 14:48:34
我很高兴这有帮助,它花了一段时间才弄清楚,并且使用函数只是一个有趣的挑战 - 一个VBA解决方案肯定会更容易遵循,但可能也会更长。 @Zairja:ROW前面的'-'确保频率计数与输出数组中的标题位于同一行。 – 2012-08-10 15:43:06