Seite 1 von 1

Aufgaben berechnen

Verfasst: Mi, 09.06.2010 23:43
von erikafuchs
Hallo Ihr Lieben,
ich habe eine ganze Spalte mit Aufgaben zu den Grundrechenarten - pro Aufgabe eine Zelle. Das sind dann Aufgaben wie: 4*5, 15+3 oder 1,5:3 (oder halt auch 1,5/3). Diese Zellen habe ich als Text formatiert. Hat jemand eine Idee, wie ich die Aufgaben in einer zweiten Spalte automatisch berechnen kann? =Wert(Zelladresse) geht nicht. Von mir aus kann das auch ein Makro sein. Da es sich aber um verschiedene Rechenoperationen handelt, müsste man zunächst per Makro überprüfen ob es sich um eine Plus, Minus, Mal oder Geteilt - Aufgabe handelt und dann die Zahlen extrahieren und dann berechnen. ... Das mache ich dann lieber im Kopf... oder weiß jemand eine einfachere Möglichkeit?
Vielen Dank für Eure Mühe
Pit

Re: Aufgaben berechnen

Verfasst: Do, 10.06.2010 09:45
von bst
Hi,

Da es Evaluate in Calc nicht zu geben scheint muss man das wohl selber bauen.

Mal ein Versuch. Erwartet die Ausdrücke in Spalte A ab Zeile 1 und schreibt die Ergebnisse in Spalte B.

Unterstützt die 4 Grundrechenarten +, -, *, / oder : sowie Klammern und Vorzeichen-Minus.

HTH, Bernd
--

Code: Alles auswählen

REM  *****  BASIC  *****

Option VBASupport 1
Option Explicit

Private Enum eTokens
   k_CONST = 257  ' eine Zahl
   k_DONE         ' Ende
End Enum

Private strInput As String     ' Der zu parsende Eingabestring
Private intNext As Integer     ' Index des nächsten zu lesenden Zeichens
Private lookahead As Integer   ' Das nächste Token
Private Numval As Double       ' der Wert einer Konstanten

Public Sub ParseIt()
   Dim i As Long
   
   For i = 1 To ActiveSheet.UsedRange.Rows.Count
      Cells(i, 2) = Evaluate(Cells(i, 1).Value)
   Next
End Sub

Public Function Evaluate(ByVal s As String) As Double ' die oberste Stufe des Parsers
   intNext = 0
   strInput = s
   lookahead = lexan()
   Evaluate = Expr()
End Function

Private Function Expr() As Double
   Dim myVal As Double
   
   myVal = Term()
   While True
      Select Case lookahead
         Case Asc("+")
            match Asc("+")
            myVal = myVal + Term()
         Case Asc("-")
            match Asc("-")
            myVal = myVal - Term()
         Case Else
            Expr = myVal
            Exit Function
      End Select
   Wend
End Function

Private Function Term() As Double
   Dim myVal As Double
   
   myVal = Factor()
   While True
      Select Case lookahead
         Case Asc("*")
            match Asc("*")
            myVal = myVal * Factor()
         Case Asc("/")
            match Asc("/")
            myVal = myVal / Factor()
         Case Asc(":")
            match Asc(":")
            myVal = myVal / Factor()
         Case Else
            Term = myVal
            Exit Function
      End Select
   Wend
End Function

Private Function Factor() As Double
   Select Case lookahead
      Case Asc("(")
      	 match Asc("(")
      	 Factor = Expr()
      	 match Asc(")")
      Case Asc("-")
      	 match Asc("-")
      	 Factor = -Term()
      Case k_CONST
         Factor = Numval
         match k_CONST
	  Case k_DONE
	  	Factor = 0
      Case Else
         MsgBox "Falscher Ausdruck"
         End
   End Select
End Function

Private Function lexan() As Integer   ' die lexikalische Analyse
   Dim ch As String
   
   While True
      intNext = intNext + 1
      ch = Mid(strInput, intNext, 1)
      If ch = " " Or ch = vbTab Then
         ' do nothing
      ElseIf IsDigit(ch) Then
         Numval = Val(Replace(Mid(strInput, intNext), ",", "."))
         While IsNumChar(ch)
            intNext = intNext + 1
            ch = Mid(strInput, intNext, 1)
         Wend
         intNext = intNext - 1
         lexan = k_CONST
         Exit Function
      ElseIf ch = "" Then
         lexan = k_DONE
         Exit Function
      Else
         lexan = Asc(ch)
         Exit Function
      End If
   Wend
