2017-08-14 9 views
0

Ich versuche, einen logischen Ausdruck durch Verketten der Operanden und Operator zu bewerten. Gibt es eine Formel, die in Excel 2016 von Text in logisch konvertiert wird, ähnlich wie VALUE() von Text in Zahl konvertiert? Ich suche nach einer Lösung dafür, damit ich die Bedingung dynamisch ändern kann, ohne die tatsächliche Excel-Formel zu ändern. Ich habe die Excel-Funktionsbeschreibungen durchsucht und durchgelesen, aber als Lösung springt nichts heraus.Excel Text als logisch

'The operands and operator 
A1: 1 
A2: > 
A3: 0 

'Concatenation 
B4: =CONCAT(A1:A3) 'This evaluates to 1>0 
B5: =A1&A2&A3 'This also evaluates to 1>0 

'Some checks 
C4: =ISTEXT(B4) 'This evaluates to TRUE. 
C5: =ISTEXT(B5) 'This also evaluates to TRUE 
D4: =ISLOGICAL(B4) 'This evaluates to FALSE 
D5: =ISLOGICAL(B5) 'This also evaluates to FALSE 

'Vain attempts 
E4: =AND(B4,TRUE) 'This ALWAYS is TRUE, even when my desired output is FALSE 
E5: =OR(B5) 'This spits out a #VALUE! error 

Da ich bin auf der Suche nach etwas dynamischer, möchte ich wie
=IF(A2=">",A1>A3,FALSE) eine Lösung zu vermeiden. Ich würde es auch vorziehen, eine UDF zu vermeiden, bin aber bereit, diese Route zu gehen, wenn keine eingebaute Funktion existiert, um einen logischen Ausdruck in Text zu konvertieren und ihn als logisch auszuwerten.

+1

Wenn Sie sich entscheiden Sie Um die UDF-Route zu bekommen, wird dies tun 'Funktion Eval (r als Bereich) als Variante Eval = r.Worksheet.Evaluate (r.Value) Ende Funktion' –

+0

Nein, keine eingebaute Funktion existiert. UDF ist die beste Route. –

+0

+1 @chrisneilsen. Ich hatte mit einer UDF begonnen, aber ich tat es auf die harte Tour. Ihr eleganter One-Liner funktioniert perfekt. Ich habe es in meiner Antwort unten verwendet, die einen Ausdruck oder einen Excel-Bereich als Eingabe akzeptieren kann. –

Antwort

1

eine UDF zu schreiben Bewerten Sie fordern, die entweder einen Bereich oder Variant/String-Eingang verarbeiten kann, versuchen Sie Folgendes:

Function L(exp As Variant) As Variant 
    Dim vExp As Variant 

    vExp = exp 
    L = Application.Evaluate(vExp) 
End Function 

Warum funktioniert es?

Die Linie vExp = exp macht die Magie. Wenn exp ein Bereich ist, verwendet die Zuweisung die Standardeigenschaft .Value und kopiert sie als Variant/String (weil wir Set nicht verwenden). Wenn es sich um eine Variante/String handelt, handelt es sich um eine direkte Kopie.

Es hat den Nachteil der Verwendung von Application.Evaluate (unten als erklärt here)


eine Version auch die Möglichkeit, handhaben von VBA aufgerufen wird, versuchen

Function L(exp As Variant) As Variant 
    If TypeName(exp) = "Range" Then 
     L = exp.Worksheet.Evaluate(exp.Value) 
    Else 
     If IsError(Application.Caller) Then 
      'Calls from VBA are hanbled here. 
      ' Note: Best to fully qualify any range references in exp 
      ' to avoid unexpected references to the active sheet 
      L = ActiveSheet.Evaluate(exp) 
     Else 
      L = Application.Caller.Worksheet.Evaluate(exp) 
     End If 
    End If 
End Function 
0

auf die Kommentare aus, dass keine integrierte Funktion Pflege dieser nimmt, habe ich eine benutzerdefinierte Funktion („UDF“ genannt) L() für logische nach dem eingebauten Funktionen N unter() und T(), die für Nummern und Text sind.

Function L(exp As Variant) As Variant 

Dim limit As Integer 
Dim counter As Integer 

'Set an upper limit to how many cycles the loop may run 
limit = 1000 

'Assuming the possibility of nested functions, loop until the expression resolves to logical or to an error or until the loop limit has been reached 
Do 
    exp = [exp] 'This avoids Error 2015 if exp is a Range reference. Comment if there's a better way! 
    exp = Application.Evaluate(exp) 'Evaluate the expression 
    counter = counter + 1 'Increment the loop counter 
Loop Until Application.IsLogical(exp) Or Application.IsError(exp) Or counter >= limit 

'Return the evaluated expression 
L = exp 

End Function 

Diese Funktion funktioniert auch, wenn ich einige dumme Dinge seinen Weg wie =L(TRUE) oder =L(CONCAT(A1:A2)&A3) oder sogar =l(CONCAT(A1:A2)&"""foo""") werfen. Aber es wirft keine Fehler in Fällen, in denen es wahrscheinlich sollte, wie =l(123) oder =l("123"). In diesen Fällen, Gott sei Dank für die Zählergrenze, weil 123 und "123" nie zu einem logischen oder einem Fehler ausgewertet werden.

+0

Ich sehe wirklich keine Notwendigkeit für eine Schleife. Denken Sie daran, dass, wenn der Parameter, den Sie an "L" übergeben, eine Formel ist (wie Ihre Beispiele), diese Formel ausgewertet und das Ergebnis an die UDF übergeben wird. Können Sie Beispiele nennen, die die Schleife mehr als einmal ausführen? –

+0

In meinem Kommentar habe ich die Worksheet-Version von Evaluate verwendet. [Siehe diesen Link für warum] (https: //fastexcel.wordpress.com/2011/11/02/evaluate-functions-and-formules-fun-how-to-make-excels-evaluate-methode-double-as-fast /) –

+1

Wiederverwendung von 'exp = [exp]': A bessere Weg ist 'Wenn Type-Name (exp) = "Range" Dann exp = Application.Evaluate (exp.Value) Else exp = Application.Evaluate (exp) End If' –