在这里我再次,要求在这个伟大的社会帮助。 我希望我能retribute为你做了一天多。
在图片中的第4列(d)是预期的输出。
这是我如何把这个问题:
这些问题是:
它需要循环,因为负值都会受到积极的后;
搜索必须包含头之间。
我试图从我放在其他问题的技巧和代码修改和创建我自己的解决方案,但没有成功..
非常感谢!
尝试粘贴此进入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
和需要大约3-4秒时的范围名称i
(ID), v
(值)和m
(匹配)延伸到40000点的行。 这样做的一个简单的公式是可能的,但是这将是非常低效的向下填充的大型数据集。
这是公式我会用。 请注意,你必须明确地引用这些范围的标头。 您可能要定义命名范围,以避免错别字和方便阅读。 此公式将被放入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),则在一个行的第一列具有匹配正值返回值。 我们使用的绝对引用INDEX
和MATCH
,因为我们不想看A3:A7
, A4:A8
等当公式被拖累到其他细胞。 只有值进行比较和其相应的ID应该是相对的( A2
/ B2
),因为我们希望的是改变每行。
下面是它的外观。 请记住,因为我的价值观是从A1:B6
我的公式将改为INDEX($A$1:$A$6...MATCH(B1*-1,$B$1:$B:$6,0)...