我再一次在这个伟大的社区寻求帮助。 我希望我能像你有一天那样做出贡献。
图片中的第4列(D)是预期输出。
这就是我提出问题的方法:
如果数字是负数/或有A(A行中的数字总是负数);
使用MATCH检查范围内是否有对应的(正)数字(标题之间);
如果MATCH输出已匹配的F的ID(第1列)的值,则输出已匹配的A的ID
如果没有,请不要做任何事情或放置0。
问题是:
需要循环,因为负值可以在正值之后出现;
搜索必须包含在标题之间。
我试图根据我提出的其他问题的提示和代码修改和创建我自己的解决方案,但没有成功..
非常感谢你!
答案 0 :(得分: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
的中间结果,并在范围名称{{{{}}时大约需要3-4秒1}}(id),i
(值)和v
(匹配)扩展到40,000行。可以使用更简单的公式,但填写大型数据集效率非常低。
答案 1 :(得分: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),则返回具有匹配正值的行的第一列中的值。我们对INDEX
和MATCH
使用绝对引用,因为当公式被拖入其他单元格时我们不想查看A3:A7
,A4:A8
等。只有被比较的值及其相应的ID应该是相对的(A2
/ B2
),因为我们希望每行更改一次。
这是它的外观。请注意,由于我的值来自A1:B6
,因此我的公式将更改为INDEX($A$1:$A$6...MATCH(B1*-1,$B$1:$B:$6,0)...