# VBA Taschenrechner mit Listbox



## psycoshooter (22. Februar 2011)

Hallo zusammen

Ich bin momentan gerade ein bisschen am anschlag und zwar habe ich meinen Taschenrechner fertig Programmiert mit VBA und wollte nun noch eine Listbox erstellen die folgendes Beinhaltet: "Zahl" "Operator" "Zahl" = "Ergebnis" also z.B 2 + 2 = 4

bitte helft mir.. danke 


```
Dim Zahl1 As String
Dim Rechenart As String

Private Sub cmd0_Click()
        txtErgebnis = txtErgebnis + "0"
    'Display = Display + 0
End Sub

Private Sub cmd1_Click()
        txtErgebnis = txtErgebnis + "1"
    'Display = Display + 1
End Sub

Private Sub cmd2_Click()
        txtErgebnis = txtErgebnis + "2"
    'Display = Display + 2
End Sub

Private Sub cmd3_Click()
        txtErgebnis = txtErgebnis + "3"
    'Display = Display + 3
End Sub

Private Sub cmd4_Click()
        txtErgebnis = txtErgebnis + "4"
    'Display = Display + 4
End Sub

Private Sub cmd5_Click()
        txtErgebnis = txtErgebnis + "5"
    'Display = Display + 5
End Sub

Private Sub cmd6_Click()
        txtErgebnis = txtErgebnis + "6"
    'Display = Display + 6
End Sub

Private Sub cmd7_Click()
        txtErgebnis = txtErgebnis + "7"
    'Display = Display + 7
End Sub

Private Sub cmd8_Click()
        txtErgebnis = txtErgebnis + "8"
    'Display = Display + 8
End Sub
Private Sub cmd9_Click()
        txtErgebnis = txtErgebnis + "9"
    'Display = Display + 9
End Sub
Private Sub cmdKomma_Click()
        txtErgebnis = txtErgebnis + "."
    'Display = Display + .
End Sub

                'Nun kommen die Rechenarten
            
Private Sub cmdPlus_click()
        Zahl1 = txtErgebnis
    'die Variable soll genau den Wert des Displays erhalten
        Rechenart = "addieren"
    'Variable "Rechenart" soll den Wert "addieren" erhalten
        txtErgebnis = ""
    'Display leeren
End Sub

Private Sub cmdMinus_click()
        Zahl1 = txtErgebnis
    'die Variable soll genau den Wert des Displays erhalten
        Rechenart = "subtrahieren"
    'Variable "Rechenart" soll den Wert "subtrahieren" erhalten
        txtErgebnis = ""
    'Display leeren
End Sub

Private Sub cmdGeteilt_click()
        Zahl1 = txtErgebnis
    'die Variable soll genau den Wert des Displays erhalten
        Rechenart = "dividieren"
    'Variable "Rechenart" soll den Wert "dividieren" erhalten
        txtErgebnis = ""
    'Display leeren
End Sub

Private Sub cmdMal_click()
        Zahl1 = txtErgebnis
    'die Variable soll genau den Wert des Displays erhalten
        Rechenart = "multiplizieren"
    'Variable "Rechenart" soll den Wert "multiplizieren" erhalten
        txtErgebnis = ""
    'Display leeren
End Sub

Private Sub cmdHoch_click()
        Zahl1 = txtErgebnis
    'die Variable soll genau den Wert des Displays erhalten
        Rechenart = "potenzieren"
    'Variable "Rechenart" soll den Wert "potenzieren" erhalten
        txtErgebnis = ""
    'Display leeren
End Sub

                'Hiermit wird alles gelöscht
                
Private Sub cmdClear_click()
        txtErgebnis = ""
        Zahl1 = ""
    'Variable und Display löschen
End Sub
                'Hier kommt die eigentliche Rechnung
                
Private Sub cmdGleich_click()
    If Rechenart = "addieren" Then
        txtErgebnis = CDbl(Zahl1) + CDbl(txtErgebnis)
    'mit cdbl() wird der jeweilige Inhalt in Zahlen umgewandelt
    ElseIf Rechenart = "subtrahieren" Then
        txtErgebnis = CDbl(Zahl1) - CDbl(txtErgebnis)
    ElseIf Rechenart = "multiplizieren" Then
        txtErgebnis = CDbl(Zahl1) * CDbl(txtErgebnis)
    ElseIf Rechenart = "dividieren" Then
        txtErgebnis = CDbl(Zahl1) / CDbl(txtErgebnis)
    ElseIf Rechenart = "potenzieren" Then
        txtErgebnis = CDbl(Zahl1) ^ CDbl(txtErgebnis)
    End If
End Sub

Private Sub ListBox1_Click()

ListBox1.AddItem "cmdGleich", ["Zahl1" & "Rechenart" & "txtErgebnis"]
End Sub
```


