Wie Du in VBA Schleifen die Arbeit machen lassen kannst (Teil V)

Teil V der Artikelserie um die VBA-Programmierung von Schleifen widmet sich den While-Wend- und den For-Each-Schleifen. Letztendlich geht es auch hier darum, Verarbeitungsvorgänge automatisch zu wiederholen.

Die While-Wend-Schleife

Die While-Wend-Schleife ist prinzipiell gleich der Do-While-Schleife. Unterschiede sollen hinsichtlich der Dauer des Programmdurchlaufs bestehen. Das aber dürfte bei einfachen Makros nicht spürbar sein.

Die Syntax lautet so:   While <Ausdruck>

Wend

Eine Wend Schleife wird solange durchlaufen, bis der <Ausdruck> ‚falsch‘ ergibt. Wichtig zu wissen ist, dass wenn der erste Test ‚falsch‘ ergibt, gelangt die Programmausführung niemals zum Programmcode innerhalb der Schleife und überspringt diesen Teil.

Ein erstes Beispiel dazu:

Eine Variable soll solange um den Wert 1 erhöht werden, solange nicht 20 erreicht ist.

Sub WhileWend1()
Dim intZahl As Integer
intZahl=0
While intZahl <20
intZahl=intZahl+1
Wend
End Sub

Lässt Du dieses Programm laufen, bekommst Du das Ende nicht mit, denn es erfolgt keine Werteausgabe und keine Mitteilung über eine MsgBox.

Es soll daher ein Wert in eine Zelle ausgegeben werden, wenn die 19 erreicht ist.

Sub WhileWend2()
Dim intZahl As Integer
intZahl=0
While intZahl <20
intZahl=intZahl+1
If intZahl=19 Then
Range(„D407″)=“Grenzwert!“
End If
Wend
End Sub

WhileWend1

Im nächsten Beispiel soll eine Variable erhöht werden, solange die andere Variable einen bestimmten Wert hat. Ist der Grenzwert erreicht, soll er um 5 erhöht werden. Über eine MsgBox soll darüber informiert werden.

Sub WhileWend3()
Dim intA As Integer
Dim intB As Integer
intA=15
intB=0
While intA=15
intB=intB+1
If intB=15 Then
intA=20
MsgBox („Die Variable intA wurde auf „& intA &“ erhöht!“)
End If
Wend
End Sub

WhileWend2

Die MsgBox zeigt: „Die Variable intA wurde auf 20 erhöht!“.

Im nächsten Beispiel erhältst Du nach jedem Schleifendurchlauf eine Mitteilung über die Nr. des Durchlaufs.

Sub WhileWend4()
Dim intZahl As Integer
intZahl = 0
While intZahl <> 5
MsgBox „While-Schleife: “ & intZahl
intZahl = intZahl + 1
Wend
End Sub

Abschließend zu While-Wend noch zwei verschachtelte Schleifen.

Sub WhileWend5()
Dim intZahl1 As Integer
Dim intZahl2 As Integer
intZahl1 = 1
intZahl2 = 5
While intZahl1 < 7
While intZahl2 < 10
MsgBox (intZahl1 & „-“ & intZahl2)
intZahl2 = intZahl2 + 1
Wend
intZahl2 = 6
intZahl1 = intZahl1 + 1
Wend
End Sub

Zwei Variablen werden Werte zugewiesen. Es gibt eineäußere und eine innere Schleife. Die äußere Schleife achtet darauf, dass die Variable intZahl1 kleiner als 7 ist, bei 7 ist das Programm zuende. Die innere Schleife achtet darauf, dass die Variable intZahl2 kleiner als 10 ist. Mit einer MsgBox wird die Verkettung von intZahl1 und intZahl2 angezeigt.

Zuerst wird also 1-5 angezeigt.
Dann 1-6, dann 1-7, dann 1-8 und schließlich 1-9.
Jetzt erhöht sich intZahl1 auf 2 und gleichzeitig intZahl2 auf 6, so wird angezeigt:
2-6, dann 2-7, dann 2-8, dann 2-9. Das Gleiche passiert mit intZahl1 von 3 bis 6.

