我想创建一个自定义函数if(somefunction(arg)=something,"sometext",somefunction(arg))
,somefunction(arg)
作为iferror
if(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