----------



## tombe (22. Februar 2011)

Ich versteh nicht so ganz was du haben willst.

Es soll das dargestellt werden was du zum Berechnen eingibst oder? Wieso dann aber eine Listbox?


----------



## psycoshooter (22. Februar 2011)

Ich will, dass wen ich z.B 5+5 = 10 rechne und dan C drücke (Reset) das dan das in der listbox angezeigt wird.. also sozusagen die vorher gerechnete gleichung,,, 

dann kann ich nähmlich weiterrechnen und sehe rechts die vorher gerechnete aufgabe 

________________________________________
was auch noch ist.. vieleicht weisst du gerade warum.. beim Hoch rechnen--> 2 hoch 2 ergibt 4 das stimmt auch bei meinem rechner
3 hoch 3 ergibt bei meinem rechner aber schon 27 sollte aber 9 ergeben ,,


----------



## tombe (22. Februar 2011)

Wenn ich das richtig sehe, dann steht in "txtErgebnis" ja immer die aktuelle "Formel".

Dann kannst du entweder beim Klick auf "C" oder auch auf "=" folgenden Code schreiben


```
Liste.Additem txtErgebnis.Text
```


----------



## psycoshooter (22. Februar 2011)

Danke, nun ist es auch möglich die ganze gleichung da reinzubringen also das da dann schluss entlich steht 2+2=4 ?


----------



## tombe (22. Februar 2011)

```
Private Sub cmdGleich_click()
'Inhalt von txtErgebnis zwischenspeichern
formel = txtErgebnis

    If Rechenart = "addieren" Then
        txtErgebnis = CDbl(Zahl1) + CDbl(txtErgebnis)
    'mit cdbl() wird der jeweilige Inhalt in Zahlen umgewandelt
    ElseIf Rechenart = "subtrahieren" Then
        txtErgebnis = CDbl(Zahl1) - CDbl(txtErgebnis)
    ElseIf Rechenart = "multiplizieren" Then
        txtErgebnis = CDbl(Zahl1) * CDbl(txtErgebnis)
    ElseIf Rechenart = "dividieren" Then
        txtErgebnis = CDbl(Zahl1) / CDbl(txtErgebnis)
    ElseIf Rechenart = "potenzieren" Then
        txtErgebnis = CDbl(Zahl1) ^ CDbl(txtErgebnis)
    End If

'Formel und Ergebnis in Liste eintragen
ListBox1.Additem formel & " = " & txtErgebnis
End Sub
```

Wenn du das dann später wieder auslesen willst, musst du alles rechts vom "=" abschneiden.

Ungetestet, aber sollte so gehen.


----------



## psycoshooter (22. Februar 2011)

He He jetzt haben wirs dan gleich  

nun steht einfach 1 = 2 bei der rechnung 1 + 1 = 2 ^^ weisste an was das liegt ? er nimmt irgendwie nur eine der beiden zahlen


----------



## tombe (22. Februar 2011)

Ich habe das jetzt bei mir teilweise mal nachgebaut. Die Prozedur die aufgerufen wird wenn auf "=" geklickt wird sieht bei mir so aus:



```
Private Sub cbGleich_Click()
If art = "+" Then
    ergebnis = CDbl(zahl) + CDbl(lblErgebnis.Caption)
ElseIf art = "-" Then
    ergebnis = CDbl(zahl) - CDbl(lblErgebnis.Caption)
End If

lstBox.AddItem CDbl(zahl) & " " & art & " " & CDbl(lblErgebnis.Caption) & " = " & CDbl(ergebnis)
lblErgebnis.Caption = ergebnis
zahl = 0
End Sub
```

"art" ist das Rechenzeichen
"ergebnis" ist zum Zwischenspeichern des Ergebnisses
"zahl" enthält die zuerst eingegebene Zahl


----------



## psycoshooter (22. Februar 2011)

'Hier kommt die eigentliche Rechnung
Private Sub cmdGleich_click()

    'Inhalt von txtErgebnis zwischenspeichern
formel = txtErgebnis

    If Rechenart = "+" Then
        txtErgebnis = CDbl(Zahl1) + CDbl(txtErgebnis)

    'mit cdbl() wird der jeweilige Inhalt in Zahlen umgewandelt
    ElseIf Rechenart = "-" Then
        txtErgebnis = CDbl(Zahl1) - CDbl(txtErgebnis)

    ElseIf Rechenart = "*" Then
        txtErgebnis = CDbl(Zahl1) * CDbl(txtErgebnis)

    ElseIf Rechenart = "/" Then
        txtErgebnis = CDbl(Zahl1) / CDbl(txtErgebnis)

    ElseIf Rechenart = "xX" Then
        txtErgebnis = CDbl(Zahl1) ^ CDbl(txtErgebnis)

    End If

    'Formel und Ergebnis in Liste eintragen
ListBox1.AddItem CDbl(Zahl1) & " " & (Rechenart) & " " & CDbl(txtErgebnis) & " = " & CDbl(txtErgebnis)
End Sub


Hmm entweder zu müde oder eifach zu dumm bis jetzt immer mehr erfolg 
Rechnung: 1 + 1 = 2
Anzeige in Listbox 1 + 2 = 2
das heisst der nimmt das Ergebnis auch als zweitzahl ....


----------



## tombe (23. Februar 2011)

Du darfst das Ergebnis nicht gleich dem Textfeld "txtErgebnis" zuweisen sondern musst es in einer Variablen zwischenspeichern (siehe mein Beispiel und die Variable "ergebnis").

Dann erstellst du die Formel und trägst sie in die Liste ein:


```
ListBox1.AddItem CDbl(Zahl1) & " " & (Rechenart) & " " & CDbl(txtErgebnis) & " = " & CDbl(DEINE_ERGEBNISVARIABLE)
```

und dann trägst du das Ergebnis in das Text-/Bezeichnungsfeld ein:


```
txtErgebnis = CDbl(DEINE_ERGEBNISVARIABLE)
```


----------



## psycoshooter (23. Februar 2011)

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


----------



## tombe (23. Februar 2011)

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:


```
'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.


----------



## psycoshooter (23. Februar 2011)

Super, ich setzt mich mal dahinter ich danke dir für all deine mühe und deine Hilfe.
Ohne dich wäre ich jetzt ziemlich aufgeschmissen. 

Danke


----------



## psycoshooter (23. Februar 2011)

HAMMER GEIL einfach derbst ^^ hab solche freude das es geht 

 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


----------



## tombe (23. Februar 2011)

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.


```
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.


----------



## psycoshooter (23. Februar 2011)

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 


```
'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
```


----------



## tombe (23. Februar 2011)

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:


```
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
```


----------



## tombe (23. Februar 2011)

Zu deiner Frage von oben auch wenn es sich im Grunde ja erledigt hat.


```
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.


----------



## psycoshooter (23. Februar 2011)

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()


```
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
```


----------



## tombe (23. Februar 2011)

Dann stellt sich jetzt die Frage womit arbeitest/programmierst du eigentlich****?


----------



## psycoshooter (23. Februar 2011)

VBA Word Userforms


----------



## tombe (23. Februar 2011)

Ok, ich teste hier mit den UserForms von Excel. Wenn du nicht aktueller als Word/Office 2000 bist, dann stelle die Datei mal hier rein.

Könnte einen anderen Grund haben den ich so jetzt nicht finde.


----------



## psycoshooter (23. Februar 2011)

Ok also das mit den Klammern funtzt in Excel
war wol das problem...

aber die Zahlen werden immernoch vom Display gelöscht wenn man einen Operator drückt...


----------



## tombe (23. Februar 2011)

Dann steht bei "+", "-", "*" und/oder "/" irgendwo noch lblErgebnis.Caption = "" drin wo es nicht hingehört.

Bei mir klappt es so:


```
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)) = "*"
clear = True
End Sub
```


----------



## psycoshooter (23. Februar 2011)

jop das wars  geile sache danke dir viel mals 

für heute is schluss


----------



## psycoshooter (24. Februar 2011)

So der Rechner ist nun für mich fertig.. danke dir für alles 

jetzt wollte ich di
ch mal fragen ob du irgend ne HP kennst wo folgende befehle beschrieben sind da wir das VBA programm noch dokumentieren müssen:

art(a% - 1) vorallem das a% - 1
zahl(UBound(zahl)) = lblErgebnis.Caption vorallem UBound

oder kannst du mir diese kurz und bündig beschreiben was diese befehle genau machen


----------



## tombe (24. Februar 2011)

Also die UBound Anweisung sollte in der Excel Hilfe beschrieben sein, aber egal.

Normalerweise ist ein Array mit einer bestimmten "Größe" definiert.


```
Dim variable(5)
```

Mit Redim kann es neu dimensioniert und die Größe verändert werden. Nimmt man dann noch Preserve dazu, bleiben die bereits im Array enthaltenen Werte erhalten.


```
'zuerst ohne Wert deklarieren
Dim variable()
'neue Dimension festlegen, Werte gehen verloren
Redim variable(5)
'nochmal neue Dimension, Werte bleiben erhalten
Redim Preserve variable(10)
```


Mit a% -1 wird einfach der Zeiger des Arrays entsprechend verändert.


----------



## psycoshooter (28. Februar 2011)

Hey

Habe doch noch ein Problem beim Calc

Die Rechen weise mit einer Division durch 0 ist ja Unzulässig,,, wie kann ich diese mit einer MSG box erläutern und den Sub dann verlassen ?

ansonsten will er das immer Debuggen

Danke


----------



## tombe (28. Februar 2011)

Wenn du keine gezielte Fehlerbehandlung willst, kannst du es so lösen


```
Sub irgendwas()
On Error Goto fehler
'hier der eigentliche Code
Exit Sub
fehler:
MsgBox Err.Description
End Sub
```

Diesen Code trägst du überall dort ein wo eventuell Fehler entsehen können. Wenn du bestimmte Fehler besonders behandeln willst, kannst du in einem IF-Block prüfen welcher Fehler aufgetreten ist indem du Err.Number prüfst.


----------



## psycoshooter (14. März 2011)

Hey, Wollte dich mal noch fragen was er hier genau macht:

Private Sub cbGleich_Click()
            'Zahl übernehmen und eintragen
        ReDim Preserve zahl(UBound(zahl) + 1)
        zahl(UBound(zahl)) = lblErgebnis.Caption

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

Vorallem die For Next schlaufe versteh ich ned  Fals der Lehrer fragt


----------



## tombe (15. März 2011)

Na das ist ja was ganz neues "...Falls der Lehrer fragt..."

Ich dachte du machst das für dich privat und nicht weil ihr es in der Schule als Aufgabe gestellt bekommt. Zu helfen ist eine Sache aber die "Hausaufgaben" zu lösen eine andere  !


Die SUB wird dann aufgerufen wenn auf "=" geklickt wird.
Was "ReDim Preserve" und "UBound" machen habe ich dir ja oben schon erklärt, das sollte also klar sein.

Dem Array "zahl" werden alle Werte (Zahlen, Operatoren, Klammern, ...) übergeben die zum Rechnen verwendet werden. In der FOR/NEXT Schleife wird dann einfach durch aneinanderreihen dieser Werte die Formel gebildet um sie in das Listenfeld einzutragen.


----------

