VBA Taschenrechner mit Listbox

Super ;) jetzt gehts mir is grad klar geworden das ich immer zweimal die txtErgebnis verwendet habe ;) ^^ Danke schonmal Herzlichst

Fals du noch magst: noch die frage -->
Wie bringe ich das hin das ich mit 3 Zahlen rechnen kann also 1 + 1 + 1, da müsste doch noch eine Dritte Variable sein für die 3te Zahl aber wie ich das machen soll is mir unklar, da er ja dann immer 3 zahlen verlangt

Wie gesagt bin neu in dem gebiet ;)
 
So ein Taschenrechner ist gar nicht so einfach wie man sich das vielleicht vorstellt.

Wenn du das jetzt mit einer dritten Variablen versiehst, willst du bald mit 4 Zahlen rechnen, dann mit 5, dann mit 6, ...
Mit einer festen Anzahl von Variablen pro Zahl/Rechenart macht das so keinen Sinn. Du musst hier mit Arrays arbeiten.

In meinem Beispiel gibt es nur die Zahlen 1 - 6 und die Rechenarten Plus und Minus aber das kannst du ja für dich entsprechend erweitern.

Hier mal der komplette Code:

Visual Basic:
'diese Variablen müssen als Array jedoch ohne Dimension deklariert werden
Dim art()
Dim zahl()

Private Sub cb1_Click()
lblErgebnis.Caption = lblErgebnis.Caption & "1"
End Sub

Private Sub cb2_Click()
lblErgebnis.Caption = lblErgebnis.Caption & "2"
End Sub

Private Sub cb3_Click()
lblErgebnis.Caption = lblErgebnis.Caption & "3"
End Sub

Private Sub cb4_Click()
lblErgebnis.Caption = lblErgebnis.Caption & "4"
End Sub

Private Sub cb5_Click()
lblErgebnis.Caption = lblErgebnis.Caption & "5"
End Sub

Private Sub cb6_Click()
lblErgebnis.Caption = lblErgebnis.Caption & "6"
End Sub

Private Sub cbClear_Click()
lblErgebnis.Caption = ""

'die Arrays zurücksetzen
ReDim art(0)
ReDim zahl(0)
End Sub

Private Sub cbGleich_Click()
'neu dimensionieren und letzte Zahl zuweisen
ReDim Preserve zahl(UBound(zahl) + 1)
zahl(UBound(zahl)) = lblErgebnis.Caption
lblErgebnis.Caption = ""
'ersten Teil der Formel erstellen
formel = zahl(1) & " "
'erste Zahl zur Berechnung an Variable übergeben
ergebnis = zahl(1)

'in Schleife alle weiteren Zahle und Rechenarten durchlaufen und den Variablen
ergebnis und formel entsprechend übergeben
For a% = 2 To UBound(zahl)
    If art(a% - 1) = "+" Then
        ergebnis = ergebnis + CDbl(zahl(a%))
    ElseIf art(a% - 1) = "-" Then
        ergebnis = ergebnis - CDbl(zahl(a%))
    End If
    formel = formel & art(a% - 1) & " " & zahl(a%) & " "
Next a%

'an die Formel das "=" und das tatsächliche Ergebnis anhängen und in Liste eintragen
formel = formel & " = " & ergebnis
LstFormel.AddItem formel
'Ergebnis in Textfeld eintragen
lblErgebnis.Caption = ergebnis

'Arrays auf die Dimension 0 setzen
End Sub

Private Sub cbMinus_Click()

ReDim Preserve art(UBound(art) + 1)

art(UBound(art)) = "-"
ReDim Preserve zahl(UBound(zahl) + 1)
zahl(UBound(zahl)) = lblErgebnis.Caption
lblErgebnis.Caption = ""

End Sub

Private Sub cbPlus_Click()

ReDim Preserve art(UBound(art) + 1)

art(UBound(art)) = "+"
ReDim Preserve zahl(UBound(zahl) + 1)
zahl(UBound(zahl)) = lblErgebnis.Caption
lblErgebnis.Caption = ""

End Sub

Private Sub UserForm_Activate()

ReDim art(0)
ReDim zahl(0)

End Sub

Hoffe mal ich habe es so beschrieben das du verstehst wie es gemeint ist.
 
HAMMER GEIL einfach derbst ^^ hab solche freude das es geht :D

