Excel 2013 VBA Grundkurs

Datumsbereich markieren

Testen Sie unsere 1958 Kurse

10 Tage kostenlos!

Jetzt testen Alle Abonnements anzeigen
Wenn ein Datumsbereich markiert werden soll, ist es wichtig, dass Sie die "Richtung" einer For-Each-Schleife vorgeben können. Mit einer zweiten Schleife sorgen Sie dafür, dass die Datumswerte spaltenweise bearbeitet werden.

Transkript

Die nächste Aufgabe, die ich lösen möchte, ist "Ostern" zu markieren. Sprich: einen Bereich, einen Zeitraum von mehreren Tagen. Das klingt auf Anhieb erstmal so, als hätten wir das schon gelöst. MarkiereDiesenTag, ist doch alles schon da. Aber der Unterschied zwischen einem und mehreren Tagen ist, dass Sie in einer For/Each-Schleife nicht sicher vorhersagen können, wie die da durchwandert. Wenn Sie also sagen: "Ich würde am 18.4. beginnen, Karfreitag, und jetzt die nächsten Tage markieren, könnten Sie Pech haben, dass die For/Each-Schleife so durchwandert. Sie müssen also dafür sorgen, dass Sie sicher hier abwärts laufen. Und das ist die Herausforderung für diese Prozedur. Die schreibe ich schon mal vorne weg. Also, Sub MarkiereOstern. Und werde dort wie gewohnt Dim rngTag As Range benötigen. Sie könnten hier einwenden, warum schreibe ich eigentlich immer wieder diese lokale Variable. Es wäre doch viel praktischer, eine Modul-öffentliche da oben zu machen. Praktischer vielleicht, aber eben auch riskanter. Modul-öffentliche Variablen können von jeder Prozedur verändert werden. Es ist hier noch ungefährlich. Aber Ihr Code wird größer, größer, und irgendwann vergessen Sie, welche andere Prozedur das gemacht hätte. So ist es auf jeden Fall sicherer. Was ich zusätzlich noch brauche (das schreibe ich mal einfach drüber) ist eine zweite Variable, die spaltenweise arbeiten soll. Und das ist der feine Unterschied. Bisher haben wir aufgerufen For Each rng irgendwas - ich nehme schon mal die Spalte - in einem Bereich. Und damit war unklar, in welcher Richtung die Zellen durchwandert werden. Und das wird sich jetzt ändern. Ich werde hier die Columns benutzen. Also, es ist gezielt für jede Spalte in diesem Bereich. Ich mache schon mal das Next dahin. Einmal zum Gucken. Es wird also jetzt dieser Range als erster Range-Spalte bilden. Als nächster - dieser. Und in diesem Range mache ich dann noch mal eine For/Each-Schleife und dann weiß ich: aha, es wird spaltenweise und darin zellenweise, also abwärts gearbeitet. Das bedeutet, die äußere Schleife nimmt nur die Monatspalten. Und dadrin gibt es jetzt die gewohnte For Each rngTag In - und da müssen wir jetzt einfach die äußere nehmen - In rngSpalte. Next. Und damit Sie sehen, wie das funktioniert, mache ich erstmal nur mal ein Debug.Print. Also rngSpalte.AddressLocal. Dann sehen wir, welche Spalten markiert sind. Und damit es nicht so viel ist, lasse ich es erstmal dabei. Also markiert wird noch nichts, aber mit F5. Einmal Strg + G und ein bisschen größer anzeigen, und dann mit F5. Da sehen Sie B4 bis B34, C4 bis C34. Es sind also zum Schluss M4 bis M34. Das ist B4 bis B34. Und da ist M4 bis M34, erstmal Spaltenblöcke gebildet worden. Und dann innerhalb der Spalte. Wenn wir einmal Zugucken wollen, Debug.Print jetzt rngTag.AddressLocal. Da muss ich hier nochmal einmal aufräumen. Und dann wird da unten jetzt richtig viel reingeschrieben. Aber Sie werden gleich sehen, da gibt es noch eine kleine Überraschung. Deswegen ist dieses Debug.Print ganz hilfreich. Einmal mit F5 laufen lassen. Und Sie sehen, da werden keine Einzelzellen genannt, sondern immer wieder Blöcke. Deswegen müssen wir darauf achten, dass hier wirklich einzelne Cells abgearbeitet werden. Das ist der entscheidende Unterschied. Also, das Ganze nochmal mit F5 starten. Und jetzt finden Sie hier wieder da, ich nehme mal den letzten in Dezember Block, da ist die Spalte, kompletter Block. Und jetzt kommen die Zellen einzeln: M4, M5, M6 bis M34 da unten. Also, wenn Sie bei Debug.Print feststellen, dass der Bereich nicht zerlegt wird, sondern der Range einfach komplett genommen wird, dann müssen Sie ausdrücklich dieses .Cells dranschreiben. Jetzt haben wir es also korrekt. Ich nehme das erstmal nur kommentiert wieder raus. Und jetzt können wir uns um die einzelnen Zellen kümmern. Hier drin ist jetzt eine einzelne Zelle und jetzt muss ich nur prüfen, ob die in diesen Datumsbereich reinfällt. Also ich unterstelle jetzt mal einfach, dass es ein Datum ist. Denn die ganze Prüfung haben Sie eben schon gesehen. Also, wenn von dem rngTag der Value= dem Startdatum ist. Das ist bei mir m_cdatKarfreitag. Und gleichzeitig von dem rngTag der Value<= dem Ende-Datum ist. Also, nehme ich den "Ostermontag". Dann darf ich reagieren. Jetzt ist hier noch ein Fehler drin. Natürlich sollte man das "und" in Englisch schreiben. Und dann ist der Compiler auch zufrieden. Wenn das passiert, nämlich das Datum ist in diesem Bereich, dann kann ich den rngTag, dessen Interior, dessen Innenbereich mit einer Farbe versehen. Sagen wir mal mit - was gibt es denn im Angebot? - nehmen wir grün. Erstens, Speichern. Zweitens, Debuggen Kompilieren. Und Alt + F11. Erstmal gucken, dass das nichts schon irgendwas grünes drin steht. Hier um "Ostern" rum soll sich also was grünes bilden, wenn das alles klappt. =Karfreitag. Und <=Ostermontag. Und dann können wir es mit F5 einfach mal starten und mit Alt + F11 nachgucken. Es hat alles geklappt. Wegen der bedingten Formatierung sehen Sie es hier nicht. Also wenn ich einen Bereich mitten in der Woche mache, dann würden Sie es deutlicher sehen. Aber es hat geklappt. Das wäre sichtbar zu machen, wenn ich diesen Bereich einfach ausnehme und hier die bedingte Formatierung entferne. Da lässt sich aber trotzdem noch was verbessern, an dem Code. Und zwar an der Tatsache, dass, wenn Ostermontag vorbei ist, ich den Rest der Spalten immer noch prüfe. Es sind jetzt nicht wirklich viele, ich sage mal nur 365 Zellen, die geprüft werden. Aber auch das, wann immer Sie mit einer Schleife arbeiten, ist eine Überlegung wert, ob es sich da irgendwie beschleunigen lässt. Z. B. wenn das Ende-Datum vorbei ist. Nach Ostermontag brauche ich definitiv nichts mehr zu prüfen. Das geht leider nicht hier drin. Wir müssen das wirklich einmal extra schreiben, aber können uns das hier kopieren. Wenn nämlich das Datum größer als der Ostermontag ist, dann kann ich einfach raus aus der Schleife und zwar auch raus aus der ganzen Prozedur. Deswegen schreibe ich nicht einfach nur Exit For (das würde es ja auch tun), sondern kann sogar das größte, das umfangreichste Aussteigen nehmen - ein Exit Sub. Davon sehen Sie nicht wirklich viel. Ich muss zuerst einmal wieder die Markierungen wegmachen. Einmal hier mit F5. Mit Alt + F11 prüfen. Alles weg. Und ich werde hier auch einmal die bedingte Markierung rausnehmen, dass Sie das deutlicher sehen. Also in den ausgewählten Zellen gelöscht, damit ist jetzt das Wochenende sozusagen nicht erkennbar. Und wenn ich jetzt das laufen lasse, einmal F5. Dann sehen Sie, dass tatsächlich gesamte Ostern markiert ist. Das ist immer so ein bisschen Konflikt mit bedingter Formatierung und selbst gemachten bunten Zellen. Aber Sie sehen, die Formatierung hat durchaus Vorteile, weil man die nicht versehentlich löscht. Das Aufräumen, alle Markierungen weg, hätte nämlich die per VBA erstellten Farben auch überschrieben. Worum es mir an dieser Stelle aber ging, ist zu zeigen, dass Sie auch Bereiche markieren können. Und wenn Sie erzwingen wollen, dass die Ranges in einer bestimmten Reihenfolge abgearbeitet werden, dann können Sie auch gezielt sagen: ich möchte hier spaltenweise durchgehen oder natürlich genauso gut mit Rows zeilenweise.

Excel 2013 VBA Grundkurs

Holen Sie aus Excel 2013 mit der integrierten Programmiersprache VBA auch das letzte Quäntchen an Funktion heraus und lassen Sie sich dazu zeigen, was alles möglich ist.

6 Std. 18 min (63 Videos)
Derzeit sind keine Feedbacks vorhanden...
 

Dieser Online-Kurs ist als Download und als Streaming-Video verfügbar. Die gute Nachricht: Sie müssen sich nicht entscheiden - sobald Sie das Training erwerben, erhalten Sie Zugang zu beiden Optionen!

Der Download ermöglicht Ihnen die Offline-Nutzung des Trainings und bietet die Vorteile einer benutzerfreundlichen Abspielumgebung. Wenn Sie an verschiedenen Computern arbeiten, oder nicht den ganzen Kurs auf einmal herunterladen möchten, loggen Sie sich auf dieser Seite ein, um alle Videos des Trainings als Streaming-Video anzusehen.

Wir hoffen, dass Sie viel Freude und Erfolg mit diesem Video-Training haben werden. Falls Sie irgendwelche Fragen haben, zögern Sie nicht uns zu kontaktieren!