Aufgaben berechnen

Das Tabellenkalkulationsprogramm

Moderator: Moderatoren

erikafuchs
******
Beiträge: 690
Registriert: Di, 13.02.2007 17:38
Wohnort: Büttelborn

Aufgaben berechnen

Beitrag 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
bst
*****
Beiträge: 222
Registriert: Mo, 18.01.2010 16:14
Wohnort: Ilsfeld

Re: Aufgaben berechnen

Beitrag 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
clag
********
Beiträge: 3570
Registriert: Di, 27.01.2009 15:30

Re: Aufgaben berechnen

Beitrag 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) 678 mal betrachtet
deine Tabelle ggf entsprechend umzustellen sollte dir leicht fallen
Dateianhänge
Aufgabe-Ergebnis.ods
(10.79 KiB) 52-mal heruntergeladen
LG
clag

nutzt: WinXP SP3 / AOO 4.1.10 / Firefox
Karolus
********
Beiträge: 7535
Registriert: Mo, 02.01.2006 19:48

Re: Aufgaben berechnen

Beitrag 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
LO25.2… debian 13( trixie ) auf Raspberry5 8GB (ARM64)
LO25.8… flatpak debian 13( trixie ) auf Raspberry5 8GB (ARM64)
erikafuchs
******
Beiträge: 690
Registriert: Di, 13.02.2007 17:38
Wohnort: Büttelborn

Re: Aufgaben berechnen

Beitrag 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
bst
*****
Beiträge: 222
Registriert: Mo, 18.01.2010 16:14
Wohnort: Ilsfeld

Re: Aufgaben berechnen

Beitrag 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
erikafuchs
******
Beiträge: 690
Registriert: Di, 13.02.2007 17:38
Wohnort: Büttelborn

Re: Aufgaben berechnen

Beitrag 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
Antworten