1.
Was noch geil wäre wenn er den Display nicht leert wen man auf den Operator klickt also das er das Display erst wieder leert nach dem ich eine zweite Zahl eingebe oder das Gleich drücke.

2. Last but not least
Mit Klammern rechnen
(3+3) * (3+3) = 36
 
Zuletzt bearbeitet:
Mist habe meinen Recner geschlossen und nicht gespeichert. Deshalb jetzt mal eine Idee aus dem Kopf.

Du deklarierst im allgemeinen Teil eine zusätzliche Variable "clear" und weißt im im UserForm_Activate-Ereignis den Wert FALSE zu.

Bei allen Rechenarten änderst du den Wert von "clear" auf TRUE und bei allen Click-Ereignissen der einzelnen Zahlen prüfst du diesen Wert.

Visual Basic:
If clear = True Then
   lblErgebnis.Caption = ""
   clear = False
End If

Dann musst du nur noch an den Stellen an denen der Inhalt nicht gelöscht werden soll den entsprechenden Code löschen.

Das sollte so klappen. Ist aber wie gesagt jetzt nur aus dem Kopf und nicht getestet.
 
Also so wie ich das Verstehe einen neuen Sub machen die Variable clear definieren und dannach mit dem code belegen

was ich nicht verstehe was du mit der Userform_activate-ereignis meinst :)

Code:
           'diese Variablen müssen als Array jedoch ohne Dimension deklariert werden
Dim art()
Dim zahl()
dim clear()

sub clear
If clear = True Then
   lblErgebnis.Caption = ""
   clear = False
End If
end sub

            'In den nächsten Schritten werden die Buttons den Zeichen beigesetzt
Private Sub cb0_Click()
        lblErgebnis.Caption = lblErgebnis.Caption & "0"
End Sub

Private Sub cb1_Click()
        lblErgebnis.Caption = lblErgebnis.Caption & "1"
End Sub
 
Private Sub cb2_Click()
        lblErgebnis.Caption = lblErgebnis.Caption & "2"
End Sub
 
Private Sub cb3_Click()
        lblErgebnis.Caption = lblErgebnis.Caption & "3"
End Sub
 
Private Sub cb4_Click()
        lblErgebnis.Caption = lblErgebnis.Caption & "4"
End Sub
 
Private Sub cb5_Click()
        lblErgebnis.Caption = lblErgebnis.Caption & "5"
End Sub

Private Sub cb6_Click()
        lblErgebnis.Caption = lblErgebnis.Caption & "6"
End Sub

Private Sub cb7_Click()
        lblErgebnis.Caption = lblErgebnis.Caption & "7"
End Sub

Private Sub cb8_Click()
        lblErgebnis.Caption = lblErgebnis.Caption & "8"
End Sub

Private Sub cb9_Click()
        lblErgebnis.Caption = lblErgebnis.Caption & "9"
End Sub

Private Sub cbPunkt_Click()
        lblErgebnis.Caption = lblErgebnis.Caption & "."
End Sub

Private Sub cdPi_Click()
        lblErgebnis.Caption = lblErgebnis.Caption & "3.14"
End Sub
            'In den nächsten Schritten werden die Rechenarten beschrieben
Private Sub cbHoch_Click()
 
ReDim Preserve art(UBound(art) + 1)
 
        art(UBound(art)) = "x^y"
ReDim Preserve zahl(UBound(zahl) + 1)
        zahl(UBound(zahl)) = lblErgebnis.Caption
        lblErgebnis.Caption = ""
End Sub

Private Sub cbMinus_Click()
 
ReDim Preserve art(UBound(art) + 1)
 
        art(UBound(art)) = "-"
ReDim Preserve zahl(UBound(zahl) + 1)
        zahl(UBound(zahl)) = lblErgebnis.Caption
 
End Sub

Private Sub cbMal_Click()
 
ReDim Preserve art(UBound(art) + 1)
 
        art(UBound(art)) = "*"
ReDim Preserve zahl(UBound(zahl) + 1)
        zahl(UBound(zahl)) = lblErgebnis.Caption
        lblErgebnis.Caption = ""
End Sub

Private Sub cbPlus_Click()
 
ReDim Preserve art(UBound(art) + 1)
 
        art(UBound(art)) = "+"
