Logischen Ausdruck auswerten

Hallo zusammen,

ich bastele mir aus verschiedenen Zellen (EXCEL 2002) einen logischen Ausdruck zusammen, den ich dann als String habe:

boolString = "(-8955700.29--8968894.13)
(Später soll auch or und and vorkommen)

Danach möchte ich per

    
    if (ichBinWar(boolString)) then
    ...



etwas in eine Zelle schreiben. Was mir eigentlich fehlt ist die Funktion ichBinWar. (Mal abgesehen davon, das die logischen Ausdrücke bestimmt noch nicht alle klappen werden ...)

Frage also: Wo gibts ichBinWar in VBA? Ich hoffe, dass ich das nicht selber implementieren muss. Eigentlich ist das wie eine wenn Formel, die in einem Sheet einsetzen würde.

Hoffe das war klar ausgedrückt, ansonsten bitte nachfragen.

Vielen dank im Voraus

Dirk.Pegasus

Hallo,

In VBS oder mit ScriptObjekt in VB6:

msgbox eval("(-8955700.29--8968894.13)

gibt 'Falsch' zurück. 

Access kennt Eval auch, in Excel heißt es wohl Evaluate, wenn ich Reinhard neulich richtig verstanden habe.

Gruß, Rainer

Danke!
Hallo Rainer,

vielen Dank. Das wars. Aber warum ich nicht dazu in der Lage war, das zu finden, naja.

biba

Dirk.Pegasus

Hallo Rainer,

etwas zu früh gefreut. Grundsätzlich macht dein Tipp genau das was ich wollte. Nun hapert es an meinem Wissen, was man denn einem evaluate so alles füttern kann:

Evaluate("true and true")

scheitert nämlich. (bringt einen bösen Laufzeitfehler 13: Falscher Typ)

Noch ein Tipp auf Lager?

Suchen im Netz nach EXCEL EVALUATE or and
ist ja schwierig, da man die noise words (or and) ja anders interpretiert…

mfg

Dirk.Pegasus

sowas in etwa?
hi dirk

Sub BoolTest()

Dim boolString As String
Dim ichBinWar As Boolean

boolString = "or(and(102)"

ichBinWar = Evaluate(boolString)

End Sub

das gemeine ist, dass excel in der evaluate-funktion auf jeden fall die amerikanische schreibweise für ausdrücke verlangt (also englische funktionen und beistriche als seperatoren, vermutlich auch punkte als dezimaltrenner). hier zeigt sich wieder mal, dass die neueren office-versionen nicht mehr so vollständig wie alte lokalisiert werden.

alles klar?

lg
erwin

etwas zu früh gefreut. Grundsätzlich macht dein Tipp genau das
was ich wollte. Nun hapert es an meinem Wissen, was man denn
einem evaluate so alles füttern kann:

Evaluate(„true and true“)

scheitert nämlich. (bringt einen bösen Laufzeitfehler 13:
Falscher Typ)

Hallo Dirk,

Sub tt()
MsgBox Evaluate(True And True)
End Sub

Gruß
Reinhard

Hallo Dirk.

Noch ein Tipp auf Lager?

Ms ScriptControl1.ocx

In VBA kann man ja auch OCXe verwenden. In VB6 gibt …

Option Explicit

Private Sub Command1\_Click()
 Command1.Caption = ScriptControl1.Eval("True AND False")
End Sub

‚Falsch‘ zurück, ohne Fehler. :smile: Excel habe ich nicht, ich kann’s nicht testen.

Gruß, Rainer

Hallo Reinhard,

Sub tt()
MsgBox Evaluate(True And True)
End Sub

Ja, das geht. Aber
MsgBox Evaluate(„True And True“)
nicht. Und da ich den Inhalt für Evaluate selber zusammensetzen muss, kann ich das (erstmal) so nicht brauchen.

Mmh:
MsgBox Evaluate(Evaluate(„True“) Or Evaluate(„True“))
klappt aber! Also vorher in Stücke zerlegen? Aber wie kann ich dann dynamisch eine beliebige Reihenfolge und Anzahl And / OR auswerten? (grübel)

Erstmal vielen Dank, es ist zwar (noch) keine Lösung, aber vieleicht wirds ja noch …

mfg

Dirk.Pegasus

Hallo Rainer,

gute Idee. Wenn ich mir ein OCX anbinde kann ichs damit machen. Hab ich zwar noch nicht gemacht, und die Verfügbarkeit bei meinen Kunden muss auch noch passen.

Werds mal weiter analysieren…

mfg

Dirk.Pegasus

Hallo Erwin,

genau soetwas. Ich denke, dass ist einfacher als EXCEL so zu verbiegen, dass meine Syntax klappt. Werds mal einbauen.

Ärgerlich ist aber, dass ich die Kommas der zahlen in einen Punkt umwandeln muss. Danach ist das Komma als Trenner der Ausswagen flöten. Aber das wird zu machen sein …

@Rainer und Reinhard: Werd das so erstmal verfolgen, es sei denn ihr findet noch ne tolle Idee!

mfg

Dirk.Pegasus

Hallo Dirk,

Hab ich zwar noch nicht gemacht, und die Verfügbarkeit
bei meinen Kunden muss auch noch passen.

Das OCX ist IMO ab W2k auf allen Rechnern, das musst Du noch nicht mal mitgeben. (msscript.ocx)

Gruß, Rainer

Was ich nun mache
Hallo zusamen,

ich verwende nun dies

On Error Resume Next
resultEval = Application.Evaluate(thisRoule)
If (CStr(resultEval) = "Wahr" Or CStr(resultEval) = "Falsch") Then
 couldEval = True
Else
 couldEval = False
End If
On Error GoTo 0 

und die Syntax and(true ; false)
Erst ersetze ich die Kommas in . und dann das ; in ein ,

Klappt. Aber: (Etwas bleibt ja immer hängen)

Ich wollte soetwas machen:

On Error Resume Next
Err.Clear
resultEval = Application.Evaluate(thisRoule)
If (Err.Number= 0) Then
 couldEval = True
Else
 couldEval = False
End If
On Error GoTo 0

Das ruscht aber an allen fehlern vorbei!
(Da ich den oberen Code erstmal lasse, ist mir hierzu eine Lösung nicht sooooooooo wichtig. Es ärgert halt …)

Dirk.Pegasus

Hallo Dirk,

Bist Du sicher? Was bekommst Du so für ‚True AND True‘ und für ‚True AND False‘ für Ergebnisse? Wenn Evaluate das nicht rechnet, nützt es Dir gar nichts den Fehler abzufangen, Du bekommst das Ergebnis nicht.

Gruß, Rainer

Hallo Rainer,

entsprechend der Syntax:

and(true;true)
and(true;false)

liefern mir die Einträge was ich wünsche. Beim 1:true und bei 2:false.

Dein Einwand war aber wichtig: Ich hatte mein resultEval als boolean deklariert. Damit gabs nur einmal einen Fehler, da weitere Fehler an der Zuweisung „Fehler bla“ auf boolean scheiterten. Habs jetzt als Variant deklariert, dann kommt öfter ein Fehler. (Zum Glück nur wenn ich quatsch in die Regel eingebe! Also wie gewünscht!)

mfg

Dirk.Pegasus

Hi Dirk,

entsprechend der Syntax:

and(true;true)
and(true;false)

ahhh, das war an mir vorüber gegangen. :smile:

liefern mir die Einträge was ich wünsche. Beim 1:true und bei
2:false.

OK.

Dein Einwand war aber wichtig: Ich hatte mein resultEval als
boolean deklariert. Damit gabs nur einmal einen Fehler, da
weitere Fehler an der Zuweisung „Fehler bla“ auf boolean
scheiterten. Habs jetzt als Variant deklariert, dann kommt
öfter ein Fehler. (Zum Glück nur wenn ich quatsch in die Regel
eingebe! Also wie gewünscht!)

Wunderbar, danke für die Rückmeldung.

Gruß, Rainer

biba owT
.

habe:

boolString = "(-8955700.29–8968894.13)
(Später soll auch or und and vorkommen)

Danach möchte ich per

if (ichBinWar(boolString)) then

etwas in eine Zelle schreiben. Was mir eigentlich fehlt ist
die Funktion ichBinWar. (Mal abgesehen davon, das die
logischen Ausdrücke bestimmt noch nicht alle klappen werden
…)

Hi Dirk,
vielleicht hilft dir das weiter:

Option Explicit

Sub tt()
MsgBox Eval2("True And False")
MsgBox Eval2("True 

    Function Eval2(ByVal Wort As String)
    Dim W, Op, N
    Op = Array("And", "Or", "
    Gruß
    Reinhard

Hallo Reinhard,

vielen Dank. Der Hinweis von Erwin war entscheidend: Die Syntax ist halt anders:
Evaluate(and(true, false))
dazu ein bisschen Fehlerhandling und gut ist.

Nochmals Danke!

Und nun möchte ich nochmal (mach ich sonst auch gerne …) Aristoteles zitieren:
Das Ganze ist mehr als die Summe seiner Teile!

Undhier gilt: Viele tolle Antworten hab ich bekommen. Und zusammen seid ihr unschlagbar!

mfg

Dirk.Pegasus