我一直在Windows Excel 中开展项目,但现在我必须将其更改为 LibreOffice Calc ,函数返回#VALUE!
,但是有效通常在 Excel 。
这是函数(它搜索特定列和行中的值)
=IFERROR(INDEX($B$3:$B$1400; SMALL(IF(ISNUMBER((SEARCH($F$3;$B$3:$B$1400))*
(SEARCH($G$3;$D$3:$D$1400))); ROW($D$3:$D$1400)-MIN(ROW($D$3:$D$1400))+1;"");ROW(A21)));"")
以下是我在LibreOffice Calc中的Workheet aka SpreadSheet的样子
我在某处读到引号不应该在那里,所以我试图删除/替换它们并从一个单元格获得价值:
- 当我删除 引号“”时,它返回随机单元格值
- 当我替换 引号“”且数字 1 时,它返回了第一个人的值,但是在下一个单元格中(因为它应该找到每个具有特定名称的人,或者如果留下空白,它应该在文件中找到每个人。
答案 0 :(得分:1)
在Excel中,SEARCH
函数将匹配包含所有查找单元格的空白搜索单元格。在Calc中,作为搜索条件的空白单元格将返回错误。
要获得“如果搜索单元格为空白则返回所有”行为,您需要将搜索包装在IF
中,并返回一个数字(以便ISNUMBER
函数返回TRUE)搜索单元格为空白的情况:
IF($F$3<>"";SEARCH($F$3;$B$3:$B$1400);1) * IF($G$3<>"";SEARCH($G$3;$D$3:$D$1400);1)
因此,我们将在单元格F8中使用Ctrl
+ Shift
+ Enter
(因为这是一个数组公式)输入您的完整公式:
=IFERROR(INDEX($B$3:$B$1400;SMALL(IF(ISNUMBER(IF($F$3<>"";SEARCH($F$3;$B$3:$B$1400);1) * IF($G$3<>"";SEARCH($G$3;$D$3:$D$1400);1)); ROW($D$3:$D$1400) - MIN(ROW($D$3:$D$1400))+1;"");ROW(A1)));"")
复制并粘贴您需要的许多单元格。如果要粘贴到大量单元格,可以通过在名称框(公式栏左侧)中键入范围(例如F9:F1405
)并按Enter
来突出显示它们。
请注意,在早于4.4.4.6的LibreOffice版本中,IFERROR
函数不会抑制错误(请参阅bug 95226)。它应该在新版本中按预期工作。
IFERROR
和ISERROR
函数都通过此特定错误而不是返回TRUE或FALSE(似乎是OpenOffice和LibreOffice的当前版本中的错误 - 请参阅“问题”部分OpenOffice wiki页面https://wiki.openoffice.org/wiki/Documentation/How_Tos/Calc:_ISERROR_function#Issues)。
可能的解决方法是不将任何文本值传递给SMALL
函数。 (如果未找到匹配项,则上面的公式将空文本字符串传递给SMALL
函数,从而生成错误)。而不是""
我们将传递数组中的最后一个行号 - 为了使这个工作在范围内最底部的单元格,在这种情况下,行1398必须是一个空格(或者,如果可以使用工具→选项→OpenOffice Calc→查看→取消选中“显示零值”。
我们还要确保不要告诉SMALL
函数查找大于其提供范围大小的排名。像这样:
=INDEX($B$3:$B$1400;SMALL(IF(ISNUMBER(IF($F$3<>"";SEARCH($F$3;$B$3:$B$1400);1) * IF($G$3<>"";SEARCH($G$3;$D$3:$D$1400);1)); ROW($D$3:$D$1400) - MIN(ROW($D$3:$D$1400))+1;1398);MIN(ROW(A1),1398)))