Hi Daniel,
das erste unschöne "Problem" was mir auffällt, ist, dass die Prozedur je nach anzahl Durchläufen auf dem Stack zurückbleibt.
Will sagen, dass die Prozeduren nicht ordentlich abgeschlossen/abgearbeitet werden, sollte sich der Anwender dazu entscheiden, nochmal einen Lauf durchzuführen.
Bei diesem Beispiel und mit geringer anzahl an Durchläufen ist das sicherlich unbedenklich. Wenn sowas mal mit einer grössere Schleife dahinter programmiert wird, kann der Stapelspeicher überlaufen. Die Aufrufliste kann im VB-Editor über die Menüleiste Ansicht | Aufrufliste angeschaut werden. (Stichwort: Rekursive Programmierung)
Beispiel bei zwei Durchläufen:
Empfehlung:
Schreib Dir eine Einstiegsprozedur und lagere Deine jetzige Sub in eine Funktion aus, deren Rückgabewert die Antwort auf die Frage sein wird, ob noch ne Runde gedreht werden soll oder nicht. Damit ist das Problem vom Stapel.
Sum / averag / biggestnumber:
Verwende hier doch schön sauber:
- WorksheetFunction.Max()
- WorksheetFunction.Sum()
- WorksheetFunction.Average()
Das Ganze in ein Array dimensionieren - die Dimension liefert Dir die erste Inputbox().
Nicht grossartig verändert und Deiner Programmlogik folgend, schaut Deine Code bei mir jetzt wie folgt aus:
Sub main()
SumAndAverage
End Sub
Function SumAndAverage() As Integer
Dim numbers() As Double
Dim average As Double
Dim sum As Double
Dim biggestnumber As Double
Dim i As Double
Dim total As Variant
Dim answer As Integer
total = InputBox("How many numbers do you want to enter?")
If total = "" Then
Exit Function
Else
ReDim total(1 To total) 'einsbasiert
ReDim numbers(1 To UBound(total))
End If
For i = 1 To UBound(total)
numbers(i) = InputBox("Enter some numbers!", "enter numbers")
Next i
sum = WorksheetFunction.sum(numbers())
average = WorksheetFunction.average(numbers())
biggestnumber = WorksheetFunction.Max(numbers())
MsgBox "The result is:" & Chr(10) & _
"sum : " & sum & Chr(10) & _
"average : " & average & Chr(10) & _
"biggest number : " & biggestnumber
answer = MsgBox("Do you want to do another calculation?", vbYesNo + vbQuestion)
SumAndAverage = answer
End Function
Das Programm startet in der Prozedur Main(), welche lediglich die Funktion ohne Parameter ausführt.
Wenn die Funktion durchlaufen wurde, wird Dir nun die Antwort bzw dessen Integer-Wert auf die Frage "Do you want to do another calculation" zurückgegeben, aber die Funktion beendet.
Jetzt kannste mit ner Schleife die Antwort.
- vbYES rüft die Funktion wieder auf
- vbNO beendet die Prozedur Main() und der Käs' ist gegessen.
|