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 (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:
oder
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