
Ich wollte eine benutzerdefinierte Funktion erstellen, die eine Abkürzung für ist. if(somefunction(arg)=something,"sometext",somefunction(arg))
So muss ich nicht somefunction(arg)
jedes Mal duplizieren, wenn ich dies mache, genau wie iferror
wir damit Schluss machen können mitif(iserror(somefunction(arg)),"sometext",somefunction(arg)
Ich möchte zum Beispiel tippen können iftrue(somefunction(arg),"=A1","message")
und das soll gleichbedeutend sein mitif(sumfunction(arg)=A1,"message",sumfunction(arg))
Ich habe es versucht:
Function iftrue(Fx, condition, show)
iftrue = Application.WorksheetFunction.if(Fx & condition, show, Fx)
End Function
Aber es gibt einen #Wert.
Um mein Problem zu diagnostizieren, habe ich einige einfachere Funktionen ausprobiert, um herauszufinden, wo ich einen Fehler gemacht habe. Also habe ich die Funktionen SUM und If dupliziert.
Diese „Summen“-Funktion funktioniert.
Function testsum(a, b)
test = Application.WorksheetFunction.Sum(a, b)
End Function
Aber diese „Wenn“-Funktion funktioniert nicht.
Function testif(a, b, c)
testif = Application.WorksheetFunction.if(a, b, c)
End Function
Ich glaube, mein Problem ist die Art und Weise, wie ich das aufrufe worksheet.function.if
.
Ich weiß, dass ich das umgehen könnte, indem ich stattdessen VBA-ifs verwende, aber das ist nicht wirklich das, was ich möchte.
Antwort1
Es gibt keinApplication.WorksheetFunction.If()
Selbst wenn dies der Fall wäre, müssten Sie noch zusätzliche Anführungszeichen in den Testteil des if einfügen. Wenn beispielsweise fx aufgelöst wird "test"
und die Bedingung lautet, "=test"
wäre die resultierende Zeichenfolge"test = test"
Setzen Sie das
Verwenden Sie stattdessen „Auswerten“.
Wir müssen die Zeichenfolge zur Auswertung in einem bestimmten Format analysieren.
wir müssen zusätzliche Anführungszeichen in die resultierende Zeichenfolge einfügen. Wenn beispielsweise fx aufgelöst würde "test"
und die Bedingung wäre "=test"
, wäre die resultierende Zeichenfolge "test = test"
.
Wenn wir dies in Evaluate einfügen, sucht die Funktion nach einer Funktion namens test
. Wir benötigen also einen String wie ""test"="test""
, der sich in True auflöst.
Wenn die Bedingungstetseine Gleichheit und niemals eine Ungleichheit, die wir einfach IF fx = condition then
anstelle von allem bis einschließlich verwenden könnten If tst Then
.
Diese Funktion ist dynamischer, da sie Ungleichungen zulässt:
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
Du würdest es dann so nennen
=IFtrue(SUM(A1,A2),"=A3","Must Be True")
Bearbeiten
Sie können IIF() verwenden und die Anzahl der Zeilen reduzieren
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