End Function

Private Function match(ByVal tok As Integer) As Integer ' Minimaler Test und den nächsten Token lesen
   If lookahead = tok Then
      lookahead = lexan()
   Else
      MsgBox "Error in match"
      End
   End If
End Function

Private Function IsDigit(ByVal ch As String) As Boolean
   IsDigit = ch Like "[0-9]"
End Function

Private Function IsNumChar(ByVal ch As String) As Boolean
   IsNumChar = ch Like "[0-9,]"
End Function

Re: Aufgaben berechnen

Verfasst: Do, 10.06.2010 10:09
von clag
Moin Pit

ich! glaube dein Wunsch ist nicht so einfach zu realisieren

deshalb habe ich den Weg umgedreht erst eine Formel eingeben und dann die daraus die Aufgabe erstellen/ darstellen
das hat den Vorteil, dass es praktisch mit jeder Formel funktioniert und man kann "keine Fehler" einbauen :)
Aufgabe+Ergebniss-darstellen.jpg
Aufgabe+Ergebniss-darstellen.jpg (24.49 KiB) 675 mal betrachtet
deine Tabelle ggf entsprechend umzustellen sollte dir leicht fallen

Re: Aufgaben berechnen

Verfasst: Do, 10.06.2010 13:28
von Karolus
Hallo
@bst
Deine Lösung lässt sich auch direkt als Zellfunktion aufrufen:

Code: Alles auswählen

=EVALUATE(A1)
oder

Code: Alles auswählen

=EVALUATE("5,5:2")
Gruß Karo

Re: Aufgaben berechnen

Verfasst: Do, 10.06.2010 16:23
von erikafuchs
Hallo, Ihr seid wirklich die Besten!
Lieber Bernd, ich hoffe, du hast den Code jetzt nicht extra für mich geschrieben - ich war da ja zu faul für. Vielen Dank, das sieht gut aus!

Liebe/r clag, eine geniale Idee - muss man nur drauf kommen - ich glaube so mache ich es! Danke

Lieber Karolus, nach sowas habe ich ja gesucht! Aber irgendwas mache ich falsch, calc mag "=evaluate(c3)" nicht, es kommt eine Fehlermeldung... oder was mache ich falsch? Ansonsten sind die Formeln, im Gegensatz zu den Makrobefehlen ja auch immer deutsch - oder liegt da das Problem? Vielen Dank auch an dich - Bernd ist ja auch der Ansicht, dass "evaluate" in calc nicht geht. Hast du einen Tipp?

Viele Grüße
Pit

Re: Aufgaben berechnen

Verfasst: Do, 10.06.2010 16:39
von bst
Hi Pit,
Lieber Bernd, ich hoffe, du hast den Code jetzt nicht extra für mich geschrieben
Nein, den hatte ich schon vor langem in VBA geschrieben. Ich habe den nur 'etwas' gekürzt.
calc mag "=evaluate(c3)" nicht, es kommt eine Fehlermeldung
Dem sollte nicht so sein. Im Code von mir gibt es ja genau diese Function evaluate die damit aufgerufen werden sollte.

cu, Bernd

Re: Aufgaben berechnen

Verfasst: Do, 10.06.2010 16:59
von erikafuchs
Lieber Bernd,
sorry für das:
bst hat geschrieben:
calc mag "=evaluate(c3)" nicht, es kommt eine Fehlermeldung
Dem sollte nicht so sein. Im Code von mir gibt es ja genau diese Function evaluate die damit aufgerufen werden sollte.
Beim schnellen Lesen eurer Antworten hatte ich gehofft, dass "=evaluate(A1)" eine Formel ist, die ich auf einem Tabellenblatt einfach eingeben kann. Dass dies eine Funktion in einem Makrocode ist, hätte ich selbst merken können.
Vielen Dank
Pit