将string转换为布尔运算符(<,<=,>,> =)
在单元格A1
,可以是<
, <=
, >
或>=
(string)。
在单元格B1
,有阈值的int值。
从A3
,有int的值。
+---+-----+----+ | | A | B | +---+-----+----+ | 1 | < | 15 | | 2 | | | | 3 | 10 | | | 4 | 20 | | | 5 | ... | | +---+-----+----+
A3
的值应该在B3
复制,当且仅当它遵守布尔运算符( A1
)和阈值( B1
)。 否则, B3
应该是#N/A
当然, A4
/ B4
, A5
/ B5
等也是一样的
在这个例子中, B3
应该是10
, B4
应该是#N/A
,因为10小于15,但是20不是。
这是我创造的一个很好的公式,但是这个公式很长(这是B3
):
=IF($A$1 = "<"; IF($A3 < $B$1; $A3; NA()); IF($A$1 = "<="; IF($A3 <= $B$1; $A3; NA()); IF($A$1 = ">"; IF($A3 > $B$1; $A3; NA()); IF($A3 >= $B$1; $A3; NA()))))
同样的更加消化的方式:
=IF( $A$1 = "<"; IF($A3 < $B$1;$A3; NA()); IF( $A$1 = "<="; IF($A3 <= $B$1; $A3; NA()); IF( $A$1 = ">"; IF($A3 > $B$1; $A3; NA()); IF($A3 >= $B$1; $A3; NA()) ) ) )
有没有更方便的方法来做这个工作? 从一个string到一个操作符的铸造将是伟大的,但是,我不知道任何编程语言能够做这样的东西:)
理想情况下,它应该是这样=IF($A3 $A$1 $B$1; $A3; NA())
…
试试这个公式
=IF(COUNTIF(A3,$A$1&$B$1),A3,NA())
请注意,这完全基于这篇文章 ,但它似乎适合在这里。 有两种方法可以做到这一点:使用命名的范围和UDF。 两种方式基本上都利用了Excel的“隐藏”评估function。
命名范围
要使用命名的范围,可以定义一个名称(在本例中,我使用了Compare
),并为其指定以下值(请注意,这些都是相对于我的表中的范围,因此您可能需要进行调整):
=EVALUATE("IF(" & A3 & $A$1 & $B$1 &"," & A3 & ",NA())")
请注意,范围似乎自动更新前面的工作表名称。
UDF
将以下内容添加为UDF:
Function Evalu(ByVal S As String) As String Evalu = Evaluate(S) End Function
然后input下面的公式:
=INT(IFERROR(Evalu("IF(" & A3 & $A$1 & $B$1 &"," & A3 & ",NA())"),NA()))
双NA()
的有点哈克,但评估函数返回一个#VALUE错误,而不是#N / A,所以这笨拙地强制你想要的错误。 此外,该函数返回一个string,所以你需要将结果作为一个整数。 我有点喜欢第一种方法:)