创建一个名为 IFTRUE 的函数,其行为与 IFERROR 相同,但返回 TRUE。Worsheetfunction.if 不起作用。我做错了什么?

创建一个名为 IFTRUE 的函数,其行为与 IFERROR 相同,但返回 TRUE。Worsheetfunction.if 不起作用。我做错了什么?

我想创建一个自定义函数if(somefunction(arg)=something,"sometext",somefunction(arg))somefunction(arg)作为iferrorif(iserror(somefunction(arg)),"sometext",somefunction(arg)

例如,我希望能够输入iftrue(somefunction(arg),"=A1","message")并等同于if(sumfunction(arg)=A1,"message",sumfunction(arg))

我试过:

Function iftrue(Fx, condition, show)
    iftrue = Application.WorksheetFunction.if(Fx & condition, show, Fx)
End Function

但它给出了#value。


为了诊断我的问题,我尝试了一些更简单的函数,以查看哪里出了问题。所以我复制了 SUM 和 If 函数。

此“求和”函数有效。

Function testsum(a, b)
    test = Application.WorksheetFunction.Sum(a, b)
End Function

但是这个“if”函数不起作用。

Function testif(a, b, c)
    testif = Application.WorksheetFunction.if(a, b, c)
End Function

所以我认为我的问题是我调用的方式worksheet.function.if

我知道我可以通过使用 VBA if 来解决这个问题,但这不是我真正想要做的。

答案1

没有Application.WorksheetFunction.If()

即使有,你仍然需要在 if 的测试部分添加额外的引号。例如,如果 fx 解析为"test"并且条件是,则"=test"结果字符串将是"test = test"

把那个

因此,请改用 Evaluate。

我们需要以某种格式解析字符串以进行评估。

我们需要将额外的引号放入结果字符串中。例如,如果 fx 解析为"test"并且条件是,则"=test"结果字符串将是"test = test"

将其放入 Evaluate 中,该函数将查找名为 的函数test。因此,我们需要一个类似于 的字符串""test"="test"",它将解析为 True。

如果条件是总是我们可以简单地用等式而不是不等式IF fx = condition then来代替直到并包括在内的一切If tst Then

这个函数比那个函数更动态,因为它允许不等式:

Function IFTrue(fx, condition As String, show)
Dim tst As Boolean
Dim z As Integer
Dim t As String
'test whether the condition is assuming "="
If InStr("<>=", Left(condition, 1)) = 0 Then condition = "=" & condition
'Find whether there is one or two qulifiers
If InStr("<>=", Mid(condition, 2, 1)) > 0 Then z = 2 Else z = 1
'Parse string to remove qulifiers from the quotes and make everything a string
t = """" & fx & """" & Left(condition, z) & """" & Mid(condition, z + 1) & """"
'evaluate the formula string to resolve to True or False
tst = Application.Caller.Parent.Evaluate(t)

If tst Then
    IFTrue = show
Else
    IFTrue = fx
End If
End Function

然后你可以像这样调用它

=IFtrue(SUM(A1,A2),"=A3","Must Be True")

编辑

您可以使用 IIF() 并减少行数

Function IFTrue2(fx, condition As String, show)
Dim z As Integer

'test whether the condition is assuming "="
If InStr("<>=", Left(condition, 1)) = 0 Then condition = "=" & condition
'Find whether there is one or two qulifiers
If InStr("<>=", Mid(condition, 2, 1)) > 0 Then z = 2 Else z = 1

IFTrue2 = IIf(Application.Caller.Parent.Evaluate("""" & fx & """" & Left(condition, z) & """" & Mid(condition, z + 1) & """"), show, fx)

End Function

相关内容