ReDim Preserve zahl(UBound(zahl) + 1)
        zahl(UBound(zahl)) = lblErgebnis.Caption
        lblErgebnis.Caption = ""
 
End Sub

Private Sub cbGeteilt_Click()
 
ReDim Preserve art(UBound(art) + 1)
 
        art(UBound(art)) = "/"
ReDim Preserve zahl(UBound(zahl) + 1)
        zahl(UBound(zahl)) = lblErgebnis.Caption
        lblErgebnis.Caption = ""
End Sub

Private Sub cbWurzel_Click()
 
ReDim Preserve art(UBound(art) + 1)
 
        art(UBound(art)) = "^(0.5)"
ReDim Preserve zahl(UBound(zahl) + 1)
        zahl(UBound(zahl)) = lblErgebnis.Caption
        lblErgebnis.Caption = ""
End Sub

Private Sub cbclearformel_Click()
        LstFormel.clear
            'Listbox löschen
        MsgBox ("Die Liste wurde erfolgreich geleert")
End Sub

Private Sub cbClearrechnung_Click()
        lblErgebnis.Caption = ""
        MsgBox ("Die Rechnung wurde erfolgreich gelöscht")
 
            'die Arrays zurücksetzen
ReDim art(0)
ReDim zahl(0)
End Sub
            'Hier kommt die eigentliche Rechnung
Private Sub cbGleich_Click()
            'neu dimensionieren und letzte Zahl zuweisen
ReDim Preserve zahl(UBound(zahl) + 1)
        zahl(UBound(zahl)) = lblErgebnis.Caption
        lblErgebnis.Caption = ""
            'ersten Teil der Formel erstellen
        formel = zahl(1) & " "
            'erste Zahl zur Berechnung an Variable übergeben
        ergebnis = zahl(1)
 
            'in Schleife alle weiteren Zahlen und Rechenarten durchlaufen und den Variablen ergebnis und formel entsprechend übergeben
            
For a% = 2 To UBound(zahl)
    If art(a% - 1) = "+" Then
        ergebnis = ergebnis + CDbl(zahl(a%))
    ElseIf art(a% - 1) = "-" Then
        ergebnis = ergebnis - CDbl(zahl(a%))
    ElseIf art(a% - 1) = "*" Then
        ergebnis = ergebnis * CDbl(zahl(a%))
    ElseIf art(a% - 1) = "/" Then
        ergebnis = ergebnis / CDbl(zahl(a%))
    ElseIf art(a% - 1) = "x^y" Then
        ergebnis = ergebnis ^ CDbl(zahl(a%))
    ElseIf art(a% - 1) = "^(0.5)" Then
        ergebnis = ergebnis ^ (0.5)
    End If
            'Formel definieren für die Listbox
        formel = formel & art(a% - 1) & " " & zahl(a%) & " "
Next a%
 
            'an die Formel das "=" und das tatsächliche Ergebnis anhängen und in Liste eintragen
        formel = formel & " = " & ergebnis
        LstFormel.AddItem "Ihre vorherige Rechnung lautete:"
        LstFormel.AddItem formel
            'Ergebnis in Textfeld eintragen
        lblErgebnis.Caption = ergebnis
 
            'Arrays auf die Dimension 0 setzen
End Sub

Private Sub UserForm_Activate()
ReDim art(0)
ReDim zahl(0)
 
End Sub
 
So jetzt habe ich selber auch noch was gelernt.

Die ganze Berechnung kann viel einfacher gemacht werden, nämlich mit der "Evaluate" Funktion. Damit ist es möglich das Ergebnis einer als Text/String vorliegenden Formel zu berechnen.

Hier deshalb die neue Version inklusive Klammerberechnung:

Visual Basic:
Dim wert()
Dim clear As Boolean
 
Private Sub cb1_Click()
If clear = True Then
    lblErgebnis.Caption = ""
    clear = False
End If
lblErgebnis.Caption = lblErgebnis.Caption & "1"
End Sub
 
Private Sub cb2_Click()
If clear = True Then
    lblErgebnis.Caption = ""
    clear = False
End If
lblErgebnis.Caption = lblErgebnis.Caption & "2"
End Sub
 
Private Sub cb3_Click()
If clear = True Then
    lblErgebnis.Caption = ""
    clear = False
End If
lblErgebnis.Caption = lblErgebnis.Caption & "3"
End Sub
 
