Formel aus String berechnen

  • Excel

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von petaod.

    Formel aus String berechnen

    Hallo,
    ich bin ein kompletter Neuling in VBA und brauch dringend eure Hilfe. Es gibt zwar ähnliche Threads aber
    ich habe leider keine zufriedenstellende Antwort gefunden.

    Ich muss ein Programm schreiben, dass das Newtonverfahren berechnen kann und mein Problem ist das Dividieren von Funktionen.
    Beispiel: 4x^2 / 8x+9

    Die einzelnen Ausdrücke sind ja ein String und ich kann diese nicht dividieren.
    Wie kann ich diese Ausdrücke so dividieren, dass eine zahl herauskommt ? Für x wird der Startwert eingesetzt.
    Hier mein Code:

    Quellcode

    1. ' Deklaration der Variablen
    2. Dim Funktion As String
    3. Dim Ableitung As String
    4. Dim Startwert As Double
    5. Dim Präzision As Double
    6. Dim Laufer As Double
    7. Dim Zergebnis As Double
    8. Dim Funktion2 As Double
    9. ' Definition der Variablen
    10. Funktion = TextBox1.Value
    11. Ableitung = TextBox2.Value
    12. Startwert = TextBox3.Value
    13. Funktion = Replace(Funktion, "x", "*" & Startwert)
    14. Ableitung = Replace(Ableitung, "x", "*" & Startwert)
    15. Zergebnis = Funktion / Ableitung ' ????????????



    Vielen Dank schon einmal
    @RodFromGermany: Ich vermute mal, morgen beginnt erst wieder Dein "Roulade mit Klößen"-Wochenende. Dabei gäbe es doch schon heute wieder was davon zu kauen. ;)
    @bubba: Deine Variablen Funktion und Ableitung sind was? Texte Deiner Formeln, richtig? VBA ist nicht dafür ausgelegt, Text in eine mathematische Formel umzuinterpretieren. Und ich denke nicht, dass Du es Dir antun willst, einen Umwandler von Text in Matheformeln selber zu schreiben. Dieses Unterfangen ist ein großes. Und mindestens noch 1 Jahr von Deinen Fähigkeiten entfernt (Schuss ins Blaue).

    Du musst eben mithilfe von Code, nicht von Text, Deine Formel aufstellen und berechnen lassen. Das ist Programmieren. Naja, so ungefähr. Wieviele verschiedene Formeln sollen denn verarbeitet werden können? Alle möglichen? Also auch mit Quadrat, Wurzel, Sinus, Arcustangens, natürlichen Logarithmus, imaginären Zahlen und Warpfaktoren? Ui. Das wird lustig ;(

    Wenn Du die Erlaubnis hast (denn das ganze klingt wie eine Hausaufgabe oder Praktikumsarbeit), die Exceltabelle mit den dazugehörigen Berechnungs- und Formeleingabefunktionen zu verwenden, dann wäre dies möglich, da Excel aus X mithilfe einer eingegebenen Formel Y berechnen kann. Dann kann man auch mit VBA das Newton-Verfahren implementieren. Aber aus einer selbstgeschriebenen Formel in einer Textbox, bei der Excel nur als missbrauchte Programmierumgebung fungiert? Schwierig bis unmöglich.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Hallo bubba,
    sieh' dir mal das an:
    vbarchiv.net/forum/id2_i122341…problem-mit-rechnung.html

    Die Antwort bezieht sich zwar auf VB6, funktioniert aber auch unter VBA.
    Bei der Division von zwei Ausdrücken, die in Strings stehen, mußt du diese
    in Klammern setzen, wegen "Punkt vor Strich".
    Gruss,

    Neptun
    @Neptun: So schnell kann ich eines Besseren belehrt werden. Funktioniert in VBA.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Funktioniert sogar einigermaßen elegant:

    Visual Basic-Quellcode

    1. ​Function CalcFormula(ByVal Formula As String, ByVal x As Double) As Double
    2. CalcFormula = Evaluate(Replace(Formula, "x", x))
    3. End Function
    4. Sub TestFormula()
    5. For x = 1 To 6
    6. Debug.Print CalcFormula("(4*x^2) / (8*x+9)", x)
    7. Next
    8. End Sub
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --