Excel 查找公式在 OpenOffice Calc 中不起作用

Excel lookup formula not working in OpenOffice Calc

我最近使用名为 gnumeric 的命令行实用程序将名为 template.xlsx 的文件转换为 template.ods。除以下公式外,所有公式均已正确转换:

=LOOKUP(2,1/(INDIRECT(CONCATENATE("Import!$F$",Q3,":$F$",M3))>=(S3)*VALUE(SUBSTITUTE($S,"LOOKUP FACTOR x",""))),INDIRECT(CONCATENATE("Import!$B$",Q3,":$B$",M3)))

这个公式在某种程度上很长,但为了保持简短,我有 2 个 sheet,一个叫做 Import,另一个叫做 Lookup。我想 return 特定范围内的 last 值(并匹配其在另一个范围内的行)大于或等于 S3 中的值相乘通过 LOOKUP FACTOR x,例如如果是 LOOKUP FACTOR x2S3 中的值乘以 2。

我发现 OpenOffice Calc 从另一个 sheet 访问范围的方式不同于 Excel 确实如此,因此我将公式重写为:

=LOOKUP(2;1/(INDIRECT(CONCATENATE("$Import.$F$";Q3;":$F$";M3))>=(S3)*VALUE(SUBSTITUTE($S;"LOOKUP FACTOR x";"")));INDIRECT(CONCATENATE("$Import.$B$";Q3;":$B$";M3)))

特此将 sheet 名称从 Import!$F$ 更改为 $Import.$F$$B$.

列也是如此

当我运行这个公式时,OpenOfficereturn出现错误#DIV/0!

所以,如果我将公式分成各个部分:

每当我在单独的单元格中执行它们时,我在两个 spreadsheet 程序中得到相同的结果,这意味着它们单独执行 WORK。这让我相信问题出在 LOOKUP.

在上面的例子中,我使用 INDIRECT 的原因是因为单元格 Q3M3 都引用了范围的开始和结束:

Q3 包含:

{=MIN(IF($Import.$A:$A48576=A3;ROW($Import.$A:$A48576)-ROW(INDEX($Import.$A:$A48576;1;1))+1))}

M3 包含大致相同但使用 MAX:

{=MAX(...)}

这些将return 数组数组开始和结束的索引位置。假设 A3 等于 Apple,那么 Q3 将 return Apple 第一次出现的行,而 Q3 将 return AppleColumn A 中最后一次出现的行。

值得重申的是,所有 公式都有效,但 LOOKUP 除外,这意味着上面的 单元格引用 B3M3 return 正确的索引位置(或行)。还值得一提的是,该公式确实适用于 Excel.

有谁知道为什么 LOOKUP 公式在 OpenOffice 中不起作用?

如果没有 LOOKUP,可以用其他方式完成吗?

不知道它在 Excel 中是如何工作的,但在 Calc 中,如果左边的值大于或等于右边的值,>= 简单地 return 为真正确的。所以听起来我们需要添加一个 IF 语句来完成您的要求。

以下 array formula 查找条件 return 为真的最高行。然后它从该单元格中获取值。

=INDIRECT("Import.F"&MAX(IF(INDIRECT(CONCATENATE("$Import.$F$";Q3;":$F$";M3))>=S3*VALUE(SUBSTITUTE($S;"LOOKUP FACTOR x";""));ROW(INDIRECT(CONCATENATE("$Import.$F$";Q3;":$F$";M3)));0)))

细分:

  • INDIRECT( - 从该单元格中获取值
  • "Import.F"& - 这加上该行就是我们正在寻找的地址
  • MAX( - 获取有效的最高行号,因为我们想要范围
  • 中的最后一个值
  • IF( - 如果值大于或等于,则 return 行号,否则 return 零
  • 间接(连接("$Import.$F$";Q3;":$F$";M3))>=S3*VALUE(SUBSTITUTE($S$1;"LOOKUP FACTOR x";"")) - return如果值大于或等于则为真,否则为假
  • ;ROW(INDIRECT(CONCATENATE("$Import.$F$";Q3;":$F$";M3)) - 获取我们当前所在的行看着。这可以缩短为 CREATEARRAY(Q3;M3) 通过实现一个用户定义的函数,该函数 的行号。
  • ;0 - return 行号如果不大于或等于
  • 则为零