Private Sub cb4_Click()
If clear = True Then
    lblErgebnis.Caption = ""
    clear = False
End If
lblErgebnis.Caption = lblErgebnis.Caption & "4"
End Sub
 
Private Sub cb5_Click()
If clear = True Then
    lblErgebnis.Caption = ""
    clear = False
End If
lblErgebnis.Caption = lblErgebnis.Caption & "5"
End Sub
 
Private Sub cb6_Click()
If clear = True Then
    lblErgebnis.Caption = ""
    clear = False
End If
lblErgebnis.Caption = lblErgebnis.Caption & "6"
End Sub
 
Private Sub cbClear_Click()
lblErgebnis.Caption = ""

ReDim wert(0)
clear = False
End Sub
 
Private Sub cbGleich_Click()
'zuerst die Zahl übernehmen
ReDim Preserve wert(UBound(wert) + 1)
wert(UBound(wert)) = lblErgebnis.Caption

For a% = 1 To UBound(wert)
    formel = formel & wert(a%)
Next a%

'Ergebnis in Textfeld eintragen
lblErgebnis.Caption = Evaluate(formel)

lstFormel.AddItem formel & " = " & lblErgebnis.Caption
formel = ""

End Sub
 
Private Sub cbKlammerAuf_Click()
'zuerst die Zahl übernehmen
ReDim Preserve wert(UBound(wert) + 1)
wert(UBound(wert)) = lblErgebnis.Caption
'dann dieses Zeichen
ReDim Preserve wert(UBound(wert) + 1)
wert(UBound(wert)) = "("
lblErgebnis.Caption = ""
End Sub

Private Sub cbKlammerZu_Click()
'zuerst die Zahl übernehmen
ReDim Preserve wert(UBound(wert) + 1)
wert(UBound(wert)) = lblErgebnis.Caption
'dann dieses Zeichen
ReDim Preserve wert(UBound(wert) + 1)
wert(UBound(wert)) = ")"
lblErgebnis.Caption = ""
End Sub

Private Sub cbMal_Click()
'zuerst die Zahl übernehmen
ReDim Preserve wert(UBound(wert) + 1)
wert(UBound(wert)) = lblErgebnis.Caption
'dann dieses Zeichen
ReDim Preserve wert(UBound(wert) + 1)
wert(UBound(wert)) = "*"
lblErgebnis.Caption = ""
End Sub

Private Sub cbMinus_Click()
'zuerst die Zahl übernehmen
ReDim Preserve wert(UBound(wert) + 1)
wert(UBound(wert)) = lblErgebnis.Caption
'dann dieses Zeichen
ReDim Preserve wert(UBound(wert) + 1)
wert(UBound(wert)) = "-"
lblErgebnis.Caption = ""
End Sub
 
Private Sub cbPlus_Click()
'zuerst die Zahl übernehmen
ReDim Preserve wert(UBound(wert) + 1)
wert(UBound(wert)) = lblErgebnis.Caption
'dann dieses Zeichen
ReDim Preserve wert(UBound(wert) + 1)
wert(UBound(wert)) = "+"
lblErgebnis.Caption = ""
End Sub
 
Private Sub UserForm_Activate()
 
ReDim wert(0)

clear = False
End Sub
 
Zu deiner Frage von oben auch wenn es sich im Grunde ja erledigt hat.

Visual Basic:
Private Sub UserForm_Activate()

ReDim art(0)
ReDim zahl(0)
 
End Sub

Diese Prozedur solltest du auch noch ändern und "clear = False" reinschreiben damit die Variable gleich mit einem gültigen Wert belegt ist.
 
hmm Sobald ich mit der Klammer rechne bringt der mir nun einen fehler

Compile Error:
Sub or Function not defined
Evaluate angeschrichen im cbGleich_Click()

Code:
Private Sub cbGleich_Click()
'zuerst die Zahl übernehmen
ReDim Preserve wert(UBound(wert) + 1)
wert(UBound(wert)) = lblErgebnis.Caption
 
For a% = 1 To UBound(wert)
    formel = formel & wert(a%)
Next a%
 
'Ergebnis in Textfeld eintragen
lblErgebnis.Caption = Evaluate(formel)
 
LstFormel.AddItem formel & " = " & lblErgebnis.Caption
formel = ""
 
End Sub
 
Zurück