将单元格与一系列单元格对进行比较
Compare cell against series of cell pairs
我正在尝试制作一个 LibreOffice 传播sheet 公式,该公式根据另一个输入列填充一个列,将每个输入与另一个 sheet 中定义的一系列范围对进行比较,最后输出基于匹配条件的符号。我有一系列范围指定一个 -
输出,另一个系列对应 +
,但并非所有输入都属于一个类别。我稍后将这个三元输出用于另一个表达式,我已经有了它。
我的问题变成了:如何在不详细说明每个单元格的单元格坐标的情况下针对每个范围对测试输入(即 OR(AND(">= $A", "< $B"), AND(">=$A", "<$B"), ...)
)?理想情况下,我可以指定一个数组来与 $A:$B
进行比较。将其写入 python 宏也可以,因为我不打算共享此文件。
我在 python 中写了一个非常快速的列表组合来说明我所追求的。这个片段将是一半,例如测试 -
资格,并且这些值可以被输入到输出符号的条件中:
>>> def cmp(f, r):
... return r[0] <= f < r[1]
>>> f = (1, 2, 3)
>>> ranges = ((2, 5), (4, 6), (3, 8))
>>> [any([cmp(i, r) for r in ranges]) for i in f]
[False, True, True]
这是一个小的 test example,具有真实的输入和真实的范围。
更改范围对,使它们位于从 A13 开始的两列中。确保它们已排序(数据 -> 排序)。
A B C
~~~~~~~~ ~~~~~~~~ ~
145.1000 145.5000 -
146.0000 146.4000 +
146.6000 147.0000 -
147.0000 147.4000 +
147.6000 148.0000 -
440.0000 445.0000 +
在每一行中,指定它是负数还是正数。为此,我在 C13 中输入了以下公式并向下填充。如果范围对不够一致,则手动输入 C13 及以下的值。
=IF(ISODD(ROW());"-";"+")
现在,在单元格 C3 中输入以下公式并向下填充。
=IFNA(IF(
VLOOKUP(A3;A:C;2;1) >= A3;
VLOOKUP(A3;A:C;3;1);
"None");"None")
该公式找到最接近的对,然后检查数字是否在该范围内。为了更好地测试,我还建议使用 145.7000
作为输入,如果我正确理解问题,这应该不会产生任何变化。
C 列中的结果:
-
+
None
None
编辑:
对于您提供的示例数据,以下公式会产生正确的结果,并且适用于 144.0 和 148.0 之间的任何值。
=IFNA(VLOOKUP(A3;A:C;3;1); "None")
但是,150.0 生成 -
,而 550.0 生成 +
。如果那不是你想要的,那么使用上面的公式有两个 VLOOKUP
表达式。
我正在尝试制作一个 LibreOffice 传播sheet 公式,该公式根据另一个输入列填充一个列,将每个输入与另一个 sheet 中定义的一系列范围对进行比较,最后输出基于匹配条件的符号。我有一系列范围指定一个 -
输出,另一个系列对应 +
,但并非所有输入都属于一个类别。我稍后将这个三元输出用于另一个表达式,我已经有了它。
我的问题变成了:如何在不详细说明每个单元格的单元格坐标的情况下针对每个范围对测试输入(即 OR(AND(">= $A", "< $B"), AND(">=$A", "<$B"), ...)
)?理想情况下,我可以指定一个数组来与 $A:$B
进行比较。将其写入 python 宏也可以,因为我不打算共享此文件。
我在 python 中写了一个非常快速的列表组合来说明我所追求的。这个片段将是一半,例如测试 -
资格,并且这些值可以被输入到输出符号的条件中:
>>> def cmp(f, r):
... return r[0] <= f < r[1]
>>> f = (1, 2, 3)
>>> ranges = ((2, 5), (4, 6), (3, 8))
>>> [any([cmp(i, r) for r in ranges]) for i in f]
[False, True, True]
这是一个小的 test example,具有真实的输入和真实的范围。
更改范围对,使它们位于从 A13 开始的两列中。确保它们已排序(数据 -> 排序)。
A B C
~~~~~~~~ ~~~~~~~~ ~
145.1000 145.5000 -
146.0000 146.4000 +
146.6000 147.0000 -
147.0000 147.4000 +
147.6000 148.0000 -
440.0000 445.0000 +
在每一行中,指定它是负数还是正数。为此,我在 C13 中输入了以下公式并向下填充。如果范围对不够一致,则手动输入 C13 及以下的值。
=IF(ISODD(ROW());"-";"+")
现在,在单元格 C3 中输入以下公式并向下填充。
=IFNA(IF(
VLOOKUP(A3;A:C;2;1) >= A3;
VLOOKUP(A3;A:C;3;1);
"None");"None")
该公式找到最接近的对,然后检查数字是否在该范围内。为了更好地测试,我还建议使用 145.7000
作为输入,如果我正确理解问题,这应该不会产生任何变化。
C 列中的结果:
-
+
None
None
编辑:
对于您提供的示例数据,以下公式会产生正确的结果,并且适用于 144.0 和 148.0 之间的任何值。
=IFNA(VLOOKUP(A3;A:C;3;1); "None")
但是,150.0 生成 -
,而 550.0 生成 +
。如果那不是你想要的,那么使用上面的公式有两个 VLOOKUP
表达式。