Zum Inhalt springen
Fabian Deitelhoff

C# & Excel: Erweiterungen eines Workbooks

Aus meinem alten Blog (2012–2017). Der Text steht so, wie ich ihn damals geschrieben habe.

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(öffnet in neuem Tab) 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:

  1. Es wird vereinfacht eine Lebenszeit von 80 Jahren angenommen.
  2. Jedes Jahr hat 365 Tage, ohne Berücksichtigung von Schaltjahren.
  3. 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).
  4. Die Visualisierung beschränkt sich auf dieses Quadrat von 170 x 170 Zellen der Exceldatei.

Das folgende Gist(öffnet in neuem Tab) zeigt den Code, der genau diese Formatierung durchführt. Um nicht mit Offsets arbeiten zu müssen, wird bei der linken obereren Zelle begonnen.

Code auf GitHub Gist: ExcelLifeBookFormatting.cs →(öffnet in neuem Tab)

Die daraus resultierende Formatierung zeigt die Abbildung 1. In jeder Zeile sind 170 Zellen, ebenso pro Spalte.

Bild nicht mehr verfügbarAbb. 1: Formatierter Bereich im Excel Dokument.

Abb. 1: Formatierter Bereich im Excel Dokument.

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(öffnet in neuem Tab) 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(öffnet in neuem Tab) zeigt diese Berechnung.

Code auf GitHub Gist: ExcelLifeBookBirthdays.cs →(öffnet in neuem Tab)

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.

Bild nicht mehr verfügbarAbb. 2: Markierung der Geburtstage im Excel Dokument.

Abb. 2: Markierung der Geburtstage im Excel Dokument.

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(öffnet in neuem Tab) 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.

Code auf GitHub Gist: ExcelLifeBookRanges.cs →(öffnet in neuem Tab)

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.

Bild nicht mehr verfügbarAbb. 3: Markierung von Bereichen im Excel Dokument.

Abb. 3: Markierung von Bereichen im Excel Dokument.

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.

Bild nicht mehr verfügbarAbb. 4: Häufig genutzte Farben in Windows Phone.

Abb. 4: Häufig genutzte Farben in Windows Phone.

Abbildung 5 zeigt der Vollständigkeit halber den zusätzlichen Tab im Ribbon, um die Visualisierung zu starten.

Bild nicht mehr verfügbarAbb. 5: Excel Ribbon zum Starten der Visualisierung.

Abb. 5: Excel Ribbon zum Starten der Visualisierung.

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(öffnet in neuem Tab) 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!