Vor einiger Zeit wurde ich gefragt, ob ich eine interessante Aufgabe für einen Praktikanten kenne. Irgendetwas mit C#, wie es immer so schön heißt :). Vielleicht im Bereich Datenbanken, verschiedener Oberflächen oder im Zusammenspiel mit einer anderen Microsoft Technologie. Da ist guter Rat teuer. Wie immer. Ich hatte schon lange eine kleine Idee im Bereich C# und Excel.
Konkreter eine Idee zur Erweiterung eines Workbooks mit verwaltetem Code, auf die ich irgendwann mal durch ein Forum gekommen bin. Ich fand und finde sie gut, weil es sich nicht um das klassische, programmierte Addieren von Zahlen oder Auslesen von Zellen handelt, sondern einen etwas kreativeren Schwerpunkt setzt.
Das Rahmenwerk
Das Problem bei dieser Art von Aufgaben ist immer, dass sie unter großem Zeitdruck erledigt werden müssen. Noch mehr als das sonst schon der Fall ist, denn beispielsweise einem Praktikanten steht nicht sonderlich viel Zeit zur Verfügung. Zudem werden solche Aufgaben meistens in den ersten Semestern, am Anfang einer Ausbildung oder gar vor Beginn einer der beiden Maßnahmen gestellt, in denen – in der Regel – kaum oder gar keine Programmierkenntnisse vorhanden sind. Das ist aber auch ein Teilaspekt bei so einer – und auch dieser – Aufgabenstellung. Sie soll interessant, fordernd aber nicht zu schwer sein. Als Umgebung wird daher Visual Studio 2013 und Excel 2013 gewählt. Die Integration ist sehr gut, die Abstraktion des Zugriffs auf Office und Co. im Vergleich zu älteren Versionen viel besser und C# stand schon vorher fest. Das passte somit alles.
Die Aufgabenstellung
Aber was genau ist die Aufgabenstellung? Im Grunde lässt sich das sehr einfach beschreiben. Mit Excel soll das eigene Leben visualisiert werden. Das klingt wahrscheinlich am Anfang etwas komisch und mindestens abgehoben. Natürlich ist die Aufgabenstellung noch weiter eingeschränkt. Die Visualisierung soll abstrakt und nicht sonderlich detailliert sein. Ansonsten steigt der Aufwand schnell zu stark an. Visualisiert werden sollen:
- Die Geburtstage
- Einige wichtige Zeitbereiche/Abschnitte
- Geeignete Darstellung der Tage
Eventuell kann die Aufgaben am Ende noch etwas erweitert werden, in dem auch einige besondere Daten hervorgehoben werden. Beispiel Umzüge, Hochzeiten oder so etwas. Aber das ist alles optional.
Die Ziele
Interessant ist auch noch, welche Ziele mit dieser kleinen Aufgaben verfolgt werden. Wichtig ist die Zusammenarbeit und die Integration von C# und Excel. Des Weiteren soll die Sprache C# kennengelernt werden. Datenstrukturen sind nicht großartig erforderlich, da im Grunde nichts gespeichert werden muss, sondern direkt im Code angegeben wird. Das gilt ebenso für Konstrukte aus C#. Da sind nur Schleifen, Verzweigungen und eventuell Methoden wichtig. Ansonsten nichts.
Daher sind die Einarbeitung in C#, die Integration in Excel und die Lösung der Aufgabe die Hauptziele in diesem Fall.
Die Musterlösung
Aus Interesse habe ich eine kleine Musterlösung für die Aufgabe erstellt, die in den bereits vorhandenen Blog-Beispielen als vierte Demo eingeflossen ist. Die Integration in Excel ist über ein eigenes Workbook realisiert, in das mit C# weitere Funktionen implementiert werden können. Die Visualisierung wird über ein eigenes Ribbon gestartet, auf dem sich ein Button befindet.
Formatierung
Zuerst einmal geht es darum, die Exceldatei, beziehungsweise einen Ausschnitt davon, geeignet zu formatieren. Damit sind Größe und Farbe der Zellen gemeint. Als Basis der Visualisierung gelten die folgenden Annahmen:
- Es wird vereinfacht eine Lebenszeit von 80 Jahren angenommen.
- Jedes Jahr hat 365 Tage, ohne Berücksichtigung von Schaltjahren.
- Für eine schönere Visualisierung wird ein Bereich von 170 x 170 Zellen angenommen, was insgesamt 28.900 Tagen entspricht (statt genau 29.200 Tage bei 80 Jahren Lebenszeit).
- Die Visualisierung beschränkt sich auf dieses Quadrat von 170 x 170 Zellen der Exceldatei.
Das folgende Gist zeigt den Code, der genau diese Formatierung durchführt. Um nicht mit Offsets arbeiten zu müssen, wird bei der linken obereren Zelle begonnen.
[gist id=7368922 file=ExcelLifeBookFormatting.cs]
Die daraus resultierende Formatierung zeigt die Abbildung 1. In jeder Zeile sind 170 Zellen, ebenso pro Spalte.
Wichtig ist in der Methode nur der Einsatz der Range
-Eigenschaft, die automatisch in jedem Workbook zur Verfügung gestellt wird. Damit können ganze Bereiche markiert, selektiert der Eigenschaften dieser, beispielsweise die Hintergrundfarbe, geändert werden. Das geht weitaus schneller, als die betreffenden Zellen abzulaufen.
Eine Beispieldatei kann heruntergeladen werden, an der ich die Formatierung zunächst ausprobiert habe.
Berechnung der Geburtstage
Als nächstes steht die Berechnung und die Visualisierung der Geburtstage an. Bei der Berechnung gilt auch hier, dass pro Jahr einfach 365 Tage angenommen werden. Ohne Rücksicht auf Ausnahmen. Das folgende Gist zeigt diese Berechnung.
[gist id=7371165 file=ExcelLifeBookBirthdays.cs]
Im Grunde genommen ganz einfach, da es nur um eine abstrakte Visualisierung geht. Die beiden for
-Schleifen laufen alle Zellen ab und markieren jede 365. mit einem grünen Hintergrund. Zusätzlich läuft noch ein Zähler mit, der das jeweilige Jahr in die Zelle schreibt. Die Farbe kann über die Eigenschaft Interior.Color
gesetzt werden. Der Wert einer Zelle dagegen über die Eigenschaft Cells[row, column]
, die in jedem Workbook automatisch zur Verfügung steht. Mehr gibt es schon nicht zu beachten. Wohlgemerkt aufgrund der Abstraktion, ein Jahr immer mit 365 Tagen in die Berechnung einzubeziehen. Abbildung 2 enthält den Screenshot eines Beispiels mit eingetragenen Geburtstagen.
Visualisierung von Zeitbereichen
Die letzte Teilaufgabe besteht darin, bestimmte Zeitbereiche im Excel 2013 Workbook, genauer gesagt in dem 170 x 170 Zellen großen Bereich, zu markieren. Zur Markierung sollen Jahre angegeben werden. Damit sind keine Jahreszahlen gemeint, sondern das Lebensalter. Also beispielsweise vom dritten bis zum sechsten Lebensjahr. Das folgende Gist zeigt zwei Methoden. Die erste, mit Namen MarkRange(int fromYear, int toYear, Color color)
, übernimmt die eigentliche Arbeit. Neben den beiden Jahresangaben kann noch eine Farbe übergeben werden, die zur Färbung des Zeitbereichs genutzt wird.
[gist id=7371615 file=ExcelLifeBookRanges.cs]
Die Berechnung erfolgt auf dem Wege, dass zunächst wieder die Zeile und die Spalte für die Startzelle berechnet wird. Diese dienen für die Iteration über alle Zellen und werden inkrementiert. Die for
-Schleife übernimmt die Iteration über alle Zellen anhand des Start- und Endtages. Es werden also die Tage abgelaufen, die sich in dem angegebenen Bereich befinden. Ansonsten gibt es noch die Methode MarkKinderkarden(int fromYear, int toYear)
, die als kleine Vereinfachung für die Markierung eines Bereiches dient. Im Grunde wird der Aufruf nur an die MarkRange
-Methode delegiert und eine bestimmte Farbe angegeben. Von diesen Methoden gibt es entsprechend so viele, wie auch Bereiche im Excel Workbook markiert werden sollen. Damit sind auch schon alle Berechnungen beschrieben. Abbildung 3 zeigt das Endresultat mit allen Markierungen. Das Beispiel enthält auch ein paar erklärende Beschriftungen, um welche Markierung es sich handelt. Die werden durch die Implementierung nicht mit erstellt, sondern dienen nur zur Beschreibung, was ich mit dem Bereichen meine.
Einige Farben wurden der Grafik aus Abbildung 4 entnommen, die häufig genutzte Farben in Windows Phone zeigen. Die fand ich ganz nützlich und aufeinander abgestimmt, auch wenn das Endresultat ganz sicher verbesserungsfähig ist.
Abbildung 5 zeigt der Vollständigkeit halber den zusätzlichen Tab im Ribbon, um die Visualisierung zu starten.
Abfragen, beispielsweise von Zeiträumen, sind nicht implementiert. Das würde den Umfang sprengen, ist aber auch nicht mehr wirklich viel mehr Aufwand.
Ein vollständiges Beispiel der Exceldatei kann ebenfalls heruntergeladen werden.
Philosophisches
Das letzte Beispiel, das Abbildung 3 zeigt, visualisiert auch einen nicht so schönen Umstand :). Das Leben ist kurz. Das Beispiel enthält die markierten Zeitbereiche meiner Ausbildungsphase. Vom Kindergarten bis zum Masterabschluss in der Zukunft, den ich hoffentlich gegen Ende 2014 in der Tasche habe. Dafür ist ganz schön viel Zeit ins Land gegangen. Über ein Drittel, wenn die Lebenszeit von 80 Jahren als Grenze gilt.
Ob das jetzt gut oder schlecht ist, muss jeder für sich entscheiden. Trotz oder gerade wegen dieser Übersicht gilt ein Satz ganz besonders.
Life is not measured by the number of breaths we take, but by the moments that take our breath away.
Oder natürlich etwas praktischeres :).
Das Leben ist zu kurz um schlechte Schokolade zu essen!
Fazit
Im Grunde möchte ich es mit den beiden Zitaten schließen. Leider weiß ich nicht mehr genau, wem sie zugeordnet werden können. Ich hoffe die Aufgaben kommt an, wenn ich sie dann weitergeleitet habe. Ich fand sie eine nette Fingerübung. Und denken wir immer daran, wenn wir Aufgaben für die Zukunft planen.
Die Uhr schlägt. Alle.
Also geht kostbar damit um!
Schreibe einen Kommentar