# VBA Klausur



## MeisterMorris (28. Juni 2008)

Hallo erstmal,

ich habe ein Kleines Problem, ich schreibe am Dienstag eine VBA Klausur und komme mit der uns mitgebenen Probeklausur nicht ganz zurecht.
Aufgabenstellung:

Erstellen sie eine VBA-Prozedur zur Abarbeitung folgenden Problems.
Bei einem Wissenvergleich zweier Schulen gibt es 3 Medaillen oder nichts.(Gold, Silber, Bronze oder nichts)
Für Gold müssen mindestens 93-100 Punkte erreicht werden
Für Silber sind Punkte zwischen 92- 85 erforderlich
Für Bronze 75-84.
Bei weniger nichts.

So hier nun mein Ansatz:


```
Public Sub Medaillienspiegel()
Dim Punkte As Integer
Punkte = InputBox("Geben Sie bitte die erreichten Punkte ein:", " Medaillienspiegel")
If Punkte < 84 Then
MsgBox "über 75 bis 84 Punkte gibt es Bronze, über 85 bis 92 gibt es Silber und über 93 Gold.Ansonsten nichts.", vbInformation, "Medaillienspiegel"
Punkte = Punkte
ElseIf Punkte < 75 Then
Punkte = Bronze
ElseIf Punkte < 85 Then
Punkte = Silber
ElseIf Punkte >= 100 Then
Punkte = Gold
End If
MsgBox "Die erreichte Medaille lautet " & Punkte, vbInformation, "Medaillienspiegel"
End Sub
```


Mein Problem ist jetzt einfach, das er mir die Zahl als Ergebnis liefert statt dem Begriff Gold Silber Bronze.
Kann mir da jemand helfen Schon mal recht lieben Danke für die Hilfe


Gruß Maurice


----------



## muddin (28. Juni 2008)

Hi!
Also in deinem Fall sind Gold, Silber, Broze einfach Variablen. Hättest du Strings zuweisen wollen, hättest du Punkte="Gold" usw. schreiben müssen. Das wird aber nicht funktionieren, weil Punkte vom Typ Integer ist. Nimm doch einfach eine Zusatzvariable Medallie vom Typ String. Dann weist du je nachdem wo du dich grad innerhalb deines IF...ELSE Konstrukts befindest "Gold", "Silber" oder "Bronze" zu.

mfg,
Muddin


----------



## MeisterMorris (28. Juni 2008)

Hallo,

und wie weise ich da Strings zu 


Gruß Maurice


----------



## muddin (28. Juni 2008)

Na so wie du es mit dem Integer gemacht hast 
Erst eine String-Variable definieren:

Dim medallie as String

einen Wert zuweisen:
medallie = "Gold"

Mir ist grad aufgefallen, dass deine IF...ELSE Struktur falsch ist, so wird das nicht rauskommen, was gefordert ist. Guck dir die nochmal genau an!

mfg,
Muddin


----------



## MeisterMorris (28. Juni 2008)

Hallo Muddin,

also er zeigt mir jetzt schon meine Begriffe nun taucht ein neues Problem auf, das sobald die Punkte unter 75 sind mir die zahl angezeigt wird statt dem Wort nichts.


```
Public Sub Medaillienspiegel()
Dim Punkte As String
Punkte = InputBox("Geben Sie bitte die erreichten Punkte ein:", " Medaillienspiegel")
If Punkte < 74 Then
MsgBox "über 75 bis 84 Punkte gibt es Bronze, über 85 bis 92 gibt es Silber und über 93 Gold.Ansonsten nichts.", vbInformation, "Medaillienspiegel"
Punkte = Punkte
ElseIf Punkte < 74 Then
Punkte = "Nichts"
ElseIf Punkte < 85 Then
Punkte = "Bronze"
ElseIf Punkte < 93 Then
Punkte = "Silber"
ElseIf Punkte <= 100 Then
Punkte = "Gold"
End If
MsgBox "du hast folgende Medaille gewonnen: " & Punkte, vbInformation, "Medaillenspiegel"
End Sub
```


Gruß Maurice


----------



## muddin (28. Juni 2008)

Also eigentlich solltest du zwei Variablen definieren. Eine Variable beinhaltet die Punkte, die andere eines der Wörter. So schmeißt du die Typen, und die Werte die verglichen werden sollen durcheinander - leider erlaubt das VBA, und bei Anfängern sorgt das für verwirrung...ok, dann wollen wir mal "Entwirren" 
Gedacht war das so:


```
Public Sub Medaillienspiegel()
dim punkte as Integer 'Diese Variable beinhaltet die Punkte
dim medallie as String 'Diese Variable beinhaltet eine Zeichenkette für die Medallie
punkte = InputBox("Geben Sie bitte die erreichten Punkte ein:", " Medaillienspiegel")
```
So, jetzt haben wir erstmal zwei Variablen definiert. Die Variable vom typ Integer speichert Ganzzahlen, die vom Typ String kann Zeichenketten beinhalten. Das verwirrende bei VBA ist aber, dass man auch Zeichenketten wie "100" mit Ganzzahlen vergleichen kann - das macht VB automatisch, wenn möglich...(leider). Und "100" ist nicht 100 - das eine ist eine Zeichenkette, das andere eine Zahl. VB(A) geht sehr tolerant mit zuweisungen zwischen verschiedenen Variablentypen um. Spätestens wenn du eine vernünftige Programmiersprache erlernen möchtest, dich aber an die "Arbeitsweise" von VB(A) gewöhnt hast, gibt's Probleme. Darum halte ich VB(A) für die schlimmste Sprache für Anfänger. So, nun geht's weiter 
Dein IF..ELSE kann doch garnicth funktionieren! Du "fragst" zweinmal nach dem Wert 75! Da wird natürlich IMMER der erste genommen. Es funktioniert, wenn du schreibst:

```
MsgBox "über 75 bis 84 Punkte gibt es Bronze, über 85 bis 92 gibt es Silber und über 93 Gold.Ansonsten nichts.", vbInformation, "Medaillienspiegel"
'Soll die MsgBox nur angezeigt werden, wenn punkte < 75?
If punkte > 74 Then
Medallie = "Bronze"
ElseIf punkte > 85 Then
Medallie = "Silber"
ElseIf punkte > 92 Then
Medallie = "Gold"
Else
Medallie = "keine Medallie"
End If
MsgBox "Die erreichte Medaille lautet " & Medallie, vbInformation, "Medaillienspiegel"
End Sub
```

mfg,
Muddin


----------



## MeisterMorris (28. Juni 2008)

Ohhh super vielen Dank,

das werde ich gleich nochmal ausprobieren. Wir haben einen total blöden Leherer.Kommt null vorbereitet in den Unterricht und will uns dann etwas beibringen. Naja sieht man ja was dabei rausgekommen ist.
Die MSGBox sollte nur <75 angezeigt werden.


Gruß Maurice


----------



## Gloem (30. Juni 2008)

So etwas macht man normalerweise zur besseren Übersicht mit Select. In VB können hier zudem ganz einfach Grenzen eingegeben werden. Für Lösungen mit else und elsif würde ich als Prof Punkte abziehen


----------

