Erstellen einer Funktion namens IFTRUE, die sich wie IFERROR verhält, aber für eine Funktion, die TRUE zurückgibt. Worsheetfunction.if funktioniert nicht. Was mache ich falsch?

1

Ich wollte eine benutzerdefinierte Funktion erstellen, die eine Abkürzung für sein würde if(somefunction(arg)=something,"sometext",somefunction(arg)) Ich muss also nicht duplizieren somefunction(arg) Jedes Mal mache ich das, genau wie iferror lass uns abschaffen if(iserror(somefunction(arg)),"sometext",somefunction(arg)

Zum Beispiel möchte ich tippen können iftrue(somefunction(arg),"=A1","message") und das gleichzusetzen mit if(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 # Wert.


Um mein Problem zu diagnostizieren, habe ich einige einfachere Funktionen ausprobiert, um festzustellen, wo ich falsch liege. 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 denke, mein Problem ist die Art, wie ich das anrufe worksheet.function.if.

Ich weiß, ich könnte dies einfach umgehen, indem ich stattdessen VBA ifs verwende, aber das ist nicht wirklich das, was ich tun möchte.

Some_Guy
quelle
Bitte geben Sie ein Beispiel für iftrue 's Parameter, die Sie ausprobiert haben und nicht funktionierten. Was funktioniert nicht? Falsche Ausgabe / Fehlermeldung?
Máté Juhász
Ich musste einige Analysen durchführen, um mit Text umzugehen. Bitte sehen Sie meine Bearbeitung. Es funktioniert mit Formeln, die sowohl Text als auch Zahlen zurückgeben. Es wird ein String zurückgegeben.
Scott Craner
1
Es wird nun dasselbe zurückgegeben, was die Funktion zurückgibt. Wenn die Funktion ein Double zurückgibt, wird diese Funktion ebenfalls ausgeführt. Wenn es Text zurückgibt, funktioniert dies auch. Möglicherweise müssen Sie den Bildschirm aktualisieren.
Scott Craner

Antworten:

2

Es gibt kein Application.WorksheetFunction.If()

Selbst wenn dies der Fall wäre, müssten Sie immer noch zusätzliche Anführungszeichen in den Testteil des if einfügen. Zum Beispiel, wenn der FX in aufgelöst wurde "test" und zustand war "=test" Die resultierende Zeichenfolge wäre "test = test"

Setzen Sie das

Verwenden Sie also stattdessen Evaluate.

Wir müssen den String in einem bestimmten Format für Evaluate analysieren.

Wir müssen zusätzliche Anführungszeichen in die resultierende Zeichenfolge einfügen. Zum Beispiel, wenn der FX in aufgelöst wurde "test" und Zustand war "=test" Die resultierende Zeichenfolge wäre "test = test".

Wenn Sie dies in Auswerten eingeben, sucht die Funktion nach einer Funktion mit dem Namen test. Wir brauchen also einen String, der so aussieht ""test"="test"", die auf True aufgelöst wird.

Wenn der Zustand war immer eine Gleichheit und niemals eine Ungleichheit, die wir einfach verwenden könnten IF fx = condition then anstelle von allem bis einschließlich 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

Sie würden es dann so nennen

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

Bearbeiten

Sie können das 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
Scott Craner
quelle
____________Sehr schön_________
Gary's Student
@ Gary'sStudent jetzt wird derselbe Typ zurückgegeben, wie der Eingang ist.
Scott Craner
1
Ich werde dies in meinen Werkzeugkasten legen.
Gary's Student
Das ist gewachsen, seit ich das letzte Mal geschaut habe! Mir gefällt, dass das Argument nicht mehr als String benötigt wird. Könnten Sie diesen Code bitte kommentieren? Es ist zwar besser als vorher, aber jetzt etwas undurchsichtig.
Some_Guy
Ich möchte nicht undankbar klingen, aber gibt es keine Möglichkeit, die eingebaute Excel If-Funktion zu verwenden und die Art und Weise, wie die Argumente an diese übergeben werden, einfach umzugestalten? Anstatt wie hier eine Funktion von Grund auf neu zu erstellen.
Some_Guy