0

快照

我再次在这里,为这个伟大的社区寻求帮助。我希望有一天我能像你一样报答你。

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

这就是我提出问题的方式:

  • 如果一个数字是负数/或有一个 A(A 行中的数字总是负数);

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

    • 如果有 MATCH,则输出已匹配的 F 的 ID(第 1 列)的值,然后,输出已匹配的 A 的 ID

  • 如果不是,则不执行任何操作或放置 0。

问题是:

  • 它需要循环,因为负值可以在正值之后;

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

我试图根据我提出的其他问题的提示和代码来修改和创建自己的解决方案,但没有成功。

非常感谢!

4

2 回答 2

2

尝试将其粘贴到 VBE 的即时窗口中,然后按 Enter:

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和节长度的中间结果,当范围名称(id)、(value) 和(match) 扩展到 40,000 行时l,大约需要 3-4 秒。一个更简单的公式是可能的,但填充大型数据集会非常低效。ivm

于 2012-08-10T10:46:16.180 回答
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我们对and使用绝对引用,因为当公式被拖入其他单元格时,MATCH我们不想查看A3:A7,等。A4:A8只有被比较的值及其对应的 ID 应该是相对的(A2/ B2),因为我们希望每一行都改变它。

这是它的外观。请记住,由于我的值来自A1:B6我的公式,因此将更改为INDEX($A$1:$A$6...MATCH(B1*-1,$B$1:$B:$6,0)...

特大号

于 2012-08-09T14:11:17.593 回答