WhileWend3

Schreib Dir den Code am Besten in Dein Modul im VBA-Editor und klicke Dich durch.

Die For-Each-Schleife

Die For-Each-Schleife ist eine hochinteressante Angelegenheit. Sie arbeitet nicht mit Wahrheitswerten oder Zählern, sondern mit Objekten, die Auflistungen enthalten. Wieviele Elemente die Auflistung hat, ist nicht weiter wichtig, denn „For-Each“.

Ein erstes Beispiel: Du willst Dir durch eine MsgBox die Namen aller Arbeitsblätter (Worksheets) dieser Arbeitsmappe (ThisWorkbook) anzeigen lassen. Dazu deklarierst Du die Variable wsBlatt und schreibst den restlichen Code.

Sub Each1()
Dim wsBlatt As Worksheet
For Each wsBlatt In ThisWorkbook.Worksheets
MsgBox wsBlatt.name
Next wsBlatt
End Sub

Die MsgBox teilt Dir nun nacheinander die Namen aller Arbeitsblätter in Deiner Arbeitsmappe mit. Sind das mehr als 10, hast Du sicher ein Problem damit, jedesmal „OK“ auf der MsgBox zu klicken. Dir nur einen Teil anzeigen zu lassen, ergibt keinen Sinn, dann musst Du nicht mit „For-Each“ arbeiten.

Alternativ könntest Du Dir die Namen in einem Arbeitsblatt auflisten lassen, z.B. so: Du deklarierst zusätzlich eine Zählvariable und ordnest ihr z.B. den Wert 499 zu, das soll die erste Zeile sein.

Sub Each2()
Dim intZähler As Integer
Dim wsBlatt As Worksheet
intZähler=499
For Each wsBlatt In ThisWorkbook.Worksheets
Range(„H“&intZähler)=wsBlatt.name
intZähler=intZähler+1
Next wsBlatt
End Sub

Each1

Im nächsten Beispiel greifst Du auf einen Bereich mit Zahlenwerten zu. Alle Zellen in einem manuell markierten Bereich sollen fett geschrieben werden, wenn deren Wert größer als 150 ist. Im Bereich H514:H525 markierst Du ein paar Zellen (z.B. H515:H519) und lässt anschließend das folgende Makro laufen:

Sub Each3()
Dim objZelle As Object
For Each objZelle In Selection
If objZelle.Value > 150 Then
objZelle.Font.Bold = True
End If
Next objZelle
End Sub

Each2

Das hat dann auch so funktioniert.

In einem letzten Beispiel lässt Du Dir durch eine MsgBox die Werte des aktuellen Datenfeldes mitteilen: Dazu deklarierst Du zwei Variablen vom Typ Range (Bereich). Einmal rngZelle, das ist die gerade aktive Zelle und einmal rngWerte, das ist der Bereich, in dem Du schrittweise die Werte abfragst.

Sub Each4()
Dim rngZelle As Range
Dim rngWerte As Range
Set rngWerte=Range(„H531:H535“)
For Each rngZelle In rngWerte
MsgBox „Aktuelles Element hat den Wert: “ & rngZelle
Next
End Sub

Each3

Neu in diesem Code ist das Referenzieren, das geschieht durch die Anweisung „Set“.

Damit bin ich mit der Artikelserie rund um die VBA-Programmierung von Schleifen am Ende. In fünf Teilen habe ich Dir an einfachen Beispielen gezeigt, worum es geht und was Du so mit Schleifen machen kannst. Bestimmt werden Dir viele viele andere Anwendungsfälle einfallen.

Lass es mich doch wissen, was Du so probiert hast.

Advertisements

Autor: Gerhard Pundt

Auf meiner Site https://clevercalcul.wordpress.com geht es um die Tabellenkalkulation mit Excel. Es wird über Funktionen, Diagramme, Basiswissen u.a.m. geschrieben.

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s