Visual Basic - Technik, FAQ, Tricks, Beispiele

Home / Allgemein / Mathe / Eval

Ausdrücke berechnen mit Eval

Manchmal benötigt man den ausgerechneten Wert eines mathematischen Ausdrucks, welcher in einem String abgelegt ist. Ein Beispiel wäre ein Funktionsplotter, wo man die darzustellende Formel in einer TextBox eingeben kann.

In AccessBasic gibt es eine Funktion namens Eval, welche genau diese Aufgabe erledigt. Leider ist diese Funktion bisher noch nicht in VB integriert worden. Daher muß man sich mit einem der folgenden Workarounds behelfen:

Methode 1: MS-Access den Ausdruck berechnen lassen

Hierfür muß im VB-Projekt eine Referenz auf "Microsoft Access 8.0 Object Library" o.ä. gesetzt sein.
Function MyEval(Expression As String) As Variant
  Static ap As Access.Application

  'Ggf. Access-Instanz erzeugen:
  If ap Is Nothing Then
    Set ap = New Access.Application
  End If

  'Ausdruck berechnen:
  MyEval = ap.Eval(Expression)
End Function
Man beachte, dass auf dem Rechner MS-Access installiert sein muß! Zur Optimierung wird übrigens nur beim ersten Aufruf der Funktion eine Access-Instanz erzeugt. Diese wird dann immer weiter wiederverwendet, bis das VB-Programm beendet wird.

Methode 2: Den Ausdruck als SQL-Statement berechnen

Hierfür muß im VB-Projekt eine Referenz auf "Microsoft DAO 3.5 Object Library" o.ä. gesetzt sein.
Function MyEval(Expression As String) As Variant
  Static db As DAO.Database
  Dim ds As DAO.Recordset
  Const MDB = "C:\Tmp\TmpDB.MDB"   'ggf. anpassen!!!
  
  'Ggf. DB initialisieren:
  If db Is Nothing Then
    On Error Resume Next
    Kill MDB
    On Error GoTo 0
    Set db = DAO.CreateDatabase(MDB, dbLangGeneral)
    db.Execute "create table TmpTab(TmpField long)"
    db.Execute "insert into TmpTab values(1)"
  End If
  
  'Ausdruck berechnen:
  Set ds = db.OpenRecordset( _
      "select " & Expression & " from TmpTab where TmpField=1")
  MyEval = ds(0)
  ds.Close
End Function
Diese Methode benötigt keinerlei VB-fremden Mittel. Auch hier wurde wieder optimiert: Die Hilfs-Datenbank wird nur beim ersten Aufruf der Funktion erzeugt und ein Database-Object damit instanziiert. Dieses "lebt" bis zur Beendigung des VB-Programms.

© Jost Schwider, 30.04.2000-02.05.2000 - http://vb-tec.de/eval.htm