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
Aufgaben berechnen
Moderator: Moderatoren
-
- ******
- Beiträge: 690
- Registriert: Di, 13.02.2007 17:38
- Wohnort: Büttelborn
Re: Aufgaben berechnen
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
--
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
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
deine Tabelle ggf entsprechend umzustellen sollte dir leicht fallen
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

deine Tabelle ggf entsprechend umzustellen sollte dir leicht fallen
- Dateianhänge
-
- Aufgabe-Ergebnis.ods
- (10.79 KiB) 53-mal heruntergeladen
LG
clag
nutzt: WinXP SP3 / AOO 4.1.10 / Firefox
clag
nutzt: WinXP SP3 / AOO 4.1.10 / Firefox
Re: Aufgaben berechnen
Hallo
@bst
Deine Lösung lässt sich auch direkt als Zellfunktion aufrufen:
oder
Gruß Karo
@bst
Deine Lösung lässt sich auch direkt als Zellfunktion aufrufen:
Code: Alles auswählen
=EVALUATE(A1)
Code: Alles auswählen
=EVALUATE("5,5:2")
LO25.2… debian 13( trixie ) auf Raspberry5 8GB (ARM64)
LO25.8… flatpak debian 13( trixie ) auf Raspberry5 8GB (ARM64)
LO25.8… flatpak debian 13( trixie ) auf Raspberry5 8GB (ARM64)
-
- ******
- Beiträge: 690
- Registriert: Di, 13.02.2007 17:38
- Wohnort: Büttelborn
Re: Aufgaben berechnen
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
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
Hi Pit,
cu, Bernd
Nein, den hatte ich schon vor langem in VBA geschrieben. Ich habe den nur 'etwas' gekürzt.Lieber Bernd, ich hoffe, du hast den Code jetzt nicht extra für mich geschrieben
Dem sollte nicht so sein. Im Code von mir gibt es ja genau diese Function evaluate die damit aufgerufen werden sollte.calc mag "=evaluate(c3)" nicht, es kommt eine Fehlermeldung
cu, Bernd
-
- ******
- Beiträge: 690
- Registriert: Di, 13.02.2007 17:38
- Wohnort: Büttelborn
Re: Aufgaben berechnen
Lieber Bernd,
sorry für das:
Vielen Dank
Pit
sorry für das:
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.bst hat geschrieben:Dem sollte nicht so sein. Im Code von mir gibt es ja genau diese Function evaluate die damit aufgerufen werden sollte.calc mag "=evaluate(c3)" nicht, es kommt eine Fehlermeldung
Vielen Dank
Pit