Excel + VBA für Controller: Mit eigenen Prozeduren und Funktionen optimieren [2., aktualisierte und erweiterte Auflage] 3658431563, 9783658431563, 9783658431570

Dieses Lehrbuch zeigt anhand vieler praktischer Beispiele, wie mithilfe von eigenen Prozeduren und Funktionen die Anwend

118 14 23MB

German Pages 509 Year 2023

Report DMCA / Copyright

DOWNLOAD PDF FILE

Table of contents :
VORWORT
INHALT
KAPITEL 1 Einführung in VBA
1.1 Die VBA-Entwicklungsumgebung
1.1.1 Der Visual Basic-Editor
1.1.2 Projekt und Projekt-Explorer
1.1.3 Der Objektkatalog
1.1.4 Das Eigenschaftsfenster
1.1.5 Weitere Hilfsfenster
1.2 Objekte
1.2.1 Objekte, allgemein
1.2.2 Objektlisten
1.2.3 Objektvariable
1.2.4 Anwendungen und Makros
1.2.5 Makro im Menüband aufrufen
1.2.6 Makro aus der Symbolleiste aufrufen
1.2.7 Formulare und Steuerelemente
1.2.8 Module
1.3 Die Syntax von VBA
1.3.1 Konventionen
1.3.2 Prozeduren und Funktionen
1.3.3 Datentypen für Konstante und Variable
1.3.4 Parameterlisten
1.3.5 Benutzerdefinierte Aufzähl-Variablen
1.3.6 Benutzerdefinierte Datentypen
1.3.7 Operatoren und Standardfunktionen
1.3.8 Strukturen für Prozedurabläufe
1.3.9 Geltungsbereiche
1.3.10 Fehlerbehandlung in Prozeduren
1.4 Algorithmen und ihre Darstellung
1.4.1 Der Algorithmus
1.4.2 Top-Down-Design
1.4.3 Datenflussdiagramm
1.4.4 Struktogramm
1.4.5 Aktivitätsdiagramm
1.5 Objekte der Excel-Bibliothek
1.5.1 Application-Objekt
1.5.2 Windows-Objekte
1.5.3 Workbook-Objekte
1.5.4 Worksheet-Objekte
1.5.5 Range-Objekte
1.5.6 Zeilen und Spalten
1.5.7 Zellen und Zellbereiche
1.5.8 Menüband-Objekte
1.6 Eigene Klassen und Objekte
1.6.1 Klassendiagramm
1.6.2 Sequenzdiagramm
1.6.3 Definition einer Klasse
1.6.4 Konstruktor und Destruktor
1.6.5 Instanziierung von Objekten
1.6.6 Arbeiten mit Objekten
1.6.7 Objektlisten
1.6.8 Vererbung
1.6.9 Schnittstellen
1.6.10 Events und Excel-Objekte
1.6.11 Events und eigene Objekte
1.6.12 Benutzerdefinierte Funktionen
1.7 Arbeiten mit dem VBA-Editor
1.7.1 Prozeduren mit Haltepunkten testen
1.7.2 Codefenster teilen
1.7.3 DoEvents einsetzen
1.7.4 Die Wait-Funktion
1.7.5 Die OnTime-Funktion
1.7.6 Informationen zum Datentyp
1.7.7 Datentyp eines Zellinhalts
1.7.8 Datentyp-Konvertierungen
KAPITEL 2 Aufgaben und Ziele
2.1 Controlling und Excel
2.1.1 Die Entstehung des Controllings
2.1.2 Die Entstehung von Excel
2.2 Aufgaben des Controllings
2.2.1 Aufgaben des strategischen Controllings
2.2.2 Aufgaben des operativen Controllings
2.2.3 Aufgaben des Prozess-Controllings
2.2.4 Aufgaben des Projekt-Controllings
2.3 Zielbestimmung im Controlling
2.3.1 Marktanalyse
2.3.2 Marktbefragung
2.3.3 Trendanalyse
2.3.4 Wertschöpfungskette
2.3.5 Machbarkeitsstudie
2.3.6 Zielgewichtung
2.3.7 Pareto-Prinzip
2.3.8 Ziele definieren
2.3.9 Produkt-Lebenszyklus
KAPITEL 3 Formeln und Funktionen
3.1 Formeln
3.1.1 Operanden
3.1.2 Operatoren
3.1.3 Formeln übertragen
3.1.4 Zellbereiche mit Formel füllen
3.1.5 Formelübertragung
3.2 Bereichsnamen
3.2.1 Bereichsnamen vergeben
3.2.2 Bereichsnamen für Zellbereiche
3.2.3 Bereichsnamen aus Auswahl erstellen
3.2.4 Der Namens-Manager
3.2.5 Bereichsnamen in VBA
3.3 Funktionen
3.3.1 Grundfunktionen
3.3.2 Summenfunktionen
3.3.3 Suchfunktionen
3.3.4 Datumsfunktionen
3.3.5 Zählfunktionen
3.3.6 Barwertfunktionen
3.3.7 Abschreibungsfunktionen
3.3.8 Rundungsfunktionen
3.4 Tabellen
3.4.1 Eine Tabelle erstellen
3.4.2 Strukturierte Verweise
3.4.3 Der Hash-Operator
KAPITEL 4 Datenaufbereitung
4.1 Daten konsolidieren
4.1.1 Listen in einer Mappe
4.1.2 Listen in verschiedenen Mappen
4.1.3 Manuelle Einstellungen
4.2 Daten filtern
4.2.1 Autofilter
4.2.2 Benutzerdefinierte Ansichten
4.2.3 Erweiterter Filter
4.2.4 Die FILTER-Funktion
4.2.5 Teilergebnisse
4.2.6 Datenschnitte
4.3 Pivot-Tabellen
4.3.1 Das Pivot-Schema
4.3.2 Erste Pivot-Tabelle
4.3.3 Mehrfachzuordnung Wertefeld
4.3.4 Einzelwerte
4.3.5 Zeilen- und Spaltenfeld
4.3.6 Mehrfachzuordnung Zeilenfeld
4.3.7 Zeitliche Gruppierung
4.3.8 Benutzerdefinierte Gruppierung
4.3.9 Seitenfeld nutzen
4.3.10 Bereichsnamen einsetzen
4.3.11 Datenschnitt und Zeitachse
4.3.12 Konsolidieren in der Pivot-Tabelle
4.4 Pivot-Diagramme
4.4.1 Fächerdiagramm
4.4.2 Cockpit-Tachometer
4.4.3 Treemap
4.4.4 3D-Oberfläche
4.4.5 Netz
KAPITEL 5 Datenmodelle
5.1 Beziehungen
5.1.1 Relationen
5.1.2 Entity-Relationship-Model
5.1.3 Beziehungen in der Pivot-Tabelle
5.1.4 Berechnung mit Bereichsnamen
5.1.5 Berechnung mit VBA
5.2 Datenmodell und Tools
5.3 Abfragen und Verbindungen
5.3.1 Abfragen aus Dateien
5.3.2 Abfragen aus Datenbanken
5.4 Power Query
5.4.1 Navigator
5.4.2 Laden in Tabelle
5.4.3 Laden in PivotTable
5.4.4 Daten transformieren
5.5 Power Pivot
5.5.1 Datenmodell
5.5.2 Kombinieren
5.5.3 DAX in Power Pivot
5.5.4 Transformieren und Pivotisieren
5.5.5 Dashboard oder Folie
5.5.6 m:n Beziehungen
5.6 Power Map
5.6.1 3D-Karte
5.6.2 Benutzerdefinierter Grundriss
5.7 CUBE-Funktionen
5.7.1 CUBE-Funktionen in Excel
5.7.2 CUBE-Funktionen aus der Pivot-Tabelle
5.7.3 CUBE-Funktionen im Dashboard
KAPITEL 6 Analyse-Methoden
6.1 Integrierte Analyse-Methoden
6.1.1 Szenarien
6.1.2 Zielwertsuche
6.1.3 Datentabellen
6.1.4 Prognoseblatt
6.1.5 Lineare Optimierung
6.1.6 Deterministische Simulation
6.1.7 Probabilistische Simulation
6.2 Ergänzende Analyse-Methode
6.2.1 Installation des Analyse-Add-Ins
6.2.2 Histogramm
6.2.3 Populationskenngrößen
6.2.4 Regression und Korrelation
6.2.5 VBA-Funktion Korrelationsmatrix
6.2.6 Solver
6.2.7 Exponentielle Glättung
KAPITEL 7 Strategisches Prozess-Controlling
7.1 Grundlegende Methoden
7.1.1 Prozessreife-Bestimmung
7.1.2 Die VMI-Matrix
7.1.3 SWOT-Analyse
7.1.4 Wettbewerbsanalse
7.2 Kennzahlen
7.2.1 Key Performance Indicators
7.2.2 Kennzahlensysteme
7.2.3 Benchmarking
7.2.4 Balanced Scorecard
7.2.5 Prozess-Reporting
7.3 Kostenrechnerische Analysen
7.3.1 Prozesskostenrechnung
7.3.2 Gewinn- und Verlustrechnung (GuV)
7.3.3 Deckungsbeitragsrechnung (DBR)
7.3.4 Break-Even-Analyse
7.3.5 Kurzfristige Erfolgsrechnung (KER)
7.4 Abschreibung und Cashflow
7.4.1 Lineare Abschreibung
7.4.2 Cashflow
7.5 Kreditberechnungen
7.5.1 Zinsrechnung
7.5.2 Tilgungsrechnung
7.5.3 Annuitätentilgung
7.5.4 Vergleichsrechnung
7.6 Investitionsrechnungen
7.6.1 Statische Investitionsrechnung
7.6.2 Dynamische Investitionsrechnung
7.6.3 Investitionsdaten zusammenstellen
7.6.4 Die statische Amortisationsrechnung
7.6.5 Die Kapitalwert-Methode
7.6.6 Die dynamische Amortisationsrechnung
7.6.7 Der interne Zinsfuß
7.6.8 Die Kosten-Vergleichsrechnung
KAPITEL 8 Operatives Prozess-Controlling
8.1 Analyse-Methoden
8.1.1 ABC-Analyse
8.1.2 Verteilungen
8.1.3 Zweidimensionale Leistungsmessung
8.2 Bereichs-Controlling
8.2.1 Material-Controlling
8.2.2 Produktions-Controlling
8.2.3 Marketing-Controlling
8.2.4 IT-Controlling
8.2.5 Personal-Controlling
KAPITEL 9 Strategisches Projekt-Controlling
9.1 Analyse-Methoden
9.1.1 BCG-Matrix
9.1.2 McKinsey-Matrix
9.1.3 Risiko-Portfolio
9.1.4 Nutzwert-Analyse (NA)
9.1.5 Einfluss-Analyse
9.2 Planungs-Methoden
9.2.1 Projekt-Strukturplan (PSP)
9.2.2 Netzplan
9.2.3 Gantt-Diagramm
9.2.4 Ressourcenplanung
9.2.5 Kapazitätsplanung
9.2.6 Terminplanung
9.2.7 Kostenplanung
KAPITEL 10 Operatives Projekt-Controlling
10.1 Organisations-Methoden
10.1.1 Projekt-Tracking
10.1.2 Kostengang- und Kostensummenlinie
10.1.3 Projekt-Finanzplan
10.1.4 Agile Projektplanung
10.1.5 Kostenvergleichstabelle
10.2 Kontroll-Methoden
10.2.1 Meilenstein-Trendanalyse
10.2.2 Ressourcen-Trendanalyse
10.2.3 Kosten-Trendanalyse
10.2.4 Kosten-Termin-Diagramm
10.2.5 Earned-Value-Analyse
10.2.6 Leistungsmäßiger Fortschrittsgrad
10.2.7 Fortschrittsgrad
10.2.8 Reviews
LITERATURVERZEICHNIS
DIAGRAMMVERZEICHNIS
FUNKTIONENVERZEICHNIS
STICHWORTVERZEICHNIS
Recommend Papers

Excel + VBA für Controller: Mit eigenen Prozeduren und Funktionen optimieren [2., aktualisierte und erweiterte Auflage]
 3658431563, 9783658431563, 9783658431570

  • 0 0 0
  • Like this paper and download? You can publish your own PDF file online for free in a few minutes! Sign Up
File loading please wait...
Citation preview

Harald Nahrstedt

Excel + VBA für Controller Mit eigenen Prozeduren und Funktionen optimieren 2. Auflage

Excel + VBA für Controller

Harald Nahrstedt

Excel + VBA für Controller Mit eigenen Prozeduren und Funktionen optimieren 2., aktualisierte und erweiterte Auflage

Harald Nahrstedt Möhnesee, Deutschland

ISBN 978-3-658-43156-3 ISBN 978-3-658-43157-0 (eBook) https://doi.org/10.1007/978-3-658-43157-0 Die Deutsche Nationalbibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie; detaillierte bibliografische Daten sind im Internet über http://dnb.d-nb.de abrufbar. © Springer Fachmedien Wiesbaden GmbH, ein Teil von Springer Nature 2019, 2023 Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Jede Verwertung, die nicht ausdrücklich vom Urheberrechtsgesetz zugelassen ist, bedarf der vorherigen Zustimmung des Verlags. Das gilt insbesondere für Vervielfältigungen, Bearbeitungen, Übersetzungen, Mikroverfilmungen und die Einspeicherung und Verarbeitung in elektronischen Systemen. Die Wiedergabe von allgemein beschreibenden Bezeichnungen, Marken, Unternehmensnamen etc. in diesem Werk bedeutet nicht, dass diese frei durch jedermann benutzt werden dürfen. Die Berechtigung zur Benutzung unterliegt, auch ohne gesonderten Hinweis hierzu, den Regeln des Markenrechts. Die Rechte des jeweiligen Zeicheninhabers sind zu beachten. Der Verlag, die Autoren und die Herausgeber gehen davon aus, dass die Angaben und Informationen in diesem Werk zum Zeitpunkt der Veröffentlichung vollständig und korrekt sind. Weder der Verlag noch die Autoren oder die Herausgeber übernehmen, ausdrücklich oder implizit, Gewähr für den Inhalt des Werkes, etwaige Fehler oder Äußerungen. Der Verlag bleibt im Hinblick auf geografische Zuordnungen und Gebietsbezeichnungen in veröffentlichten Karten und Institutionsadressen neutral. Planung/Lektorat: Ellen-Susanne Klabunde Springer Vieweg ist ein Imprint der eingetragenen Gesellschaft Springer Fachmedien Wiesbaden GmbH und ist ein Teil von Springer Nature. Die Anschrift der Gesellschaft ist: Abraham-Lincoln-Str. 46, 65189 Wiesbaden, Germany Das Papier dieses Produkts ist recyclebar.

VORWORT

Excel + VBA für Controller

Zum Inhalt Das erste Kapitel, Einführung in VBA, habe ich überarbeitet und einige Begriffe anders verdeutlicht. Das Thema Konvertierung von Datentypen wurde ergänzt. Der Umgang mit Objekten wurde ebenfalls deutlicher beschrieben. Die Power Tools gewinnen immer mehr an Bedeutung. Sie verwenden ein Datenmodell, sodass auch dazu Ergänzungen nötig waren. Das Tool Power Query ersetzt das veraltete MS Query und ergänzende Darstellungen zum Datenmodell, wie das Entity-Relationship-Model, habe ich hinzugefügt. Auch der Umgang mit den Datenbeziehungsformen (1:n und n:m) wird genauer beschrieben. Mit dem Tool Power Pivot zeige ich die Möglichkeiten zur Erstellung von Berichten und Dashboards. Die Nutzung von Datenmodellen durch CUBE-Funktionen habe ich ergänzt. Leider wird in Excel der Begriff Tabelle für verschiedene Objekte verwendet. Mit der Einführung von Tabellen als Objekte eines Arbeitsblattbereichs ist die Verwirrung komplett. Im Buch habe ich die Arbeitsblätter, die Microsoft auch gerne als Tabellen bezeichnet, nun als Arbeitsblatt oder kurz Blatt bezeichnet. Die Verwendung von Tabellen in Formeln ist hinzugekommen und dazu auch die Verwendung des at- und hash-Operators für Überläufe. Das Analysetool Datentabelle ist so geblieben. In der Literatur bezeichnen Autoren die neue Tabelle auch schon mal als Datentabelle oder dynamische Tabelle. Ich hoffe, Microsoft wird mit den nächsten Versionen einiges bereinigen. Die abschließenden Kapitel verdeutlichen die Unterschiede zwischen Prozessen und Projekten. Sie beschreiben deren unterschiedliche Ziele und Methoden. Aus meiner jahrzehntelangen Erfahrung zum Einsatz von Excel und VBA, in Prozessen und Projekten, kenne ich viele Methoden, die sowohl für viele Bereiche, als auch für spezielle Probleme sehr hilfreich sind. Die ausgewählten Anwendungsbeispiele können mit den vermittelten Kenntnissen aus diesem Buch weiter ausgebaut und den vorhandenen Praxisproblemen angepasst werden.

Dieses Buch soll der Leserin, bzw. dem Leser zeigen, dass der Einsatz von Excel zusammen mit VBA eine Menge nützlicher Prozeduren und Tricks für das Controlling bietet. Dabei geht es mir nicht darum, dem Controller fertige Tools zu liefern. Vielmehr sollen die Beispiele einen stressfreien Einstieg in die Welt der VBA-Objekte erlauben, und dass bei sauberer Programmiertechnik. Die Beispiele zeigen auch, wie schnell und einfach die Zusammenarbeit von Excel und VBA sein kann. Versionen Diese Auflage wurde mit den Office-Versionen 2021 und 365 auf dem Betriebssystem Windows 10 erstellt. Mit wenigen Ausnahmen lassen sich die Beispiele auch auf den OfficeVersionen 2016 und 2019 einsetzen. Ich übernehme jedoch keine Haftung für Folgen die sich aus dem Einsatz der Programmcodes ergeben. Der Umgang mit Datenmodellen in Power Excel ist derzeit im Wandel und ändert sich, auch im Design, mit jeder Version. Zum Aufbau Das erste Kapitel gibt eine Einführung in VBA, in die Handhabung der Entwicklungsumgebung und ist auch für Autodidakten gut geeignet. Die nachfolgenden Kapitel behandeln allgemeine Funktionen und Methoden, die für alle Bereiche des Controllings hilfreich sind. Die letzten vier Kapitel gehen auf die speziellen Aufgaben des strategischen und operativen Controllings in Prozessen und Projekten ein. Dabei ist eine klare Trennung nicht immer möglich. Alle Bilder in diesem Buch wurden als PrintScreen erstellt oder stammen aus den PowerPointFolien zu meinen Vorlesungen. Sonstige Darstellungen besitzen eine Quellangabe. Danksagung Ich danke all denen im Springer Verlag, die stets im Hintergrund wirkend, zum Gelingen dieses Buches beigetragen haben. Insbesondere gilt mein Dank Ellen-Susanne Klabunde und Julia Lanza, die mich redaktionell begleitet haben. An den Leser Auf meiner Homepage www.harald-nahrstedt.de befinden sich die Downloads, die im Buch mit dem Symbol  angegeben sind. Es handelt sich dabei um keine fertigen Lösungen. Vielmehr sollen die Beispiele und Prozeduren den Einstieg in die Thematik erleichtern und die Freude am eigenen kreativen Schaffen fördern. Die Downloads sollen dabei den Einstieg erleichtern. Der Leser ist aufgefordert, je nach Arbeits- und Interessensgebiet, eigene Anwendungen zu erarbeiten. Die Anwendung aller in Excel vorhandenen Funktionen an einem Beispiel zu zeigen, würde den vorgegebenen Umfang dieses Buches deutlich sprengen. Wenn aus Gründen der leichteren Lesbarkeit im Buch das generische Maskulinum verwendet wird, so sind doch alle Geschlechter angesprochen.

Möhnesee, September 2023

VI

|

VORWORT

Harald Nahrstedt

INHALT

Excel + VBA für Controller

1 Einführung in VBA 1.1 Die VBA-Entwicklungsumgebung....................................................................... 1 1.1.1 Der Visual Basic-Editor ......................................................................... 2 1.1.2 Projekt und Projekt-Explorer ................................................................. 5 1.1.3 Der Objektkatalog .................................................................................. 5 1.1.4 Das Eigenschaftsfenster ......................................................................... 6 1.1.5 Weitere Hilfsfenster ............................................................................... 6 1.2 Objekte .............................................................................................................7 1.2.1 Objekte, allgemein ................................................................................. 7 1.2.2 Objektlisten ............................................................................................ 8 1.2.3 Objektvariable ........................................................................................ 8 1.2.4 Anwendungen und Makros .................................................................. 13 1.2.5 Makro im Menüband aufrufen ............................................................. 15 1.2.6 Makro aus der Symbolleiste aufrufen .................................................. 17 1.2.7 Formulare und Steuerelemente ............................................................ 17 1.2.8 Module ................................................................................................. 22 1.3 Die Syntax von VBA ......................................................................................... 23 1.3.1 Konventionen ....................................................................................... 23 1.3.2 Prozeduren und Funktionen ................................................................. 23 1.3.3 Datentypen für Konstante und Variable ............................................... 24 1.3.4 Parameterlisten ..................................................................................... 26 1.3.5 Benutzerdefinierte Aufzähl-Variablen ................................................. 27 1.3.6 Benutzerdefinierte Datentypen............................................................. 27 1.3.7 Operatoren und Standardfunktionen .................................................... 28 1.3.8 Strukturen für Prozedurabläufe ............................................................ 30 1.3.9 Geltungsbereiche.................................................................................. 32 1.3.10 Fehlerbehandlung in Prozeduren ........................................................ 32 1.4 Algorithmen und ihre Darstellung ..................................................................... 33 1.4.1 Der Algorithmus ................................................................................. 33 1.4.2 Top-Down-Design ............................................................................... 34 1.4.3 Datenflussdiagramm ............................................................................ 35

1.4.4 Struktogramm ...................................................................................... 36 1.4.5 Aktivitätsdiagramm .............................................................................. 37 1.5 Objekte der Excel-Bibliothek ............................................................................. 40 1.5.1 Application-Objekt .............................................................................. 41 1.5.2 Windows-Objekte ................................................................................ 42 1.5.3 Workbook-Objekte .............................................................................. 43 1.5.4 Worksheet-Objekte .............................................................................. 44 1.5.5 Range-Objekte ..................................................................................... 45 1.5.6 Zeilen und Spalten ............................................................................... 46 1.5.7 Zellen und Zellbereiche ....................................................................... 46 1.5.8 Menüband-Objekte .............................................................................. 49 1.6 Eigene Klassen und Objekte............................................................................... 57 1.6.1 Klassendiagramm ................................................................................. 57 1.6.2 Sequenzdiagramm ................................................................................ 59 1.6.3 Definition einer Klasse ......................................................................... 60 1.6.4 Konstruktor und Destruktor ................................................................. 61 1.6.5 Instanziierung von Objekten ................................................................ 61 1.6.6 Arbeiten mit Objekten .......................................................................... 63 1.6.7 Objektlisten .......................................................................................... 67 1.6.8 Vererbung ............................................................................................ 71 1.6.9 Schnittstellen ........................................................................................ 73 1.6.10 Events und Excel-Objekte .................................................................. 77 1.6.11 Events und eigene Objekte ................................................................. 79 1.6.12 Benutzerdefinierte Funktionen ........................................................... 82 1.7 Arbeiten mit dem VBA-Editor ........................................................................... 83 1.7.1 Prozeduren mit Haltepunkten testen .................................................... 83 1.7.2 Codefenster teilen ................................................................................ 83 1.7.3 DoEvents einsetzen .............................................................................. 84 1.7.4 Die Wait-Funktion ............................................................................... 84 1.7.5 Die OnTime-Funktion .......................................................................... 85 1.7.6 Informationen zum Datentyp ............................................................... 86 1.7.7 Datentyp eines Zellinhalts .................................................................... 87 1.7.8 Datentyp-Konvertierungen................................................................... 87

2 Aufgaben und Ziele 2.1 Controlling und Excel ........................................................................................ 91 2.1.1 Die Entstehung des Controllings .......................................................... 91 2.1.2 Die Entstehung von Excel .................................................................... 92 2.2 Aufgaben des Controllings ................................................................................. 92 2.2.1 Aufgaben des strategischen Controllings ............................................. 92 2.2.2 Aufgaben des operativen Controllings ................................................. 93 2.2.3 Aufgaben des Prozess-Controllings ..................................................... 94 2.2.4 Aufgaben des Projekt-Controllings ...................................................... 95 2.3 Zielbestimmung im Controlling ......................................................................... 96 2.3.1 Marktanalyse ........................................................................................ 96 2.3.2 Marktbefragung.................................................................................... 99 2.3.3 Trendanalyse ...................................................................................... 102 2.3.4 Wertschöpfungskette .......................................................................... 107 2.3.5 Machbarkeitsstudie ............................................................................ 108

VIII

|

INHALT

2.3.6 Zielgewichtung .................................................................................. 110 2.3.7 Pareto-Prinzip .................................................................................... 114 2.3.8 Ziele definieren .................................................................................. 117 2.3.9 Produkt-Lebenszyklus........................................................................ 121

3 Formeln und Funktionen 3.1 Formeln .........................................................................................................123 3.1.1 Operanden .......................................................................................... 124 3.1.2 Operatoren.......................................................................................... 124 3.1.3 Formeln übertragen ............................................................................ 124 3.1.4 Zellbereiche mit Formel füllen........................................................... 125 3.1.5 Formelübertragung ............................................................................. 125 3.2 Bereichsnamen ................................................................................................. 125 3.2.1 Bereichsnamen vergeben ................................................................... 125 3.2.2 Bereichsnamen für Zellbereiche ........................................................ 126 3.2.3 Bereichsnamen aus Auswahl erstellen ............................................... 127 3.2.4 Der Namens-Manager ........................................................................ 127 3.2.5 Bereichsnamen in VBA ..................................................................... 128 3.3 Funktionen ....................................................................................................... 129 3.3.1 Grundfunktionen ................................................................................ 130 3.3.2 Summenfunktionen ............................................................................ 138 3.3.3 Suchfunktionen .................................................................................. 143 3.3.4 Datumsfunktionen .............................................................................. 153 3.3.5 Zählfunktionen ................................................................................... 157 3.3.6 Barwertfunktionen ............................................................................. 164 3.3.7 Abschreibungsfunktionen .................................................................. 172 3.3.8 Rundungsfunktionen .......................................................................... 177 3.4 Tabellen .........................................................................................................181 3.4.1 Eine Tabelle erstellen ......................................................................... 181 3.4.2 Strukturierte Verweise ....................................................................... 182 3.4.3 Der Hash-Operator ............................................................................. 184

4 Datenaufbereitung 4.1 Daten konsolidieren.......................................................................................... 191 4.1.1 Listen in einer Mappe ........................................................................ 191 4.1.2 Listen in verschiedenen Mappen ........................................................ 192 4.1.3 Manuelle Einstellungen...................................................................... 195 4.2 Daten filtern ..................................................................................................... 196 4.2.1 Autofilter ............................................................................................ 196 4.2.2 Benutzerdefinierte Ansichten ............................................................. 196 4.2.3 Erweiterter Filter ................................................................................ 197 4.2.4 Die FILTER-Funktion........................................................................ 198 4.2.5 Teilergebnisse .................................................................................... 200 4.2.6 Datenschnitte...................................................................................... 201 4.3 Pivot-Tabellen .................................................................................................. 204 4.3.1 Das Pivot-Schema .............................................................................. 204 4.3.2 Erste Pivot-Tabelle............................................................................. 206 4.3.3 Mehrfachzuordnung Wertefeld .......................................................... 209

INHALT

|

IX

4.3.4 Einzelwerte ........................................................................................ 211 4.3.5 Zeilen- und Spaltenfeld ...................................................................... 211 4.3.6 Mehrfachzuordnung Zeilenfeld .......................................................... 212 4.3.7 Zeitliche Gruppierung ........................................................................ 213 4.3.8 Benutzerdefinierte Gruppierung......................................................... 215 4.3.9 Seitenfeld nutzen ................................................................................ 215 4.3.10 Bereichsnamen einsetzen ................................................................. 216 4.3.11 Datenschnitt und Zeitachse .............................................................. 218 4.3.12 Konsolidieren in der Pivot-Tabelle .................................................. 220 4.4 Pivot-Diagramme ............................................................................................. 222 4.4.1 Fächerdiagramm ................................................................................ 222 4.4.2 Cockpit-Tachometer........................................................................... 224 4.4.3 Treemap ............................................................................................. 229 4.4.4 3D-Oberfläche.................................................................................... 230 4.4.5 Netz .................................................................................................... 231

5 Datenmodelle 5.1 Beziehungen ..................................................................................................... 233 5.1.1 Relationen .......................................................................................... 233 5.1.2 Entity-Relationship-Model................................................................. 234 5.1.3 Beziehungen in der Pivot-Tabelle ...................................................... 237 5.1.4 Berechnung mit Bereichsnamen ........................................................ 238 5.1.5 Berechnung mit VBA......................................................................... 239 5.2 Datenmodell und Tools .................................................................................... 241 5.3 Abfragen und Verbindungen ............................................................................ 242 5.3.1 Abfragen aus Dateien ......................................................................... 243 5.3.2 Abfragen aus Datenbanken ................................................................ 244 5.4 Power Query..................................................................................................... 245 5.4.1 Navigator ........................................................................................... 245 5.4.2 Laden in Tabelle ................................................................................ 246 5.4.3 Laden in PivotTable ........................................................................... 248 5.4.4 Daten transformieren.......................................................................... 248 5.5 Power Pivot ...................................................................................................... 252 5.5.1 Datenmodell ....................................................................................... 253 5.5.2 Kombinieren ...................................................................................... 254 5.5.3 DAX in Power Pivot .......................................................................... 254 5.5.4 Transformieren und Pivotisieren ........................................................ 255 5.5.5 Dashboard oder Folie ......................................................................... 256 5.5.6 m:n Beziehungen ............................................................................... 258 5.6 Power Map ....................................................................................................... 260 5.6.1 3D-Karte ............................................................................................ 260 5.6.2 Benutzerdefinierter Grundriss ............................................................ 262 5.7 CUBE-Funktionen............................................................................................ 264 5.7.1 CUBE-Funktionen in Excel ............................................................... 264 5.7.2 CUBE-Funktionen aus der Pivot-Tabelle .......................................... 268 5.7.3 CUBE-Funktionen im Dashboard ...................................................... 269

X

|

INHALT

6 Analyse-Methoden 6.1 Integrierte Analyse-Methoden .......................................................................... 271 6.1.1 Szenarien ............................................................................................ 271 6.1.2 Zielwertsuche ..................................................................................... 276 6.1.3 Datentabellen ..................................................................................... 279 6.1.4 Prognoseblatt...................................................................................... 284 6.1.5 Lineare Optimierung .......................................................................... 287 6.1.6 Deterministische Simulation .............................................................. 288 6.1.7 Probabilistische Simulation ................................................................ 290 6.2 Ergänzende Analyse-Methode ......................................................................... 294 6.2.1 Installation des Analyse-Add-Ins ....................................................... 294 6.2.2 Histogramm........................................................................................ 295 6.2.3 Populationskenngrößen ...................................................................... 299 6.2.4 Regression und Korrelation................................................................ 301 6.2.5 VBA-Funktion Korrelationsmatrix .................................................... 304 6.2.6 Solver ................................................................................................. 306 6.2.7 Exponentielle Glättung ...................................................................... 309

7 Strategisches Prozess-Controlling 7.1 Grundlegende Methoden .................................................................................. 311 7.1.1 Prozessreife-Bestimmung .................................................................. 311 7.1.2 Die VMI-Matrix ................................................................................. 315 7.1.3 SWOT-Analyse .................................................................................. 318 7.1.4 Wettbewerbsanalse............................................................................. 320 7.2 Kennzahlen....................................................................................................... 322 7.2.1 Key Performance Indicators ............................................................... 323 7.2.2 Kennzahlensysteme ............................................................................ 325 7.2.3 Benchmarking .................................................................................... 326 7.2.4 Balanced Scorecard ............................................................................ 329 7.2.5 Prozess-Reporting .............................................................................. 332 7.3 Kostenrechnerische Analysen .......................................................................... 334 7.3.1 Prozesskostenrechnung ...................................................................... 334 7.3.2 Gewinn- und Verlustrechnung (GuV) ................................................ 336 7.3.3 Deckungsbeitragsrechnung (DBR) .................................................... 340 7.3.4 Break-Even-Analyse .......................................................................... 344 7.3.5 Kurzfristige Erfolgsrechnung (KER) ................................................. 348 7.4 Abschreibung und Cashflow ............................................................................ 351 7.4.1 Lineare Abschreibung ........................................................................ 351 7.4.2 Cashflow ............................................................................................ 354 7.5 Kreditberechnungen ......................................................................................... 356 7.5.1 Zinsrechnung...................................................................................... 356 7.5.2 Tilgungsrechnung .............................................................................. 359 7.5.3 Annuitätentilgung .............................................................................. 361 7.5.4 Vergleichsrechnung ........................................................................... 363 7.6 Investitionsrechnungen..................................................................................... 364 7.6.1 Statische Investitionsrechnung ........................................................... 365 7.6.2 Dynamische Investitionsrechnung ..................................................... 365 7.6.3 Investitionsdaten zusammenstellen .................................................... 366

INHALT

|

XI

7.6.4 Die statische Amortisationsrechnung ................................................. 367 7.6.5 Die Kapitalwert-Methode .................................................................. 368 7.6.6 Die dynamische Amortisationsrechnung ........................................... 369 7.6.7 Der interne Zinsfuß ............................................................................ 370 7.6.8 Die Kosten-Vergleichsrechnung ........................................................ 371

8 Operatives Prozess-Controlling 8.1 Analyse-Methoden ........................................................................................... 373 8.1.1 ABC-Analyse .................................................................................... 373 8.1.2 Verteilungen ...................................................................................... 378 8.1.3 Zweidimensionale Leistungsmessung ................................................ 384 8.2 Bereichs-Controlling ........................................................................................ 386 8.2.1 Material-Controlling .......................................................................... 386 8.2.2 Produktions-Controlling..................................................................... 395 8.2.3 Marketing-Controlling ....................................................................... 402 8.2.4 IT-Controlling .................................................................................... 404 8.2.5 Personal-Controlling .......................................................................... 407

9 Strategisches Projekt-Controlling 9.1 Analyse-Methoden ........................................................................................... 411 9.1.1 BCG-Matrix ....................................................................................... 411 9.1.2 McKinsey-Matrix ............................................................................... 414 9.1.3 Risiko-Portfolio.................................................................................. 416 9.1.4 Nutzwert-Analyse (NA) ..................................................................... 418 9.1.5 Einfluss-Analyse ................................................................................ 421 9.2 Planungs-Methoden.......................................................................................... 423 9.2.1 Projekt-Strukturplan (PSP) ................................................................ 423 9.2.2 Netzplan ............................................................................................. 429 9.2.3 Gantt-Diagramm ................................................................................ 436 9.2.4 Ressourcenplanung ............................................................................ 440 9.2.5 Kapazitätsplanung .............................................................................. 445 9.2.6 Terminplanung ................................................................................... 446 9.2.7 Kostenplanung ................................................................................... 448

10 Operatives Projekt-Controlling 10.1 Organisations-Methoden ................................................................................ 451 10.1.1 Projekt-Tracking .............................................................................. 452 10.1.2 Kostengang- und Kostensummenlinie ............................................. 453 10.1.3 Projekt-Finanzplan ........................................................................... 456 10.1.4 Agile Projektplanung ....................................................................... 461 10.1.5 Kostenvergleichstabelle ................................................................... 464 10.2 Kontroll-Methoden ......................................................................................... 466 10.2.1 Meilenstein-Trendanalyse ................................................................ 467 10.2.2 Ressourcen-Trendanalyse ................................................................ 469 10.2.3 Kosten-Trendanalyse ....................................................................... 471 10.2.4 Kosten-Termin-Diagramm ............................................................... 473 10.2.5 Earned-Value-Analyse ..................................................................... 475 10.2.6 Leistungsmäßiger Fortschrittsgrad ................................................... 477

XII

|

INHALT

10.2.7 Fortschrittsgrad ................................................................................ 481 10.2.8 Reviews ............................................................................................ 481

Anhang Literaturverzeichnis ................................................................................................483 Diagrammverzeichnis ............................................................................................485 Funktionenverzeichnis ...........................................................................................487 Stichwortverzeichnis ..............................................................................................489

INHALT

|

XIII

KAPITEL 1

Einführung in VBA

VBA wurde ursprünglich entwickelt, um Anwendungen (Applications) unter Office anzupassen. Solche Anwendungen sind Word, Excel, Access, Outlook, PowerPoint, Visio, Project u. a. Und darin liegt die Einschränkung. Im Gegensatz zu Visual Basic lässt sich Visual Basic for Application nur in einer solchen Anwendung nutzen.

1.1 Die VBA-Entwicklungsumgebung Doch VBA ist noch viel mehr als nur eine einfache Programmiersprache. VBA besitzt nicht nur eine integrierte Entwicklungsumgebung (IDE = Integrated Development Environment), sondern ermöglicht auch eine objektorientierte Programmierung (Bild 1-1). Zusätzliche Werkzeuge erlauben das Testen und Optimieren von Prozeduren.

Bild 1-1.Office-Anwendungen und IDE

Der Zugang zur IDE erfolgt über das Register Entwicklertools, die nach der Installation von Excel nicht freigeschaltet ist. Die Freischaltung wird wie folgt erreicht: x x x x x x

Register Datei mit einem Mausklick wählen (alternativ Tasten ALT + D) In der linken Spalte die Auswahl Optionen wählen (ALT + O) Im Dialogfenster Excel-Optionen in der linken Spalte Menüband anpassen wählen Im rechten Feld Hauptregister die Option Entwicklertools mit einem Mausklick setzen (im Optionsfeld erscheint ein Haken) Danach mit der Schaltfläche OK das Dialogfenster schließen Nun existiert in der Excel-Anwendung das Register Entwicklertools.

© Springer Fachmedien Wiesbaden GmbH, ein Teil von Springer Nature 2023 H. Nahrstedt, Excel + VBA für Controller, https://doi.org/10.1007/978-3-658-43157-0_1

Geöffnet wird die integrierte Entwicklungsumgebung (IDE) aus einer Office-Anwendung heraus wie folgt: x x x x

Register Entwicklertools wählen (ALT + W) In der Menügruppe Code die Auswahl Visual Basic anklicken (ALT + V) Es öffnet sich das Fenster der IDE Die IDE kann, außer über das Register Entwicklertools, auch mit den Tasten ALT + F11 aufgerufen werden.

1.1.1 Der Visual Basic-Editor Die IDE wirkt auf den ersten Blick erdrückend. Nicht zuletzt, weil sie aus mehreren Fenstern besteht, die unterschiedliche Aufgaben erfüllen. Es folgen die üblichen Grundeinstellungen. Die IDE besitzt das Register Extras und darunter die Auswahl Optionen. Diese öffnet ein Dialogfenster mit vier Registern. Die nun folgenden Einstellungen werden sich dem Leser erst im Laufe dieses Buches erschließen. Unter Editor (Bild 1-2) werden die Entwicklungsparameter des VBA-Editors eingestellt.

Bild 1-2. Optionen zum Editor

Alle Optionsfenster werden ausgewählt. Die automatische Syntaxüberprüfung ist standardmäßig gesetzt und überprüft jede Eingabe auf Syntaxfehler. Auch auf falsch geschriebene Schlüsselwörter oder fehlende Trennzeichen. Sofern der Code korrekt ist, wird er in eine interne Form übersetzt, wodurch sich der Übergang zur Laufzeit beschleunigt. Wichtig ist vor allem die Option Variablendeklaration erforderlich. Dadurch wird in der Programmierung eine Deklaration aller verwendeten Variablen erzwungen. Ein absolutes Muss für gute Programme. Damit steht in der ersten Zeile eines jeden sich neu öffnenden Codefensters immer automatisch die Anweisung: Option Explicit

Diese Anweisung ist in den folgenden Codelisten nicht mit aufgeführt. Weitere Optionen, soweit sie erforderlich sind, stehen unter dieser Anweisung und werden in den Codelisten genannt.

2

|

Einführung in VBA

Die Tab-Schrittweite erhält den Wert 3. Dadurch kann der Code mit der Tab-Taste strukturiert werden. Wie Code in VBA sinnvoll strukturiert wird, ist an den Codelisten erkennbar. Dabei wird von einer Umklammerung ausgegangen. Eine Prozedur mit Sub und End Sub umklammert den dazwischenliegenden Code. Die Anweisung If-Then-Else-End If umklammern zwei alternative Anweisungsblöcke usw. Sub Test() Variablendeklarationen If Bedingung Then Anweisungsblock Else Anweisungsblock End If End Sub

Unter Editorformat (Bild 1-3) wird die Schriftart für die Codedarstellung gewählt.

Bild 1-3. Optionen zum Editorformat

Hier ist Courier New mit der Schriftgröße 10 eingestellt, weil bei dieser Schriftart alle Zeichen die gleiche Breite besitzen und somit direkt untereinanderstehen. Diese Schriftart und die Strukturierung fördern deutlich die Lesbarkeit des Programmcodes, zusammen mit ausreichender Kommentierung. Sub LesbarkeitsBeispiel() Dim iIndex As Integer 'Prozedur-Anweisungen For iIndex = 1 To 10 If iIndex > 5 Then 'Anweisungsblock 1 Else 'Anweisungsblock2 End If Next iIndex End Sub

Unter Allgemein befinden sich Angaben zur Darstellung der Benutzeroberfläche (Bild 1-4).

1.1 Die VBA-Entwicklungsumgebung

|

3

Bild 1-4. Optionen zu Allgemein

Die Anordnung von Steuerelementen geschieht in Rastern. Hier werden zwei Punkte eingestellt, um die Anordnung von Objekten in einem kleinen Raster zu ermöglichen. Und im letzten Fenster Verankern (Bild 1-5) sind alle möglichen Fenster der IDE aufgeführt.

Bild 1-5. Optionen zur Darstellung der Fenster

Hauptsächlich benötigt, zur Entwicklung und Ausführung, wird der Projekt-Explorer und das Eigenschaftsfenster. Das größte Fenster zeigt den Code des jeweils ausgewählten Objekts und wird als VBA-Editor bezeichnet. Mit einem Doppelklick auf ein Objekt im Projekt-Explorer öffnet sich das zugehörige Code-Fenster automatisch. Lediglich die Formulare (UserForms) machen da eine Ausnahme. Sie besitzen eine eigene Oberfläche und es kann zwischen CodeAnsicht und Objekt-Ansicht umgeschaltet werden. Alle Einstellungen in den Optionen bleiben bis zu ihrer Änderung bestehen, auch über eine Projektdatei hinaus.

4

|

Einführung in VBA

1.1.2 Projekt und Projekt-Explorer Eine Excel-Anwendung, zu der neben Blättern auch Benutzerflächen, Programmmodule, Objekte und Prozeduren gehören, wird in der Entwicklungsumgebung als Projekt verwaltet. Das ist die Aufgabe des Projekt-Explorers (Bild 1-6). Jedes Projekt besitzt einen Namen, der beim Neustart einer Excel-Anwendung immer VBAProjekt lautet. Jedes Projekt sollte aber einen eigenen aussagekräftigen Namen bekommen, in dem keine Sonderzeichen und Leerzeichen vorkommen. Ziffern sind nur innerhalb des Namens erlaubt.

Bild 1-6. Der Projekt-Explorer im Visual Basic-Editor

Wichtig ist, dass in der Menüleiste des Projekt-Explorers zwei Schaltflächen von großer Bedeutung liegen (Bild 1-6). Mit diesen Schaltflächen wird die Darstellung des aktiven Objekts bestimmt. Also ob im VBA-Editor ein Objekt (z. B. eine Benutzerfläche) als Ansicht oder die zugehörigen Prozeduren als Programmcode dargestellt werden. Ein im ProjektExplorer ausgewähltes Objekt ist auch immer im VBA-Editor sichtbar, soweit dies von der Art des Objekts möglich ist.

1.1.3 Der Objektkatalog Der Objektkatalog (Bild 1-7), der sich genauso wie alle anderen Fenster in der IDE über das Register Ansicht im Editor einschalten lässt, zeigt die Objekt-Klassen, Eigenschaften, Methoden, Ereignisse und Konstanten an, die in den Objektbibliotheken und Prozeduren dem jeweiligen Projekt zur Verfügung stehen.

Bild 1-7. Der Objektkatalog im Visual Basic-Editor

1.1 Die VBA-Entwicklungsumgebung

|

5

Mithilfe dieses Dialogfensters lassen sich Objekte der Anwendung, Objekte aus anderen Anwendungen oder selbstdefinierte Objekte suchen und verwenden.

1.1.4 Das Eigenschaftsfenster Das Eigenschaftsfenster ist für die Entwicklung sehr wichtig. Es listet für das ausgewählte Objekt die Eigenschaften zur Entwurfszeit und deren aktuelle Einstellungen auf (Bild 1-8).

Bild 1-8. Das Projekt- und Eigenschaftsfenster im Visual Basic-Editor

Das Eigenschaftsfenster wird unter dem Projekt-Explorer angeordnet. Beim Start des ersten Projekts kann es durch Ziehen der Kopfzeile mit der Maus an den linken Rand des VBAEditors geheftet werden. Im oberen Auswahlfeld des Eigenschaftsfensters steht in fetter Schrift das ausgewählte Objekt und dahinter in einfacher Schrift der Objekttyp. Im Auswahlfeld kann ein anderes Objekt aus einer Liste aller vorhanden Objekte ausgewählt werden. Einfacher ist die Auswahl aber durch Anklicken eines Objekts im Projekt-Explorer oder VBA-Editor. Unter dem Auswahlfeld stehen die Eigenschaften des Objekts. Sie lassen sich zur Entwurfszeit durch Anklicken bzw. durch Doppelklick ändern. Werden mehrere Objekte gleichzeitig ausgewählt, dann enthält das Eigenschaftsfenster eine Liste nur der Eigenschaften, die die ausgewählten Objekte gemeinsam besitzen. So müssen mehrere Objekte nicht einzeln geändert werden.

1.1.5 Weitere Hilfsfenster Die Direkt-, Lokal- und Überwachungsfenster dienen zum Testen der Programme. Das Direktfenster dient zum Eingeben und zum Ausführen von Programmcode zur Fehlersuche. Das Lokalfenster zeigt alle deklarierten Variablen in der aktuellen Prozedur und deren Werte. Das Überwachungsfenster überwacht Ausdrücke und alarmiert beim Eintreten von Randbedingungen. Für die Handhabung der IDE sind sie zunächst von untergeordneter Bedeutung. Übung 1-1. Neues Projekt anlegen x x x x x

6

|

Im ersten Schritt wird eine neue Excel-Anwendung geöffnet und die Einstellungen, wie unter 1.1 beschrieben, werden vorgenommen Der Visual Basic-Editor wird geöffnet (ALT + F11) Mit einem Mausklick im Projektfenster auf den Projektnamen, kann dieser im Eigenschaftsfenster geändert werden, z. B. ErstesProjekt Die Änderung ist anschließend im Projektfenster zu sehen Eine Namensänderung kann beliebig oft durchgeführt werden.

Einführung in VBA

1.2 Objekte 1.2.1 Objekte, allgemein Der grundlegende Begriff in der IDE ist das Objekt. Einem Objekt werden Eigenschaften, Methoden und Ereignisse zugeordnet. Die Schreibweise von Objekt, Unterobjekt und Methode oder Eigenschaft ist: Objekt[.Unterobjekt ... ][.Methode]

oder Objekt[.Unterobjekt ... ][.Eigenschaft]

Soll z. B. ein Textfeld TextBox1 auf dem Formular UserForm1 den Text „Dies ist ein Test!“ zugewiesen bekommen (Erläuterung kommt später), dann lautet die Anweisung: UserForm1.TextBox1.Text = "Dies ist ein Test!"

Ein fester Text wird durch Anführungszeichen gekennzeichnet. Soll der Text nicht angezeigt werden, dann kann die Eigenschaft Visible des Textfeldes auf den Wert False (Falsch) gesetzt werden. Standardmäßig (default) steht der Wert auf True (Wahr). UserForm1.TextBox1.Visible = False

Ereignissen von Objekten sind in der Regel Ereignis-Prozeduren zugeordnet. Zum Beispiel zeigt ein Klick mit der linken Maustaste auf die Befehlsschaltfläche mit dem Namen cmdStart eines Formulars im Entwurfsmodus im Codefenster des Formulars die Prozedur: Private Sub cmdStart_Click() End Sub

Der Name einer Ereignis-Prozedur besteht immer aus den Namen von Objekt und Ereignis, verbunden durch einen Tiefstrich. Diese Prozedur bekommt dann alle Anweisungen, die ausgeführt werden sollen, wenn die Schaltfläche im Ausführungsmodus angeklickt wird. Geschieht die obere Textzuweisung im Formular UserForm1, auf dem sich auch das Textfeld TextBox1 befindet, dann genügt es zu schreiben: TextBox1.Text = "Dies ist ein Test!"

Es muss also nicht immer die gesamte Objekthierarchie genannt werden, wenn das Objekt eindeutig bestimmt ist. Ebenso gibt es gewisse Grundeinstellungen (Default-Werte), die in der Aufzählung von Objekt und Eigenschaft nicht genannt werden müssen. Bei einem Textfeld ist dies der Default-Wert Text und so genügt es zu schreiben: TextBox1 = "Dies ist ein Test!"

damit der Eigenschaft Text des Objekts TextBox1 der konstante Text zugewiesen wird. Objekte in VBA sind Dokumente, Tabellen, Folien, Abfragen etc. Aber auch Fenster, Module, Steuerelemente, Statusleisten, Menüelemente usw. Den Objekten können im Eigenschaftsfenster unter der Eigenschaft Name andere Namen zugeordnet werden. Objektnamen erhalten ein Präfix, um die Objektart zu kennzeichnen. Dies ist nicht zwingend einzuhalten, dient aber der Übersichtlichkeit im Programmcode. Ein einmal festgelegtes Präfix sollte dann nicht mehr geändert werden.

1.2 Objekte

|

7

Beispiele: x x x x x

app – Application wbk – Workbook wsh – Worksheet mod – Modul com – Befehlsschaltfläche.

Ein schneller Zugang zu Eigenschaften und Methoden eines Objekts ist durch das Kontextmenü möglich. Dabei wird das Objekt mit einem Klick der linken Maustaste im Entwurfsmodus angeklickt. Mit einem Klick auf die rechte Maustaste öffnet sich ein Dialogfenster, das sogenannte Kontextmenü. Darin werden die wichtigsten Methoden und Eigenschaften des markierten Objekts zur Auswahl angezeigt. Das Kontextmenü existiert auch bei Objekten in der Anwendung.

1.2.2 Objektlisten Grundsätzlich ist zwischen Objektlisten und den Objekten selbst zu unterscheiden. Objekte (Workbook, Worksheet etc.) in Objektlisten (Workbooks, Worksheets etc.) werden über ihren Namen oder einen Index angesprochen. Entspricht der angegebene Index keinem vorhandenen Listenelement, so erfolgt eine Fehlermeldung. Die Count-Eigenschaft einer Objektliste liefert die Anzahl Objekte in der Objektliste. ActiveWorkbook.Worksheets.Count

Um ein Objekt in einer Objektliste anzusprechen, wird die Item-Methode verwendet. So liefert ActiveWorkbook.Worksheets(1).Name ActiveWorkbook.Worksheets.Item(1).Name

den Namen des ersten Arbeitsblattes (eine Eigenschaft des Objekts Worksheet) in der aktuellen Excel-Anwendung. Beide Codezeilen sind gleichwertig. Zu Objektlisten lassen sich mit der Add-Methode neue Objekte hinzufügen. ActiveWorkbook.Worksheets.Add

Während die Remove-Methode bzw. Delete-Methode, je nach Objektliste, ein Objekt löscht. ActiveWorkbook.Worksheets(1).Delete

Alle Objekte in einer Objektliste lassen sich über eine For-Each-Next-Anweisungsstruktur aufrufen. Sie wird später erklärt. Sub Test() Dim wshTemp As Worksheet For Each wshTemp In ActiveWorkbook.Worksheets MsgBox wshTemp.Name Next End Sub

1.2.3 Objektvariable Objektvariable sind Variable, die auf ein Objekt verweisen. Sie werden genauso wie normale Variable mit der Dim-, Private- oder Public-Anweisung deklariert unter Zuweisung des Objekttyps.

8

|

Einführung in VBA

Dim Objektvariable As Objekttyp

Mit Objektvariablen wird der Zugriff auf Objekte einfacher und schneller. Es müssen nicht immer alle Objektstrukturen genannt werden. Lediglich die Instanziierung unterscheidet sich von normalen Variablen und muss mittels der Anweisung Set erfolgen: Set Objektvariable = Objektausdruck

Der Einsatz von Objektvariablen erspart vor allen Dingen viel Schreibarbeit, da sie bedeutend kürzer gehalten werden können als die Objekte unter Excel, mit denen sie referieren. Bekommen sie noch Namen, die auf ihre Eigenschaft oder Anwendung hinweisen, dann wird man schnell den Nutzen dieses Variablentyps schätzen lernen. Zur Deklaration bietet die jeweilige Office-Anwendung Objekttypen, die in Klassen definiert sind. Wie zum Beispiel in Excel die Klasse Worksheet, die zur Bibliothek MS Excel gehört und bereits mit der Installation von Excel existiert (Bild 1-9).

Bild 1-9. Auswahl aus vorhandenen Klassen

Bereits bei der Deklaration einer Variablen werden durch die Intellisense-Funktion mit den ersten Buchstaben des Objekttyps die Auswahlmöglichkeiten angezeigt und mit jedem weiteren Zeichen eingeschränkt. Mit der späteren Nutzung der Objektvariablen werden, wiederum durch die Intellisense-Funktion, nach Eingabe eines Punktes hinter der Objektvariablen, die Auswahlmöglichkeiten eingeblendet (Bild 1-10). Die Auswahl besteht aus Unterobjektlisten, Unterobjekten, Eigenschaften, Methoden und Ereignissen, die diese Klasse besitzt.

Bild 1-10. Auswahl der Elemente eines Objekts

1.2 Objekte

|

9

Je nach Objektmodell können weitere Unterelemente folgen. Die Symbole vor der Auswahl kennzeichnen den Objekttyp. Der Objektkatalog zeigt eine Auswahl an Bibliotheken, Klassen und Elementen (Bild 1-11).

Bild 1-11. Bibliothek, Klasse und Elemente im Objektkatalog

Dazu werden in den Eingabefeldern oben links die Klasse und das Objekt zur Auswahl eingegeben oder aus der Vorgabeliste ausgewählt. Das Ergebnis der Suche wird in einer Liste dargestellt, in der wiederum durch Mausklick das entsprechende Element ausgewählt wird. Im Feld darunter erscheint noch einmal die Auswahl der Klasse mit ihren Eigenschaften, Methoden und Ereignissen. Darunter erfolgt dann noch die Angabe der Syntax. Weitere Informationen können über das Fragezeichen-Symbol aufgerufen werden. Microsoft zeigt auf bereitgestellten Webseiten neben weiteren Erklärungen auch einige Anwendungsbeispiele. Frühe und späte Bindung Bereits mit der Deklaration wird die Objektvariable direkt an eine Klasse gebunden und diese Form wird als frühe Bindung bezeichnet. Es gibt noch die Möglichkeit, eine Deklaration mit dem formalen Objekttyp Object durchzuführen (Bild 1-12).

Bild 1-12. Auswahl des formalen Objekttyps

10

|

Einführung in VBA

Der Objekttyp Object ist ein Unterdatentyp des Universaldatentyps Variant, sodass statt Object auch Variant geschrieben werden kann. Die Nachteile einer Deklaration mit Object sind dann x x x

der VBA-Editor kann keine Auswahl anbieten eine Überprüfung der Angaben von Eigenschaften und Methoden findet nicht statt die Ausführung ist langsamer.

Die folgende Testprozedur öffnet eine Word-Anwendung, die durch die Objektvariable objTest vertreten wird und erstellt darin ein leeres Dokument. Sub Test() Dim objTest As Object Set objTest = CreateObject("Word.Application") objTest.Visible = True objTest.Documents.Add End Sub

Diese Form wird als späte Bindung bezeichnet, da ihre Bindung erst mit der Instanziierung erfolgt. Warum man sie dennoch braucht, wird nachfolgend erklärt. Die Objektbibliothek von Word hat Excel standardmäßig nicht mit eingebunden. In der IDE unter Extras / Verweise kann dies aber nachgeholt werden (Bild 1-13).

Bild 1-13. Word-Objektbibliothek einbinden

Damit lassen sich die Word-Objekte jetzt auch mit der frühen Bindung nutzen (Bild 1-14). Doch was passiert, wenn die Exceldatei mit dieser Prozedur an einen anderen Nutzer mit einem anderen PC weitergegeben wird, der die Word-Bibliothek nicht eingebunden hat? Er erhält folgerichtig eine Fehlermeldung. Bei einer Prozedur mit später Bindung passiert das nicht, da hier keine Bibliotheksanbindung verlangt wird.

1.2 Objekte

|

11

Bild 1-14. Anbindung von Word-Objekten durch frühe Bindung

Die Entwicklung einer Prozedur sollte daher möglichst mit früher Bindung durchgeführt werden, die dann vor der Weitergabe in eine späte Bindung umgestellt wird. Dabei müssen auch VBA- und System-Konstante durch ihren Wert ersetzt werden. Der wird angezeigt, wenn beim Debuggen1 durch den Code der Mauszeiger auf die Konstante gestellt wird (Bild 1-15).

Bild 1-15. Anzeige des Wertes 9 der Systemkonstanten vbGreen beim Debuggen

Sollen Objektvariable miteinander verglichen werden, dann ist es längst nicht so einfach wie mit normalen Variablen. Denn zunächst einmal muss die Frage beantwortet werden, wann zwei Objektvariablen gleich sind? Sind sie gleich, wenn sie zur selben Klasse gehören, oder müssen sie gleiche Werte besitzen? Sie sind dann gleich, wenn sie auf die gleiche Instanz eines Objektes verweisen. Ein Vergleich wird mit dem Is-Operator wie im nachfolgenden Beispiel (Bild 1-16) durchgeführt.

Bild 1-16. Vergleich von Objektvariablen

Bezeichnet das Testen von Anweisungen im VBA-Editor durch einen Klick auf die Prozedur und die schrittweise Ausführung mit der F8-Taste.

1

12

|

Einführung in VBA

Die erste Ausgabe (MsgBox) liefert das Ergebnis Falsch, denn beide Objektvariablen gehören zwar zur selben Klasse, verweisen aber nicht auf die gleiche Instanz. Die zweite Ausgabe liefert das Ergebnis Wahr, denn durch die Set-Zuweisung verweisen beide Objektvariable auf die gleiche Instanz. Diese Form der Gleichheit von Objektvariablen beruht auf der Tatsache, dass eine Objektvariable nichts anderes als die Adresse einer Instanz im Arbeitsspeicher enthält. Der IsOperator vergleicht nur, ob die beiden Adressen übereinstimmen. Alternativ kann man die beiden Objektvariablen auch über die (undokumentierte) ObjPtr-Funktion vergleichen. MsgBox ObjPtr(objTest1) = ObjPtr(objTest2)

Die ObjPtr-Funktion mit der Syntax ObjPtr(Objektname) As LongPtr

liefert einen Zeiger auf ein Objekt (die Programmiersprache C++ lässt grüßen), dessen Adresse dann zum Vergleich steht. MsgBox ObjPtr(objTest1)

1.2.4 Anwendungen und Makros Unter Anwendungen sind die Office Programme Word, Excel, Outlook, PowerPoint etc. zu verstehen. In diesen Anwendungen lassen sich Prozeduren und Funktionen programmieren oder mit der Makro-Funktion erzeugen. Die Makro-Funktion wird mit dem Register Entwicklertools und der Auswahl Makro aufzeichnen in der Menügruppe Code gestartet. Eine zweite Startmöglichkeit besteht darin, über das Register Ansicht unter Makros die Auswahl Makro aufzeichnen zu wählen. Alle Tätigkeiten in der Excel-Arbeitsmappe werden von da an, wie bei einem Recorder, aufgezeichnet. Gestoppt wird die Aufzeichnung wieder mit der Auswahl Aufzeichnung beenden an gleicher Stelle.  2-12-01-01_KreisStart.xlsm Übung 1-2. Mit der Makro-Funktion eine Kreisfläche berechnen Betrachtung der Makro-Funktion an einem einfachen Beispiel: x x x

x x x

Öffnen einer neue Excel-Arbeitsmappe In eine beliebige Zelle der Tabelle1 den Durchmesser eines Kreises eingeben. In diesem Beispiel ist es die Zelle B4. Die Eingabe wird mit der Eingabetaste bestätigt Danach ist die Zelle B5 markiert. Sollte die Zelle C4 markiert sein, dann muss eine Grundeinstellung in Excel geändert werden: o Über das Register Datei, unter Optionen die Gruppe Erweitert aufrufen o Bei den Bearbeitungsoptionen unter Markierung nach Drücken der Eingabetaste verschieben die Richtung Unten wählen o Den Vorgang mit OK beenden Die Methode Makro aufzeichnen, wie zuvor beschrieben, einschalten Im neu geöffneten Dialogfenster als Makroname Kreis eingeben. Weitere Angaben sind nicht erforderlich Die Eingabe mit der Schaltfläche OK beenden

1.2 Objekte

|

13

x

In der Zelle B5 die Formel = B4 * B4 * 3,1415926 / 4 eingeben und mit der Eingabetaste bestätigen. Die Formel entspricht der allgemeinen Gleichung zur Bestimmung des Inhalts einer Kreisfläche (1.1) mit dem Durchmesser d ‫ ܣ‬ൌ ݀ଶ

x

గ ସ

(1.1)

Die Makroaufzeichnung dort stoppen, wo sie gestartet wurde.

Nun existiert ein sogenanntes Makro. Mit jeder neuen Eingabe im Feld B4 und dem abschließenden Druck auf die Eingabetaste, erscheint in B5 das Ergebnis. Der Wert in B4 kann auch geändert werden (ohne Eingabetaste). Dann muss unter Register Entwicklertools / Makros (oder ALT + F8) aus der Makroauswahl das Makro Kreis gestartet werden, sodass wieder eine neue Flächenberechnung erfolgt. Das Makro funktioniert auch mit anderen Zellen. Wird eine beliebige andere Zelle ausgewählt und ein Durchmesserwert eingetragen, dann erfolgt mit dem erneuten Aufruf des Makros Kreis eine Berechnung. Mit der Aufzeichnung des Makros befindet sich im Projekt-Explorer ein neuer Ordner Module und darin ein neues Objekt Modul1. Dieses wurde durch den Makro-Recorder erzeugt. Ein Doppelklick auf Modul1 im Projekt-Explorer zeigt den Inhalt des Moduls im VBA-Editor. Sub Kreis() 'Makro am TT.MM.JJJJ von Harald Nahrstedt aufgezeichnet ActiveCell.FormulaR1C1 = "=R[-1]C*R[-1]C*3.1415926/4" Range("B6").Select End Sub

Zeilen, die mit einem Hochkomma beginnen, sind als reine Kommentarzeilen zu betrachten und grün dargestellt. Sie haben keinen Einfluss auf den Ablauf. Die Prozedur selbst beinhaltet zwei Anweisungen. Die erste Anweisung bezieht sich auf die aktive Zelle (ActiveCell) (in unserem Fall B5) und benutzt den Wert aus der Zeile (Row) davor (R[-1]) und der gleichen Spalte (Column) C. Diese Art der Adressierung bezeichnet man als indirekt. Man gibt also keine absolute Adresse (B4) an, sondern sagt: Die aktuelle Zeile - 1. Der Vorteil liegt klar auf der Hand. Das Makro lässt sich auf jede beliebige Zelle anwenden, wie zuvor schon ausprobiert wurde. Der Wert (aus der vorherigen Zelle) wird mit sich selbst multipliziert, dann mit der Kreiskonstanten π = 3.1415926 multipliziert und durch 4 dividiert. Das Komma bei der Eingabe von 3,14… wurde durch einen Punkt ersetzt (VBA spricht Englisch). Das Ergebnis wird in der aktuellen Zelle B5 abgelegt. Danach wird die Zelle B6 angesprochen. Die Anweisung Range("B6").Select ist überflüssig und kann entfernt werden. Dazu wird die Anweisung markiert und mit der ENTF-Taste gelöscht. Für ein Makro, oder besser für eine Prozedur, wird nicht grundsätzlich ein Modul benötigt. Die Prozedur lässt sich auch direkt in das Codefenster einer Tabelle oder dem Objekt DieseArbeitsmappe kopieren: x x x x x x

14

|

Dazu die gesamte Prozedur in Modul1 (ohne Option Explicit) markieren Im Kontextmenü des Codefensters den Befehl Ausschneiden wählen Mit einem Doppelklick im Projekt-Explorer ein Tabellenobjekt auswählen Es öffnet sich das Codefenster des Tabellenobjekts im VBA-Editor Im Kontextmenü des Codefensters die Methode Einfügen wählen Die Prozedur gehört nun zum Tabellenobjekt und wird im Modul1 gelöscht

Einführung in VBA

x x

Unter Register Ansicht / Makros / Makros anzeigen im Menüband (oder ALT + F8) befindet sich in der Übersichtsliste den Eintrag Tabelle1.Kreis. Mit der Schaltfläche Ausführen wird das Mekro gestartet.

Dem Prozedurnamen wird also das entsprechende Objekt vorangestellt. Beide Namen werden durch einen Punkt getrennt, ganz im Sinne der Objektschreibweise (siehe Kapitel 1.2.1). Nun ist dies eine Übung und das Modul1 wird nicht mehr benötigt. Im Kontextmenü des Moduls wird Entfernen von Modul1 gewählt, ohne es zu speichern. Der Leser kann zur Übung noch andere einfache Makros erstellen, um ein Gefühl für die Wirkungsweise zu bekommen. Vielleicht mit anderen Volumenformeln oder ähnlichen Berechnungen. Die Makro-Funktion kann bei der Entwicklung sehr hilfreich sein. Wenn z. B. ein Diagramm per Prozedur erstellt werden soll, kann zuerst ein Makro den manuellen Vorgang zur Erstellung des Diagramms aufzeichnen. Der so erhaltene Quellcode lässt sich danach anpassen.

1.2.5 Makro im Menüband aufrufen Es ist sehr mühsam, für den Start einer Prozedur immer den Makro-Befehl aufzurufen. Unter Register Datei / Optionen gibt es die Auswahl Menüband anpassen. Damit öffnet sich ein Dialogfenster zur Anpassung (Bild 1-17).

Bild 1-17. Menüband anpassen

Die linke Seite des Dialogfensters dient der Auswahl weiterer Elemente, während die rechte Seite die vorhandenen Elemente im Menüband verwaltet. Dort gibt es ein Element Entwicklertools, das bei der Installation von Excel nicht ausgewählt ist. Dies wird durch Anklicken mit der Maus nachgeholt. Mit der Schaltfläche Neue Registerkarte wird ein neues Register im Menüband erstellt und mit der Schaltfläche Umbenennen in Makros geändert (Bild 1-18).

1.2 Objekte

|

15

Bild 1-18. Neues Register Makros

Mit dem neuen Register wird auch eine neue Gruppe eingefügt. Sie bekommt den Namen Berechnungen ebenfalls durch Umbenennen. Im nächsten Schritt wird im linken Bereich des Dialogfensters unter Befehle auswählen in der Auswahlliste Makros gewählt. In der Auswahlliste darunter sind nun alle vorhandenen Makros zu sehen. Nachdem das Makro Kreis und die Gruppe Berechnungen ausgewählt sind, kann mit der Schaltfläche Hinzufügen >> der Eintrag in die Menügruppe erfolgen (Bild 1-19).

Bild 1-19. Hinzufügen des Makroaufrufs zur Gruppe Einführung unter Register Makros

Der Eintrag bekommt den Namen Kreisfläche und evtl. ein Symbol. Danach befindet sich das Register Makros im Menüband mit der Gruppe Berechnungen und dem Aufruf Kreisfläche (Bild 1-20).

Bild 1-20. Register Makros im Menüband

16

|

Einführung in VBA

Übung 1-3. Ein weiteres Element dem Menüband hinzufügen und entfernen x x x x x

Unter Datei / Optionen erneut Menüband anpassen wählen. Unter Befehle auswählen die Auswahl Register für Tools wählen. Einen beliebigen Eintrag zum Menüband hinzufügen. Den Eintrag im Menüband überprüfen. Den Eintrag wieder entfernen.

1.2.6 Makro aus der Symbolleiste aufrufen Neben dem Menüband verfügt eine Office-Anwendung auch über eine Symbolleiste für den Schnellzugriff. Sie besitzt eine Auswahlliste, in der schon verschiedene Elemente aufgeführt sind, die durch Auswahl mit dem b Symbol in der Symbolleiste erscheinen. Dort kann auch die Position der Symbolleiste bestimmt werden. Sie sollte möglichst immer unter dem Menüband stehen. Mit der Auswahl Weitere Befehle wird ebenso wie unter Register Datei / Optionen / Symbolleiste für den Schnellzugriff das Dialogfenster zur Anpassung geöffnet. Es ähnelt dem Dialogfenster zur Anpassung des Menübandes und wird auch so behandelt. Auch hier wird unter Befehle auswählen / Makros die Übersicht der vorhandenen Makros aufgerufen. Mit der Auswahl des gewünschten Makros kann durch Hinzufügen >> der Makroaufruf direkt in die Symbolleiste übertragen werden, denn die Symbolleiste verfügt über keine Gruppeneinteilung. Mit der Schaltfläche Ändern wird danach der Eintrag in Projektstart umbenannt und erhält ein Symbol. In diesem Fall ist das Symbol sehr wichtig, da der Eintrag nur durch das Symbol dargestellt wird (Bild 1-21). Der Name Projektstart erscheint, wenn der Mauszeiger auf dem Symbol ruht.

Bild 1-21. Makroaufruf im Menüband und in der Symbolleiste

Elemente in der Menüleiste können über ihr Kontextmenü mit der Methode Zu Symbolleiste für den Schnellzugriff hinzufügen ebenfalls in die Symbolleiste übernommen werden. Mit der Methode Aus Symbolleiste für den Schnellzugriff entfernen im Kontextmenü des Symboleintrags kann der Eintrag wieder entfernt werden.

1.2.7 Formulare und Steuerelemente Zusätzlich zu den vorhandenen Ansichten können Formulare für den Dialog mit dem Anwender erstellt werden. Unter Register Einfügen in der IDE gibt es in der Auswahlliste die UserForm. Damit stellt die IDE ein neues Formular bereit und blendet gleichzeitig eine Toolsammlung mit vorhandenen Standard-Steuerelementen ein (Bild 1-22). Gleichzeitig befindet sich das Formular im Entwurfsmodus und kann bearbeitet werden, z. B. durch Einfügen von Steuerelementen.

1.2 Objekte

|

17

Bild 1-22. Formular zur Verwendung von Steuerelementen

Im Kontextmenü eines Steuerelements lassen sich mit der Methode Zusätzliche Steuerelemente weitere Steuerelemente anzeigen und auswählen. Sie befinden sich in zusätzlichen Dateien, die mit der Installation von Excel bereitgestellt werden. Nach ihrer Auswahl werden sie ebenfalls mit einem Symbol in der Toolsammlung angezeigt. In dem Eigenschaftsfenster zum Formular (UserForm1) befinden sich viele Eigenschaften, die mit der nötigen Vorsicht verändert werden können. Steuerelemente (eine Klasse von Objekten mit einer grafischen Oberfläche) sind das A und O der Formulare. Mit ihnen lässt sich ein Programmablauf steuern. Sie werden nach ihrer Auswahl auf dem Formular platziert. Durch Anfassen und Ziehen ist ihre Position frei bestimmbar. Da sie im Entwurfsmodus Ziehpunkte besitzen, kann ihre Form nachträglich verändert werden. Jedes Steuerelement hat bestimmte Eigenschaften, die im Eigenschaftsfenster angezeigt werden, sobald sie aktiv (mit der Maus angeklickt) sind. Die dort angegebenen Werte lassen sich im Entwurfsmodus verändern oder beim späteren Ablauf durch Wertzuweisung. Steuerelemente besitzen außerdem verschiedene Methoden (z. B. Activate, Refresh, Clear, Load, ...). Eine besondere Art von Methoden sind die Ereignisse, die von einem Steuerelement erkannt werden (z. B. Mausklick, Tastendruck, ...). Ist ein Steuerelement in der Lage, ein bestimmtes Ereignis zu erkennen, dann besitzt es eine entsprechende Ereignis-Prozedur, die mit dem Auftreten des Ereignisses ausgeführt wird. Als Beispiel wird eine Schaltfläche (CommandButton1) mit dem Namen Start auf dem Formular platziert (Bild 1-23).

18

|

Einführung in VBA

Bild 1-23. Steuerelement mit zugehöriger Ereignis-Prozedur

Ein Doppelklick auf die Schaltfläche Start im Entwurfsmodus schaltet auf die Codedarstellung um und zeigt die Ereignisprozedur CommandButton1_Click. Der Name entsteht aus der Kombination Objektname_Ereignis. In der Prozedur können Anweisungen vorgeben, wie das System auf das Ereignis reagieren soll. Zwischen den Darstellungen Objekt und Code kann mit den Schaltflächen im Projekt-Explorer (roter Rahmen) umgeschaltet werden. Ist das Formular mit allen Steuerelementen erstellt, kann der Entwurfsmodus unter Register Ansicht in der IDE ausgeschaltet werden. Nach dem Aufruf des Formulars sind alle Steuerelemente aktiv. Übung 1-4. Formular zur Berechnung von Kreisflächen erstellen x x x x x x x x

Es wird das Projekt Kreis aus der vorherigen Übung verwendet. Den VBA-Editor (ALT + F11) öffnen Unter Register Einfügen die UserForm wählen Wird die Toolsammlung nicht angezeigt, so lässt sie sich unter Register Ansicht / Werkzeugsammlung aufrufen Im Eigenschaftsfenster den Formularnamen auf frmKreis ändern Unter der Eigenschaft Caption wird Kreisberechnung eingetragen. Um die Eigenschaften des jeweiligen Objekts im Eigenschaftsfenster zu sehen, muss das Objekt mit einem Mausklick markiert werden. Durch Anklicken und Aufziehen mit der Maus werden nacheinander folgende Steuerelemente auf dem Formular angeordnet (Bild 1-24)

1.2 Objekte

|

19

Bild 1-24. Steuerelemente auf dem Formular zum Beispiel

x x x x x x x

Alle nachfolgenden Objekte erhalten die Schriftgröße (Font) 10 Ein CommandButton-Objekt bekommt den Namen cmdEnde und besitzt den Caption-Text Beenden Ein CommandButton-Objekt bekommt den Namen cmdRechne und besitzt den Caption-Text Berechnen Ein Label-Objekt behält den Namen Label1 und den Caption-Text Durchmesser Ein Label-Objekt behält den Namen Label2 und den Caption-Text Fläche Ein TextBox-Objekt bekommt den Namen tbxDurchm und dient zur Aufnahme des Durchmesserwertes Ein TextBox-Objekt bekommt den Namen tbxFläche und dient zur Aufnahme des berechnezen Flächenwertes.

 2-12-01-02_KreisFormular.xlsm Ein Klick auf die Schaltfläche Beenden soll später das gestartete Formular auch wieder entfernen. Dazu wird dieses Ereignis in einer Ereignis-Prozedur behandelt. Codeliste 1-1. Ereignisprozedur cmdEnde_Click im Formular frmKreis Private Sub cmdEnde_Click() Unload Me Worksheets("Berechnung").Cells.Delete End Sub

Gestartet wird das Formular frmKreis mit der Prozedur StartRechne. Eine genaue Definition der Anweisungen erfolgt zu einem späteren Zeitpunkt. Codeliste 1-2. Startprozedur für das Formular in Modul modKreis Sub StartRechne() Dim wshTemp As Worksheet Dim iCount As Integer Worksheets("Berechnung").Activate Load frmKreis With frmKreis .tbxDurchm = "10" .tbxDurchm.SelStart = 0 .tbxDurchm.SelLength = Len(.tbxDurchm.Text) .tbxFläche = KreisRechne(10) End With frmKreis.Show vbFalse End Sub

20

|

Einführung in VBA

Function KreisRechne(dDurchm As Double) As Double KreisRechne = dDurchm * dDurchm * 3.1415926 / 4 End Function

Mit der Anweisung Load wird das Formular in den Arbeitsspeicher geladen, ohne dass es auf dem Bildschirm erscheint. Dennoch können den Steuerelementen bereits Daten zugewiesen werden. Die TextBox tbxDurchm bekommt den Beispielwert 10. Die TextBox tbxFläche den berechneten Flächenwert für den Beispieldurchmesser. Die ursprüngliche Prozedur Kreis wurde in eine Funktion KreisRechne umgewandelt, die als Parameter einen Durchmesserwert dDurchm vom Datentyp Double erhält und den berechneten Flächenwert als Funktionswert ebenfalls vom Datentyp Double zurückgibt. Mit der Anweisung frmKreis.Show wird das Formular sichtbar (Bild 1-25).

Bild 1-25. Anzeige des Formulars

Befinden sich mehrere Steuerelemente auf einem Formular, so bekommt beim Start das Steuerelement mit dem niedrigsten TabIndex den Fokus, der dann je nach Ereignis an andere Steuerelemente weitergegeben wird. Im Kontextmenü eines Formulars gibt es die Auswahl Aktivierungsreihenfolge. Darunter kann die Reihenfolge für die Fokus-Vergabe manuell festgelegt werden (Bild 1-26).

Bild 1-26. Aktivierungsreihenfolge bestimmen

Mit dem Start von frmKreis liegt der Focus zunächst bei tbxDurchm, um dann nach einer Eingabe zur Schaltfläche cmdBerechne zu wechseln. Wird diese angeklickt, so löst sie die Ereignisprozedur cmdBerechne_Click aus.

1.2 Objekte

|

21

Codeliste 1-3. Ereignisprozedur cmdBerechne_Click im Formular frmKreis Private Sub cmdBerechne_Click() tbxFläche = Str(KreisRechne(Val(tbxDurchm))) With tbxDurchm .SetFocus .SelStart = 0 .SelLength = Len(tbxDurchm.Text) End With Call Protokoll End Sub Private Sub Protokoll() With Worksheets("Berechnung") .Cells(1, 1) = Val(frmKreis.tbxDurchm) .Cells(1, 2) = Val(frmKreis.tbxFläche) .Rows("1:1").Insert End With End Sub

Die Ereignisprozedur setzt nach der Berechnung den Focus wieder auf tbxDurchm, damit eine neue Eingabe erfolgen kann. Durch Selektion des Textinhalt kann direkt ein neuer Wert eingegeben werden. Eine zusätzliche Prozedur Protokoll überträgt die Daten in das Arbeitsblatt Berechnung. Zum Abschluss der Übung wird die Startprozedur im Register Makros installiert. ShowModal Ein Formular UserForm besitzt die binäre Eigenschaft ShowModal, die die Zustände True und False annehmen kann. Mit dem Standardwert vbTrue wird festgelegt, dass das Formular erst geschlossen werden muss, bevor ein anderer Teil der Anwendung aktiviert werden kann. Mit dem Wert vbFalse besitzt ein Formular keinen Modus, sodass Ansichten weiter nutzbar sind, während das Formular geöffnet ist. Die Show-Anweisung erhält dazu eine Ergänzung. frmKreis.Show vbFalse

1.2.8 Module Module dienen wie die Formulare zur Aufnahme von Prozeduren, die auch bei anderen Projekten eingesetzt werden können. Allerdings besitzen Module keine Oberfläche und damit auch keine Möglichkeit, Steuerelemente aufzunehmen. Ihre einzige Aufgabe ist es, ein Container für Programmcode zu sein und zur Darstellungsmöglichkeit ein Codefenster zu besitzen. Module kommen bei den Makros zum Einsatz, denn die Makro-Funktion erstellt Prozeduren ausschließlich in Modulen. Beliebig viele Module können in einem VBA-Projekt eingebunden sein und es lassen sich auch dieselben Module in verschiedenen VBA-Projekten einbinden. Dazu können sie genau wie Formulare autonom exportiert und importiert werden. Übung 1-5. Module nutzen Die bisher aus den Übungen im Objekt DieseArbeitsmappe oder in einem Arbeitsblatt abgelegten Prozeduren, können auch in Modulen abgelegt werden. Dadurch sind sie flexibler zu handhaben. Allerdings müssen dann die im Menüband installierten Aufrufe neu definiert werden.

22

|

Einführung in VBA

1.3 Die Syntax von VBA 1.3.1 Konventionen Kommentare im Programmcode werden zeilenweise gekennzeichnet. Eine Kommentarzeile beginnt mit einem Hochkomma oder der Anweisung Rem (für Remark). Siehe Prozedur Kreis im Kapitel 1.2.4. Längere Anweisungen können auf mehrere Zeilen verteilt werden. Dazu wird ein Unterstrich gesetzt. Achtung! Vor dem Unterstrich muss sich unbedingt ein Leerzeichen befinden. 'Dies ist eine Kommentarzeile Rem Dies ist auch eine Kommentarzeile 'Die nachfolgende Ausgabe-Anweisung ist auf zwei Zeilen verteilt angeordnet MsgBox "Testausgabe! Bitte bestätigen Sie mit ok!" _ vbInformation + vbOKOnly, "Wichtiger Hinweis" 'In den nachfolgenden Anweisungen werden die Inhalte zweier ' Variabler x und y über den Umweg der Variablen z vertauscht z = x: x = y: y = z

Eine Zeile kann auch mehrere Anweisungen enthalten. Sie werden dann durch einen Doppelpunkt voneinander getrennt und von links nach rechts abgearbeitet. Das Einrücken von Programmanweisungen innerhalb bedingter Anweisungen oder Programmschleifen dient nur der Übersichtlichkeit und hat keine Auswirkungen auf die Prozedur. Diese Form sollte unbedingt verwendet werden, denn so werden auch ältere Programme besser lesbar.

1.3.2 Prozeduren und Funktionen Prozeduren haben den grundsätzlichen Aufbau: [Private|Public] [Static] Sub Name [(Parameterliste)] [Anweisungen] [Exit Sub] [Anweisungen] End Sub

Der Aufruf der Prozedur erfolgt durch den Prozedurnamen und eventuelle Parameter. Bei den übergebenen Parametern kann es sich um Variable verschiedener Datentypen handeln. Sie sind nur in der Prozedur gültig. Werden Variable am Anfang eines Codecontainers mit Global definiert, so gelten sie in allen Prozeduren und Funktionen des gesamten VBA-Projekts. Aber Achtung, es muss immer zwischen lokalen und globalen Variablen unterschieden werden. Mehr dazu unter 1.3.4 Parameterlisten. Eine Prozedur kann jederzeit mit der Anweisung Exit Sub beendet werden. Sinnvollerweise in Abhängigkeit von einer Bedingung. Funktionen sind eine besondere Form von Prozeduren. Ihr Aufbau entspricht dem von Prozeduren mit dem Unterschied, dass der Funktionsname selbst als Variable agiert und einem Datentyp zugeordnet ist. [Public|Private|Friend][Static] Function Name [(Parameterliste)] [As Typ] [Anweisungen] [Name = Ausdruck] [Exit Function] [Anweisungen] [Name = Ausdruck] End Function

1.3 Die Syntax von VBA

|

23

Der Aufruf einer Funktion erfolgt durch den Funktionsnamen und eventuelle Parameter. Eine Funktion kann jederzeit mit der Anweisung Exit Function beendet werden. Die IDE verfügt über eine große Auswahl an Prozeduren und Funktionen in Bibliotheken. Eigenschaften wie Public, Private, Friend und Static werden im Kapitel Geltungsbereiche erklärt. Im VBA-Editor lassen sich unter Register Einfügen / Prozedur im Dialogfenster Prozedur hinzufügen Prozedur- und Funktionsrümpfe erzeugen (Bild 1-27).

Bild 1-27. Einfügen von Prozedur- und Funktionsrümpfen

1.3.3 Datentypen für Konstante und Variable Jedes Programm benötigt die Möglichkeit, Daten zu speichern. VBA bietet zwei Formen, Konstante und Variable. Beide Formen werden durch einen Namen bezeichnet. Für die Namensvergabe gibt es folgende Regeln: x x x x

erstes Zeichen muss ein Buchstabe sein weitere Zeichen können Ziffern, Buchstaben oder Sonderzeichen (keine mathematischen Zeichen und kein Leerzeichen) sein maximal 255 Zeichen kein VBA Schlüsselwort.

Feststehende Daten werden als Konstante definiert in der Form: Const Name = Wert [ As Datentyp ]

VBA und Office stellen eine große Anzahl von Konstanten zur Verfügung, dabei weisen die ersten beiden Buchstaben auf die Anwendung hin. Nachfolgend einige wichtige Konstante: x x x x x

24

|

vb – VBA-Kontante (vbYes…) wd – Word-Konstante (wdAlign…) xl – Excel-Konstante (xlFixed…) ac – Access-Konstante (acCmd…) ms – Office-Konstante (msBar…).

Einführung in VBA

Variable werden mit der Anweisung Dim (für Dimension) deklariert und dimensioniert. Dim Name [ As Datentyp ]

Nachfolgend sind die wichtigsten Datentypen aufgelistet. Tabelle 1-1. Die wichtigsten Datentypen in VBA Typ

Kürzel

Byte

Bezeichnung

Datenbereich

Byte

0 bis 255

Integer

%

Ganze Zahlen

-32.768 bis 32.767

Long

&

Ganze Zahlen

-2.147.483.648 bis 2.147.483.647

Single

!

Fließkommazahlen

-3.4E38 - 3.5E38 (7 Ziffern)

Double

#

Fließkommazahlen

-1.8E308 - 1.8E308 (15 Ziffern)

Currency

@

Fließkommazahlen

-9.22E14 - 9.22E14 (15V 4N)

String

$

Zeichenketten

0 - 65535 Zeichen

Date

Datum und Zeit

01.Jan.100 - 31.Dez.9999

Boolean

Logische Werte

True (Wahr) oder False (Falsch)

Variant

Beliebige Daten

Object

4 Byte für Adresse (Referenz)

Um den Datentyp einer Variablen eindeutig zu kennzeichnen, kann dem Namen der Variablen ein datentypspezifisches Kürzel angefügt werden. So ist z. B. die Variable Zahl% vom Typ Integer oder die Variable Text$ vom Typ String. Allerdings rate ich von deren Verwendung ab. Die meisten Programmierer verwenden für Namen von Variablen ein Präfix (ungarische Notation), ähnlich dem der Systemkonstanten. x x x x x x x

bol – Boolean (Beispiel: bolSichern) dtm – Datum oder Zeit (dtmStartZeitraum) err – Fehlercode (errDateifehler) int – Integer (intZähler) ftp – Fließkomma (ftpErgebnis) obj – Objektverweis (objDokument) str – String/Text (strNachname)

Ich benutze immer nur einen kleinen Buchstaben vor dem eigentlichen Namen. So unterscheide ich zwischen Datenvariable (1 Buchstabe), Systemvariable (2 Buchstaben) und Objektvariable (3 Buchstaben). Datenlisten (eine Dimension, auch Vektoren genannt) oder Datenfelder (mehrere Dimensionen, auch Arrays oder Matrizen genannt) definieren sich: Dim Name (Dimension 1[, Dimension 2[, …]]) As Datentyp

Oft werden die Dimensionen auch als Index bezeichnet und man spricht von einer indizierten Variablen. Die Indizes beginnen standardmäßig bei null. Ist ein Beginn bei eins gewünscht, so erlaubt die Anweisung

1.3 Die Syntax von VBA

|

25

Option Base {0 | 1}

am Anfang eines Codecontainers direkt unter Option Explicit eine Festlegung. Die oberen Werte der Indizes lassen sich während des Programmablaufs neu dimensionieren durch die Anweisung: Redim [Preserv] Name (Dimension 1[, Dimension 2[, …]])

Die Anweisung Preserv rettet, soweit möglich, vorhandene Daten, während die Anweisung Erase eine Neuinitialisierung des Arrays vornimmt. Erase Arrayname

1.3.4 Parameterlisten Parameter dienen zur Übergabe von Daten zwischen Prozeduren. Der Datentyp eines Parameters wird entweder durch Typkennzeichen oder durch die Anweisung As bestimmt. Die Syntax ist nachfolgend dargestellt. [Optional] [ByVal | ByRef] Variable[( )] [As Typ] [= StandardWert]

Auch eine gemischte Form ist möglich. Sub Parameterbeispiel Dim RefWert As Byte Dim ValWert As Byte RefWert=4: ValWert=8 MsgBox "RefWert vor dem Aufruf : " & RefWert MsgBox "ValWert vor dem Aufruf : " & ValWert Aufruf (RefWert, ValWert) MsgBox "RefWert nach dem Aufruf : " & RefWert MsgBox "ValWert nach dem Aufruf : " & ValWert End Sub Sub Aufruf (ByRef X As Byte, ByVal Y As Byte) X = X + 2 Y = Y + 2 End Sub

Bei der Übergabe gibt es zwei Formen, by Value und by Reference. Jede Variable besitzt eine Adresse im Hauptspeicher. Mit by Reference, der Standardübergabe, wird diese Adresse übergeben und mit by Value nur der Wert. So lässt sich verhindern, dass alte Werte überschrieben werden. Sehr anschaulich ist das vorstehende Parameterbeispiel mit Aufruf. Zum besseren Verständnis nachfolgend der zeitliche Ablauf: Ablauf

RefWert (in Beispiel)

ValWert (in Beispiel)

1. Initialisierung

4

8

2. Aufruf

4

8

3. Addition von 2

6

10

4. Beispiel

6

8

Die Variablenwerte in der Prozedur Parameterbeispiel sind: Vor dem Aufruf: RefWert = 4, ValWert = 8 Nach dem Aufruf: RefWert = 6, ValWert = 8.

26

|

Einführung in VBA

ValWert (in Aufruf)

Optional Laut Syntax können Parameter ganz oder teilweise mit dem Argument Optional belegt werden. Damit wird bestimmt, dass dieser Parameter zur Ausführung der Prozedur nicht unbedingt erforderlich ist. Ist jedoch ein Parameter in der Liste als optional gekennzeichnet, müssen auch alle nachfolgenden Parameter optional deklariert werden. Optionale Parameter stehen also immer am Ende einer Parameterliste. In dem nachfolgenden Beispiel wird das Volumen eines Würfels (alle Seiten gleich), eines Quaders (Quadrat x Höhe) und eines Blocks (alle Seiten ungleich) nach der Anzahl Parameter berechnet. Zu beachten ist, dass die Auswertungsfunktion IsMissing nicht bei einfachen Variablen wie Integer und Double funktioniert. Daher der Trick mit dem Datentyp Variant in der Parameterliste der Funktion. Sub Beispiel() Dim sText As String sText = "Würfel mit (a=5,5) = " & Str(Vol(5.5)) & vbCrLf sText = sText & "Quader mit (a=6,7, b=7,2) = " & _ Str(Vol(6.7, 7.2)) & vbCrLf sText = sText & "Block mit (a=4,8, b=6,2, c=5,3) = " & _ Str(Vol(4.8, 6.2, 5.3)) MsgBox sText End Sub Function Vol(a As Variant, Optional b As Variant, _ Optional c As Variant) As Double If IsMissing(b) Then Vol = a * a * a ElseIf IsMissing(c) Then Vol = a * a * b Else Vol = a * b * c End If End Function

1.3.5 Benutzerdefinierte Aufzähl-Variablen Aufzähl-Variablen, auch als Enumerationen bezeichnet, werden als Enum-Typ deklariert. Sie können nur im Deklarationsteil und nicht in einer Prozedur definiert werden. Die Elemente des Typs werden mit konstanten Werten initialisiert und können zur Laufzeit nicht verändert werden. Numerische Werte können sowohl positiv als auch negativ sein, wie im nachfolgenden Beispiel. Enum Bauteilform unbekannt = -1 Rechteckquader = 0 Dreieckquader = 1 Zylinder = 2 Kugel = 3 End Enum

Die Aufzähl-Variablen werden wie normale Konstante genutzt. Sie haben ihre Gültigkeit nur auf Modulebene.

1.3.6 Benutzerdefinierte Datentypen Benutzerdefinierte Datentypen sind ein leistungsfähiges Hilfsmittel zur Definition und Nutzung komplexer Datengruppen. Die Definition eines eigenen Datentyps gehört immer in

1.3 Die Syntax von VBA

|

27

den Deklarationsteil eines Moduls, also am Anfang noch vor den Prozeduren und Funktionen, denn nur dort lässt VBA eine Definition zu. Als Beispiel wird folgender benutzerdefinierter Typ mit dem Namen Material definiert: Type Material Name As String EMod As Double QKon As Double ZugF As Double DruF As Double BieF As Double End Type

'Materialname 'E-Modul 'Querkontraktion 'Zugfestigkeit 'Druckfestigkeit 'Biegefestigkeit

Damit lässt sich eine Variable des Typs Material deklarieren in der Form Dim Träger As Material

Angesprochen wird eine Variable unter ihrem vollen Namen, ganz im Sinne der Objektschreibweise, z. B.: With Träger .Name = "ST 37-2" .EMod = 210000 .QKon = 0.92 .ZugF = 350.6 .DruF = 180 .BieF = 176 End With

Benutzerdefinierte Datentypen können nach ihrer Definition wiederum in nachfolgende Definitionen von benutzerdefinierten Datentypen eingebunden werden. Type Bauteil Material As Material Name As String End Type

So leistungsfähig benutzerdefinierte Typen einerseits sind, so viel Kopfzerbrechen können sie dem Programmierer andererseits bereiten. Es gilt immer zu bedenken, dass der komplette Datentyp seine Anwendung findet.

1.3.7 Operatoren und Standardfunktionen Nachfolgend sind nur die wichtigsten Operatoren und Funktionen aufgeführt. Tabelle 1-2. Operatoren und Standardfunktionen in VBA Operatorart

Zeichen

Numerische Operatoren =

28

|

Einführung in VBA

Bezeichnung Wertzuweisung

+

Addition

-

Subtraktion

*

Multiplikation

/

Division

^

Potenzieren

\

ganzzahlige Division

Operatorart

Zeichen

Bezeichnung

Mod

Modulo (Restwert nach Division)

Alphanumerische Operatoren

&

Verkettung alphanumerischer Variabler

+

Wie &, sollte aber nicht verwendet werden

Vergleichsoperatoren

=

gleich

>

größer als


=

größer gleich

alphanumerisch

Trim

löscht führende und endende Leerzeichen

Date

aktuelles Systemdatum

Now

aktuelles Datum und aktuelle Zeit

Month

aktueller Monat als Zahl (1-12)

Logische Operatoren (Funktionen)

Alphanumerische Funktionen

Datumsfunktionen

Numerische Funktionen: Val

Logische Funktionen (true/false)

Umformung alphanumerisch -> numerisch

Int

Ganzzahl

Exp

Exponent

IsNumeric prüft auf Zahl IsArray

prüft auf Datenfeld

IsEmpty

Variable initialisiert?

1.3 Die Syntax von VBA

|

29

Operatorart

Zeichen

Bezeichnung

IsObject

Objekt-Variable?

IsDate

prüft auf Datum

IsNull

prüft auf keine gültigen Daten (null)

Is Nothing prüft Existenz einer Objekt-Variablen Dialog Funktionen

InputBox

Eingabe mit Kommentar

MsgBox

Ausgabe mit Aktionen

Wer sich ausführlicher informieren will, findet in der Literatur neben weiteren Definitionen auch anschauliche Beispiele. Eine weitere Quelle für Informationen ist die Hilfe in der IDE. In der Menüzeile ist sie mit einem Fragezeichen installiert und ein Mausklick öffnet ein Dialogfenster. Durch Eingabe eines Stichwortes liefert eine Suche alle verwandten Themen. Auch hier findet man neben Definitionen anschauliche Beispiele.

1.3.8 Strukturen für Prozedurabläufe Bedingte Verzweigungen Bedingte Verzweigungen bieten die Ausführung unterschiedlicher Anweisungsblöcke in Abhängigkeit von Bedingungen an. 'Version 1 If Bedingung Then Anweisungsblock 1 Else Anweisungsblock 2 End If 'Version 2 If Bedingung1 Then Anweisungsblock 1 ElseIf Bedingung2 Then Anweisungsblock 2 Else Anweisungsblock 3 End If

Bedingte Auswahl Die Bedingte Auswahl wird auch oft als Softwareschalter bezeichnet, da je nach Inhalt des Selectors Anweisungsblöcke ausgeführt werden. Trifft kein Auswahlwert zu, wird der Anweisungsblock unter Case Else ausgeführt. Select Case Selector Case Auswahlwert 1 Anweisungsblock 1 Case Auswahlwert 2 Anweisungsblock 2 ... Case Else Anweisungsblock x End Select

30

|

Einführung in VBA

Softwareschalter Die Funktion Switch ist vergleichbar mit der Select Case-Anweisung. Sie wertet eine Liste von Bedingungen aus und führt die betreffende Anweisung durch. Switch (Bedingung1, Anweisung1[, Bedingung2, Anweisung2 …])

Zählschleife Ein Zähler wird ausgehend von einem Startwert bei jedem Next um den Wert 1 oder wenn Step angegeben ist, um die Schrittweite erhöht, bis der Endwert überschritten wird. Der Anweisungsblock wird für jeden Zählerzustand einmal durchgeführt. For Zähler = Startwert To Endwert [Step Schrittweite] Anweisungsblock Next [Zähler]

Bedingte Schleifen In bedingten Schleifen werden Anweisungsblöcke in Abhängigkeit von einer Bedingung mehrfach ausgeführt. Es werden verschiedene Arten unterschieden. Die Auslegung einer Bedingung wird durch die folgenden Begriffe gesteuert: While: Schleife wird so lange durchlaufen, wie die Bedingung richtig (true) ist. Until: Schleife wird so lange durchlaufen, wie die Bedingung falsch (false) ist. Abweisend bedingte Schleife Der Anweisungsblock wird möglicherweise erst nach Prüfung der Bedingung ausgeführt. Do While/Until Bedingung Anweisungsblock Loop

Ausführend bedingte Schleife Der Anweisungsblock wird bereits ausgeführt, bevor die erste Prüfung der Bedingung erfolgt. Do Anweisungsblock Loop While/Until Bedingung

Schleifen über Datenlisten und Objektlisten Mit dieser Anweisung werden alle Elemente einer Liste angesprochen. For Each Variable in Objektliste Anweisungsblock Next Variable

Schleifenabbruch Eine Schleife kann jederzeit mit der Anweisung Exit beendet werden For … Exit For Next Do …

1.3 Die Syntax von VBA

|

31

Exit Do Loop

1.3.9 Geltungsbereiche Durch die Anweisung Public wird der Geltungsbereich von Konstanten, Variablen, Funktionen und Prozeduren auf alle Module des Projekts ausgeweitet. 'Beispiel: Setzen Sie den Cursor in die Prozedur Test1 ' und rufen Sie Ausführen/UserForm auf Public Textname Sub Test1() Dim Textname As String Textname = "TEST" MsgBox Textname, vbOKOnly, "TEST1" Call Test2 End Sub Sub Test2() Dim Textname As String MsgBox Textname, vbOKOnly, "TEST2" End Sub

Durch die Anweisung Private wird der Geltungsbereich von Konstanten, Variablen, Funktionen und Prozeduren grundsätzlich auf ein Modul beschränkt. Die Anweisung Static und das Schlüsselwort Static wirken sich unterschiedlich auf die Lebensdauer von Variablen aus. Mit dem Schlüsselwort Static für Prozeduren, wird der Speicherplatz aller lokalen Variablen einmal angelegt und bleibt während der gesamten Laufzeit existent. Mit der Anweisung Static werden Variablen in nichtstatischen Prozeduren als statisch deklariert und behalten ihren Wert während der gesamten Laufzeit. Prozeduren in Klassen (und nur hier) können mit der Eigenschaft Friend versehen werden. Dadurch sind sie auch aus anderen Klassen aufrufbar. Siehe befreundete Klassen.

1.3.10 Fehlerbehandlung in Prozeduren Laufzeitfehler, die bei Ausführung einer Prozedur auftreten, führen zum Abbruch der Verarbeitung. Weil sich diese Fehler normalerweise nicht unter der Kontrolle des Programmierers befinden und auch die angezeigten Fehlertexte oft wenig Aufschluss über den Sachverhalt wiedergeben, geschweige denn Anweisungen zur Fehlerbehandlung, ist es besser, die Möglichkeiten zur Fehlerbehandlung zu nutzen. Dazu gibt es die Fehleranweisung On Error und ein Err-Objekt. Tritt im Anweisungsblock 1 ein Fehler auf, dann wird mit dem On Error GoTo Marke Anweisungsblock 1 Marke: Anweisungsblock 2

Auftreten des Fehlers direkt zur angegebenen Programmmarke (Errorhandler) verzweigt und der Anweisungsblock 2 ausgeführt. Mit der Anweisung Resume [ Next | Marke ]

wird der Programmablauf mit der nächsten Anweisung oder der nächsten Anweisung nach einer Marke fortgeführt. Eine Übersicht der Möglichkeiten zur Fehlerbehandlung zeigt das nachfolgende Flussdiagramm (Bild 1-28).

32

|

Einführung in VBA

Bild 1-28. Fehlerbehandlung in Prozeduren

Die Anweisung GoTo hat schon von älteren Basic-Dialekten einen schlechten Ruf und sollte möglichst vermieden werden. Sie erzeugt sogenannten Spaghetti Code, der kaum nachvollziehbar ist. Daher wurde GoTo im Kapitel 1.3.8 Strukturen für Prozedurabläufe auch bewusst ausgelassen. Außerdem ist ein Programmsprung in der Regel vermeidbar. Lediglich bei Fehlerroutinen hat sich die Variante mit GoTo durchgesetzt und es spricht hier im Grunde auch nichts dagegen. Mit dem Auftreten eines ungewollten Fehlers muss ohnehin vom üblichen Prozedurablauf abgewichen werden. Das Err-Objekt verfügt neben den Eigenschaften Number (Fehlernummer) und Description (Beschreibung) noch über die Methoden Raise und Clear zum Auslösen und Löschen von Laufzeitfehlern: Err[.{Eigenschaft, Methode}]

1.4 Algorithmen und ihre Darstellung 1.4.1 Der Algorithmus Der Begriff Algorithmus ist auf den Perser Abu Ja’ far Mohammed ibn Musa al Khowarizmi zurückzuführen, der um 825 n. Chr. ein Lehrbuch der Mathematik verfasste. Allgemein ist ein Algorithmus eine Methode zur Lösung eines bestimmten Problems. Grafisch als sogenannte Black Box darstellbar (Bild 1-29), die Eingaben (Input) zu Ausgaben (Output) umformt.

Bild 1-29. Black Box

Wenn man sich auch immer noch an einer exakten Definition schwertut, an einen Algorithmus sind sechs Bedingungen geknüpft. 1. 2. 3. 4. 5. 6.

Alle verwendeten Größen müssen bekannt sein Die Umarbeitung geschieht in Arbeitstakten Die Beschreibung des Algorithmus ist vollständig Die Beschreibung des Algorithmus ist endlich Alle angegebenen Operationen sind zulässig Angabe der Sprache für die Regeln.

1.4 Algorithmen und ihre Darstellung

|

33

In diesem Buch verstehen wir unter Algorithmus eine eindeutige Vorschrift zur Lösung eines Problems mit Hilfe eines Programms. Auf dem Weg von der Idee zum Programm gibt es zwei sinnvolle Zwischenstationen. Zunächst eine eindeutige Beschreibung des Problems. Diese wird oft mittels Top-Down-Design erstellt und dann folgt eine grafische Darstellung als Flussdiagramm, Struktogramm oder Aktivitätsdiagramm. Eine besondere Form des Algorithmus soll noch erwähnt werden. Sie wird als Rekursion bezeichnet. Eine Rekursion ist dann gegeben, wenn ein Teil des Algorithmus der Algorithmus selbst ist. So lässt sich z. B. n-Fakultät rekursiv bestimmen aus n-1-Fakultät durch ݊Ǩ ൌ ݊ሺ݊ െ ͳሻǨ

(1.2)

Hier spielt die Endlichkeit des Algorithmus eine sehr wichtige Rolle, denn die rekursiven Aufrufe müssen ja irgendwann enden. Beispiel 1.1 Satz des Heron Die Fläche eines beliebigen ebenen Dreiecks (Bild 1-30) bestimmt sich nach dem Satz des Heron mit der Hilfsgröße halber Umfang s ଵ

• ൌ ሺܽ ൅ ܾ ൅ ܿሻ, ଶ

(1.3)

folgt der Flächeninhalt A  ൌ ඥ•ሺ• െ ƒሻሺ• െ „ሻሺ• െ …ሻ.

(1.4)

Bild 1-30. Beliebiges ebenes Dreieck

Ein Algorithmus zur Bestimmung der Fläche setzt zunächst die Angabe der drei Seiten voraus. Nach Überprüfung der Werte kann mit den angegebenen Formeln der Flächeninhalt berechnet werden. Dieser wird in einem letzten Schritt dann ausgegeben.

1.4.2 Top-Down-Design Zur Verdeutlichung eines Problems und auch zur Suche nach der Lösung bedient man sich auch gerne der Methode des Top-Down-Designs. Dabei wird ein Problem in kleinere Teilprobleme zerlegt, wenn nötig, einige Teilprobleme wieder in kleinere Teilprobleme und so weiter. Letztlich erhält man kleine überschaubare Teilprobleme und die dazugehörigen Lösungen, die dann meist aus einfachen Anweisungen bestehen. Werden diese wieder zu einer Gesamtlösung zusammengesetzt, ist auch das Gesamtproblem gelöst. Jedenfalls in der Theorie. Oft werden auch Teillösungen definiert, die sich in anderen Problemlösungen ebenfalls verwenden lassen. Ein Top-Down-Design wird grafisch aufwendig gestaltet. Ich denke, eine einfache Tabellenstruktur erfüllt den gleichen Zweck.

34

|

Einführung in VBA

Tabelle 1-3. Top-Down-Design zur Flächenberechnung eines Dreiecks nach dem Satz des Heron Problem: Flächenberechnung eines beliebigen Dreiecks Teilproblem 1: Eingabe der Seiten a, b, c

Teilproblem 2: Berechnung des Flächeninhalts

Teilproblem 3: Ausgabe des Inhalts A

Teillösung 1: Eingabe der drei Werte in Zellen eines Blattes

Teilproblem 2.1: Bilden die drei Seiten ein Dreieck?

Teilproblem 2.2: Bestimmung der Hilfsgröße s und des Flächeninhalts A

Teillösung 2.1:

Teillösung 2.2:

Teillösung 3: Ausgabe des Flächeninhalts in eine Zelle des Blattes

a bc b  ac c  ab

s A

abc 2 s ( s  a )( s  b)( s  c )

1.4.3 Datenflussdiagramm Flussdiagrammelemente wurden bereits in Bild 1-28 verwendet. Nachfolgend werden einige grundlegende Flussdiagrammelemente aufgeführt (Bild 1-31). Anfang und Ende eines Flussdiagramms sind durch eine Marke (Label) gekennzeichnet. Aber auch bestimmte Positionen innerhalb des Flussdiagramms können mit einer Marke gekennzeichnet werden. Anweisungen stehen einzeln in einem rechteckigen Block. Pfeile zwischen den Anweisungsblöcken zeigen die Verarbeitungsrichtung an. Ein Parallelogramm kennzeichnet Ein- und Ausgaben. Verzweigungen sind in der Regel an eine Bedingung geknüpft. Ist die Bedingung erfüllt, wird der ja-Anweisungsblock durchlaufen, andernfalls der neinAnweisungsblock. Diese Anweisungsblöcke können auch fehlen. Ich verwende diese Form statt einer Raute, da sie mehr Text aufnimmt. Verschiedene Anweisungszweige werden mit einem kleinen Kreis wieder zusammengeführt. Ein Unterprogramm steht für ein eigenständiges Flussdiagramm. Bild 1-31.Flussdiagrammelemente

In einem Datenflussdiagramm (Data Flow Diagram) wird die Bereitstellung und Verwendung von Daten innerhalb von Prozeduren dargestellt. Es existieren verschiedene Notationen zur Darstellung von Datenflüssen. In UML ist es ein Aktivitätsdiagramm (siehe 1.4.5). Das Datenflussdiagramm ist ein Modellierungsinstrument der Strukturierten Analyse. Eine Sonderform des Datenflussdiagramms zeigt einen stellenorientierten Datenfluss, dabei werden die Elemente in Swimlanes den Stellen zugeordnet. Sie haben den Namen durch ihre Form, die wie Schwimmbahnen aussieht. In Kapitel 1.4.5 Aktivitätsdiagramm wird ein Beispiel dargestellt.  2-12-01-03_Diagramme.xlsx

1.4 Algorithmen und ihre Darstellung

|

35

Die Elemente werden entsprechend ihrer zeitlichen Abarbeitung durch Pfeile aneinandergereiht. Als Beispiel folgt ein Flussdiagramm zur Flächenberechnung eines ebenen Dreiecks nach dem Satz des Heron (Bild 1-32).

Bild 1-32. Flussdiagramm zur Flächenberechnung eines ebenen Dreiecks nach dem Satz des Heron

Ausführliche Symbole und Erstellungsregeln für einen Programmablaufplan (PAP) sind in DIN 66001 und ISO 5807 definiert. Darin wird die Verwendung von Sinnbildern beschrieben, die symbolisch den Ablauf oder die Reihenfolge logischer Operationen wiedergeben, die zur Lösung von Problemen notwendig sind. Ebenfalls werden in der DIN 66001 Symbole für Datenflusspläne definiert.

1.4.4 Struktogramm Weniger grafisch, aber mindestens genauso aussagekräftig ist ein Struktogramm (NassiShneiderman-Diagramm). Bild 1-33 zeigt die grundlegenden Elemente. Anweisungen stehen einzeln in einem rechteckigen Block. Verzweigungen in einem Struktogramm sind in der Regel an eine Bedingung geknüpft. Ist die Bedingung erfüllt, werden die Anweisungen unter ja ausgeführt, andernfalls die Anweisungen unter nein. Abweisend bedingte Schleife. Die Anweisungsblöcke werden erst ausgeführt, wenn die Bedingung erfüllt ist und dann so lange wie die Bedingung erfüllt bleibt. Ausführend bedingte Schleife. Die Anweisungsblöcke werden zuerst ausgeführt. Danach wird die Bedingung geprüft und dann werden die Anweisungsblöcke ebenfalls so lange ausgeführt, wie die Bedingung erfüllt wird. Bild 1-33. Struktogramm-Elemente

36

|

Einführung in VBA

Unterprogramme lassen sich durch formale Beschreibungen definieren, die dann in einer weiteren Stufe detaillierter dargestellt werden (Bild 1-34). In Unterprogrammen werden oft bestimmte Funktionalitäten eines Programms zur besseren Übersichtlichkeit zusammengefasst.

Bild 1-34. Unterprogrammdarstellung im Struktogramm

Die stufige Darstellung kann beliebig oft wiederholt werden. Dadurch verliert sie dann etwas an Übersichtlichkeit. Ein Vorteil der Struktogramme gegenüber den Flussdiagrammen ist die Möglichkeit, in den entsprechenden Elementen mehr Text einzutragen (Bild 1-35).

Bild 1-35. Struktogramm zur Flächenberechnung eines ebenen Dreiecks nach dem Satz des Heron

Ein ähnlicher Abstraktionsgrad wird durch den Pseudocode erreicht, der einfacher zu erstellen und auch einfacher zu verändern ist. Er ähnelt einer höheren Programmiersprache, gemischt mit natürlichen Sprachelementen im Rahmen einer mathematischen Notation. Er ist unabhängig von Technologien und oft kompakter und leichter verständlich als ein Programmcode.

1.4.5 Aktivitätsdiagramm Das Aktivitätsdiagramm (Activity Diagram) gehört zu mehreren Diagrammarten, die unter dem Begriff Unified Modeling Language (UML), zu einer Modellierungssprache für Software zusammengefasst sind. Sie unterteilen sich in zwei Gruppen. Das Aktivitätsdiagramm gehört zu den Verhaltensdiagrammen, während das Klassendiagramm, das in diesem Buch unter Objekte beschrieben ist, zur Gruppe der Strukturdiagramme gehört (Bild 1-36).

Bild 1-36. Verbindung zwischen Klassendiagramm und Aktivität

1.4 Algorithmen und ihre Darstellung

|

37

Das Aktivitätsdiagramm ist eine objektorientierte Adaption des Flussdiagramms. Es beschreibt die Realisierung eines bestimmten Verhaltens durch ein System, indem es dafür den Rahmen und die geltenden Regeln vorgibt. Aktivitätsdiagramme dienen der Modellierung von dynamischen Abläufen und beschreiben Aktivitäten mit nichttrivialem Charakter und den Fluss durch die Aktivitäten. Es kann sowohl ein Kontrollfluss als auch ein Datenfluss modelliert werden (Bild 1-37). Der Startknoten zeigt einen Eintrittspunkt in ein System. Ein System kann mehrere Eintrittspunkte besitzen. Der Endknoten ist das Gegenstück zum Startknoten. Er definiert den Austrittspunkt aus dem System. Ein System kann mehrere Austrittspunkte besitzen. Ein Ablaufende terminiert einen Pfad einer Aktivität, die Aktivität selbst läuft weiter. Eine Aktion ist eine Teilaktivität, die sich im Sinne des Aktivitätsdiagramms nicht weiter unterteilen lässt. Eine Aktion verbraucht Zeit und ändert das System. Eine Kante beschreibt den Fluss zwischen verbundenen Elementen. In eckigen Klammern kann eine Bedingung angegeben werden, die erfüllt sein muss, damit die Kante überquert wird. Eine Splittung teilt den aktuellen Pfad in parallel ablaufende Pfade. Eine Synchronisation führt parallellaufende Pfade wieder zusammen. An einer Verzweigung wird aufgrund von Regeln entschieden, welche weiteren Pfade getrennt ausgeführt werden. Eine Zusammenführung vereint zuvor getrennte Pfade wieder zu einem gemeinsamen Pfad. Objektknoten repräsentieren an einer Aktion beteiligte Objekte, wie z. B. Daten. Bild 1-37. Die wichtigsten Aktivitätsdiagramm-Elemente

Die Elemente eines Aktivitätsdiagramms können in ihrer Kombination mehr als es die Elemente von Flussdiagramm und Struktogramm können. So sind durch Verzweigungen des Kontrollflusses gleichzeitig parallellaufende Aktionen möglich. Außerdem können im Aktivitätsdiagramm zusätzlich Verantwortlichkeiten dargestellt werden. Da Aktivitäten die Darstellung von Aktionen und deren zeitliche Verknüpfung zeigen, können sie auch zur Modellierung von interner Logik komplexer Operationen verwendet werden und damit auch Algorithmen visualisieren. Letztlich lassen sich in Aktivitätsdiagrammen auch Ereignisse behandeln (Bild 1-38).

Bild 1-38. Schema einer Aktivität

38

|

Einführung in VBA

Eine Aktivität besteht aus Knoten (Aktionen, Kontrollknoten und Objektknoten) und Kanten (Pfeile), die den Kontrollfluss durch die Aktivität darstellen. In der linken oberen Ecke steht der Name der Aktivität. Darunter befinden sich die Parameter mit ihren Typangaben. Aktivitäten können komplexe Abläufe darstellen, die oft auch durch unterschiedliche Modellelemente ausgeführt werden. Um die Zuordnung zwischen Aktionen und den verantwortlichen Elementen darzustellen, werden Aktivitätsdiagramme in Partitionen unterteilt (Bild 1-39).

Bild 1-39. Aufteilung von Aktivitäten nach Verantwortlichen

Die Partitionen erinner an die Form von Schwimmbahnen und werden daher auch oft mit dem englischen Wort Swimlanes bezeichnet. Sie lassen sich senkrecht, aber auch waagerecht anordnen. Die Semantik der Modellierung von Aktivitäten ist dem Konzept der Petri-Netze stark angelehnt. So wird daraus das Prinzip der Marken (engl. Token) übernommen, deren Gesamtheit den Zustand einer Aktivität beschreibt. Um verfolgen zu können, welche Aktionen ausgeführt werden, sind die Pfade mit Token belegt (Bild 1-40).

Bild 1-40. Prinzip des Token-Modells

Token haben in UML kein Symbol (hier als graues Quadrat dargestellt). Sie sind virtuelle Elemente, die den Kontrollfluss markieren. Token fließen entlang der Kanten vom Vorgängerzum Nachfolgerknoten. Es werden Kontroll- und Datentoken unterschieden. Kontrolltoken liefern die Ausführungserlaubnis für den Nachfolgeknoten. Datentoken begleiten den Transport von Datenwerten oder Referenzen auf Objekte. Überwachungsbedingungen können die Weitergabe von Token verhindern. Aktionen lassen sich in weiteren Aktivitätsdiagrammen verfeinern (Bild 1-41).

Bild 1-41. Verfeinern von Aktionen im Aktivitätsdiagramm

1.4 Algorithmen und ihre Darstellung

|

39

Die zu verfeinernde Aktion wird mit einem Gabelungssymbol (unten rechts) gekennzeichnet. So lassen sich modulare Hierarchien in Aktivitätsdiagrammen verwirklichen. Aktivitätsdiagramme sind sehr vielfältig einsetzbar. Es können auch Beziehungen zwischen Aktivitätsdiagrammen und anderen Diagrammen der UML bestehen. Als Anwendungsbeispiel folgt die Darstellung der Flächenberechnung nach dem Satz des Heron (Bild 1-42).

Bild 1-42. Aktivitätsdiagramm zur Flächenberechnung

1.5 Objekte der Excel-Bibliothek Excel besteht aus sehr vielen Objekten. Nach der Hierarchie unterscheidet man in Excel das x x x x x

Application-Objekt – die gesamte Excel-Anwendung Workbook-Objekt – eine Arbeitsmappe Worksheet-Objekt – ein Arbeitsblatt Range-Objekt – ein Zellenbereich (eine Zelle oder mehreren Zellen) Cell-Objekt – eine Zelle.

Für die Programmierung ist es wichtig die Objekthierarchie (Bild 1-43) zu kennen. Nur so lässt sich gezielt auf ein Objekt zugreifen.

Bild 1-43. Objekt-Hierarchie in Excel

40

|

Einführung in VBA

1.5.1 Application-Objekt Das Application-Objekt ist das oberste Objekt der Hierarchie. Viele Eigenschaften und Methoden des Application-Objekts sind global, sodass Application nicht mit angegeben werden muss. Tabelle 1-4. Die wichtigsten Eigenschaften des Application-Objekts Eigenschaft

Beschreibung

ActiveCell

aktuelles Range-Objekt

ActivePrinter

aktuelles Printer-Objekt

ActiveSheet

aktuelles Sheet-Objekt

ActiveWindow

aktuelles Windows-Objekt

ActiveWorkbook

aktuelles Workbook-Objekt

Cells

Range-Objekt, alle Zellen des aktiven Arbeitsblattes

Dialogs

Dialogs-Auflistung alle Dialogfelder (Datei-öffnen, -speichern, …)

Name

Name der Anwendung

Names

Namen-Auflistung, Namen der aktiven Arbeitsmappen

Parent

übergeordnetes Objekt

Path

vollständiger Pfad der Anwendung

Range

Range-Objekt, Zelle oder Zellbereich des aktiven Arbeitsblattes

Sheets

Sheets-Auflistung, alle Blätter (auch Diagramme) der Arbeitsmappe

Windows

Windows-Auflistung aller Fenster

Workbooks

Workbooks-Auflistung der geöffneten Arbeitsmappen

Worksheets

Worksheets-Auflistung aller Blätter der aktiven Arbeitsmappe

Tabelle 1-5. Die wichtigsten Methoden des Application-Objekts Methode

Beschreibung

Calculate

berechnet alle Arbeitsblätter neu

CalculateFull

erzwingt eine vollständige Berechnung der Daten in allen geöffneten Arbeitsmappen

Viele Eigenschaften und Methoden, die gängige Objekte der Benutzeroberfläche zurückgeben (wie z. B. die aktive Zelle, eine ActiveCell-Eigenschaft), können ohne den Objektkennzeichner Application verwendet werden. Anstelle von Application.ActiveCell.Font.Bold = False

kann auch folgendes eingegeben werden: ActiveCell.Font.Bold = False.

1.5 Objekte der Excel-Bibliothek

|

41

1.5.2 Windows-Objekte Das Window-Objekt ist ein Fenster des Application-Objekts und ein Element der WindowsObjektliste. Tabelle 1-6. Wichtige Eigenschaften des Window-Objekts Eigenschaft

Beschreibung

ActivePane

Aktionsbereich des Fensters

Application

Zugehöriges Application-Objekt

Caption

Text in der Titelleiste

Height

Höhe des Projektfensters

Index

Index in der Windows-Objektliste

Left

Abstand des Fensters vom linken Rand

Parent

Übergeordnetes Objekt

Top

Abstand des Fensters von oben

Visible

Fenster sichtbar (True/False)

Width

Breite des Fensters

WindowState

Status des Fensters (maximiert, minimiert, normal)

Tabelle 1-7. Wichtige Methoden des Window-Objekts Methode

Beschreibung

Activate

Aktiviert das Fenster und bringt es in den Vordergrund

Close

Schließt einen Bereich oder Fenster

NewWindow

Erstellt ein neues Fenster

PrintOut

Druckt das aktive Arbeitsblatt

Mit der folgenden Prozedur werden alle geöffneten Fenster mit ihren Namen und ihrem WindowState-Wert angegeben.  2-12-01-04_Windows.xlsm Codeliste 1-4. Die Prozedur nennt alle geöffneten Fenster Sub ReadWindows() Dim objWin As Window Dim sText As String sText = "" & vbCr For Each objWin In ThisWorkbook.Windows sText = sText & objWin.Caption & " / " & _ objWin.WindowState & vbCr Next MsgBox sText End Sub

Mit der folgenden Prozedur wird das erste Window-Objekt der Windows-Objektliste maximiert.

42

|

Einführung in VBA

Codeliste 1-5. Die Prozedur ändert die Darstellung des angegebenen Fensters Sub SetWindowState() Windows(1).WindowState = xlMaximized End Sub

Mit der folgenden Prozedur wird die Sichtbarkeit des 1. Fensters aus- und wieder eingeschaltet. Codeliste 1-6. Die Prozedur schaltet die Sichtbarkeit des Fensters aus und ein Sub ToggleVisibleWindow() Windows(1).Visible = False Stop Windows(1).Visible = True End Sub

Die Prozedur ChangeWindowCaption erlaubt die Veränderung der Eigenschaft Caption (Text in der Kopfzeile) über einen Dialog mit dem Anwender. Dabei bleibt der Dateiname unverändert. Codeliste 1-7. Die Prozedur ändert den Kopftext des aktiven Fensters Sub ChangeWindowCaption() Dim sText As String sText = InputBox("Eingabe eines neuen Fenstertextes" & _ vbCrLf & "für das aktuelle Projekt-Fenster." & vbCrLf & _ "Nur OK oder Abbrechen " & vbCrLf & _ "lässt den alten Text bestehen") If sText = Empty Then Exit Sub Else ActiveWindow.Caption = sText End If End Sub

Ist das aktive Arbeitsblatt in der Darstellung geteilt, dann aktiviert die Prozedur PaneActivate die einzelnen Fensterbereiche. Codeliste 1-8. Die Prozedur ändert den Kopftext des aktiven Fensters Sub PaneActivate() Dim i If Not ActiveWindow.FreezePanes Then With ActiveWindow i = .ActivePane.Index If i = .Panes.Count Then .Panes(1).Activate Else .Panes(i + 1).Activate End If End With End If End Sub

1.5.3 Workbook-Objekte Das Workbook-Objekt dient dazu, auf ein einzelnes Dokument zuzugreifen. Es ist die Arbeitsmappe, die auch als Datei gespeichert wird.

1.5 Objekte der Excel-Bibliothek

|

43

Soll ein Workbook-Objekt aus der Liste der Workbooks ausgewählt werden, so geschieht dies durch Angabe eines Index als fortlaufende Nummer aller vorhandenen Workbooks, der aber kaum bekannt ist, oder durch Angabe des Workbook-Namens in der Form: Workbooks.Item(1) Workbooks.Item("Mappe1.xls")

Später wird noch gezeigt, wie man ein solch selektiertes Workbook einer Objektvariablen zuordnen kann. Tabelle 1-8. Die wichtigsten Eigenschaften des Workbook-Objekts Eigenschaft

Beschreibung

ActiveSheet

aktuelles (aktives) Blatt

FullName

Vollständiger Pfad einschließlich Dateinamen

Name

Dateiname der Arbeitsmappe

Names

Namen-Auflistung aller Namen der Arbeitsmappe

Parent

übergeordnetes Objekt (Application-Objekt)

Path

vollständiger Pfad der Arbeitsmappe

Saved

True, wenn Arbeitsmappe seit dem letzten Speichern nicht geändert

Sheets

Sheets-Auflistung, alle Blätter der Arbeitsmappe

WorkSheets

Sheets-Auflistung, alle Blätter der Arbeitsmappe

Tabelle 1-9. Die wichtigsten Methoden des Workbook-Objekts Methode

Beschreibung

Activate

aktiviert eine einzelne Arbeitsmappe

Close

schließt eine einzelne Arbeitsmappe

PrintOut

druckt eine Arbeitsmappe

Save

speichert die Änderungen der Arbeitsmappe

SaveAs

speichert mit Angabe von Namen, Dateiformat, Kennwort, Zugriffscode

SaveCopyAs

speichert eine Kopie der Datei, ohne die Original-Datei zu ändern

1.5.4 Worksheet-Objekte Worksheet-Objekte sind die einzelnen Arbeitsblätter einer Excel-Anwendung. Häufig auch als Tabellen bezeichnet, gehört zu jedem Worksheet auch ein Registername, nicht zu verwechseln mit dem Objektnamen. Eine neue Arbeitsmappe besitzt im Projekt-Explorer ein Objekt Tabelle1 (Tabelle1), mit Worksheet-Namen (Register-Namen). Im Kontextmenü eines Registers, kann das Arbeitsblatt eine andere Bezeichnung erhalten. Tabelle 1-10. Die wichtigsten Eigenschaften des Worksheet-Objekts Eigenschaft

Beschreibung

Application

Application-Objekt

44

|

Einführung in VBA

Cells

Range-Objekt (Zellenbereich innerhalb des Blattes)

Columns

Range-Objekt, das alle Spalten im angegebenen Arbeitsblatt repräsentiert

Name

Name des Arbeitsblattes

Names

Namen-Auflistung aller arbeitsblattspezifischen Namen

Parent

übergeordnetes Objekt (Workbook-Objekt)

Range

Range-Objekt (Zellenbereich innerhalb des Arbeitsblatts)

Rows

Range-Objekt, alle Zeilen im angegebenen Arbeitsblatt

UsedRange

Range-Objekt, der verwendete Bereich (benutzte Zellen)

Tabelle 1-11. Die wichtigsten Methoden des Worksheet-Objekts Methode

Beschreibung

Activate

aktiviert eine einzelne Arbeitsmappe

Calculate

berechnet ein Arbeitsblatt neu

Select

markiert ein einzelnes Arbeitsblatt

PrintOut

druckt das aktuelle Arbeitsblatt

Delete

löscht das Arbeitsblatt aus der Arbeitsmappe

Um ein neues Arbeitsblatt zur Auflistung der vorhandenen hinzuzufügen, kann die AddMethode verwendet werden. Im folgenden Beispiel werden in der aktiven Arbeitsmappe zwei neue Arbeitsblätter hinter dem zweiten Arbeitsblatt eingefügt. Worksheets.Add count:=2, after:=Worksheets(2)

Mit der Objektangabe Worksheets(Index), wobei Index der Name oder die Indexnummer des Blattes ist, wird ein einzelnes Worksheet-Objekt ausgewählt. Im folgenden Beispiel wird das Worksheet Tabelle1 aktiviert. Worksheets("Tabelle1").Activate

Im Gegensatz zu Worksheets, die eine Objektliste aller Arbeitsblätter darstellt, gibt es in der Objekthierarchie unter Excel noch die Objektliste Sheets, die außer allen Worksheets auch alle Diagrammblätter enthält. Die Eigenschaften und Methoden von Sheets sind andere und werden im Objektkatalog beschrieben.

1.5.5 Range-Objekte Range-Objekte beziehen sich auf eine Zelle oder einen Zellbereich. Da VBA nicht über ein Cell-Objekt verfügt, wird dieses Objekt oft verwendet. Tabelle 1-12. Die wichtigsten Eigenschaften des Range-Objekts Eigenschaft

Beschreibung

Address

Bezug eines Zellenbereichs

Application

Application-Objekt

Cells

Range("A1").Value = 12, stellt den Inhalt der Zelle "A1" auf 12 ein,

1.5 Objekte der Excel-Bibliothek

|

45

Cells(1, 2).Value = 24, stellt den Inhalt der Zelle "B1" auf 24 ein Column

Spalte (am Anfang des angegebenen Bereichs)

Count

Anzahl an Zellen im Range-Objekt

Font

Font-Objekt, das die Schriftart des Range-Objekts darstellt

Formula

Formel des Range-Objekts

Parent

übergeordnetes Objekt (Worksheet-Objekt)

Row

Zeile (am Anfang des angegebenen Bereichs)

Tabelle 1-13. Die wichtigsten Methoden des Range-Objekts Methode

Beschreibung

Activate

aktiviert eine einzelne Zelle

Calculate

berechnet einen Zellenbereich neu

Select

markiert eine Zelle oder einen Zellbereich

1.5.6 Zeilen und Spalten Zeilen und Spalten, unter VBA als Rows und Columns bezeichnet, werden mit der SelectMethode markiert. Beispiele: Sub Zeile_markieren() Rows(3).Select 'markiert dritte Zeile End Sub Sub Spalte_markieren() Columns(2).Select 'markiert zweite Spalte End Sub

1.5.7 Zellen und Zellbereiche VBA kennt kein Objekt für die einzelne Zelle. Einzelne Zellen zählen als Sonderfall des Range-Objekts. Für die Adressierung von Zellen oder Zellbereichen wird die Range-Methode oder die Cells–Eigenschaft verwendet. Direkte Adressierung mit der Range-Methode Das Argument Cell ist eine durch Hochkommata eingeschlossene Bezeichnung für eine einzelne Zelladresse, im Excel–Standardform (A1, B2, C4 usw.), einen einzelnen Zellbereich, der die linke obere Zelladresse und die rechte untere Zelladresse durch einen Doppelpunkt getrennt angibt (B3:D8 usw.), oder eine durch Kommata getrennte Liste mehrerer Zellenbereiche von Adressen (A1:C5, D5:F8 usw.). Object.Range(Cell) Object.Range(Cell1, Cell2)

Beispiele Worksheets("Tabelle1").Range("A1") Worksheets("Tabelle1").Range("A4:B7") Worksheets("Tabelle1").Range("B3:D6, D10:F12") Worksheets("Tabelle1").Range("A1, B2, C3, D4:D5")

46

|

Einführung in VBA

Indirekte Adressierung mit der Cells-Eigenschaft Im Gegensatz zur Adressierung über die Range-Methode bietet diese Alternative die Möglichkeit, Zeilen- und Spaltenindizes zu verwenden. Dies ist insbesondere für berechnete Zelladressen oder die Benutzung von Variablen für Zelladressen ein großer Vorteil. Auch hier sind mehrere Syntaxvarianten möglich: Object.Cells(RowIndex, ColumnIndex) Object.Cells(Index) Object.Cells

Beispiel: Sub Demo() Dim iZeile As Integer For iZeile = 1 To 5 Worksheets(1).Cells(iZeile + 1, iZeile).Value = iZeile Next End Sub

Wertzuweisungen Die Wertzuweisung an Zellen wird mit Hilfe der Value-Eigenschaft realisiert. Diese Eigenschaft ist für ein Range–Objekt ein Default-Wert, d. h. die Angabe Value zum RangeObjekt kann entfallen. Beispiele: ActiveCell.Value = 100: ActiveCell = 100 Range("A1").Value = "Test": Range("A1")="Test" Range("B1:C1").Value = 25: Range("B1:C1") = 25

Notizzuweisungen Zellen können auch Notizen zugeordnet werden. Das ist in der Regel ein erklärender Text, der immer dann erscheint, wenn der Mauszeiger auf der Zelle ruht. Realisiert wird dies über das Comment-Objekt des Range-Objekts mit nachfolgenden Eigenschaften und Methoden. In älteren Excel-Versionen wird eine Notiz als Kommentar bezeichnet. Tabelle 1-14. Die Eigenschaften des Comment-Objekts Eigenschaft

Beschreibung

Visible

Anzeige des Kommentars (true, false)

Tabelle 1-15. Die Methoden des Comment-Objekts Methode

Beschreibung

AddComment

Erzeugt einen Kommentar

Text

Fügt einen Kommentar hinzu oder ersetzt ihn

Delete

löscht einen Kommentar

Previous

holt vorherigen Kommentar zurück

Next

holt nächsten Kommentar zurück

Eingefügte Kommentare sind in der Auflistung Comments zusammengefasst. Über die Eigenschaft Visible werden die Kommentare angezeigt oder ausgeblendet.

1.5 Objekte der Excel-Bibliothek

|

47

Beispiele: 'Zelle A1 erhält einen Kommentar, der anschließend angezeigt wird Worksheets("Tabelle1").Range("A1").AddComment "Testeingabe!" Worksheets("Tabelle1").Range("B2").Comment.Visible = True 'in der nachfolgenden Anweisung wird der neue Text ab der 5. Pos. eingesetzt Range("C3").Comment.Text "Neuer Text!", 5, False Range("C3").Comment.Visible = True

Einfügen von Zellen, Zeilen und Spalten Mit den Eigenschaften EntireRow und EntireColumn, zusammen mit der Methode Insert ist das Einfügen von Zellen, Zeilen und Spalten möglich. Mit Hilfe des Arguments Shift kann bestimmt werden, in welche Richtung zur aktiven Zelle die übrigen Zellen verschoben werden. Die Richtung wird über die Konstanten xlDown, xlUp, xlToRight oder xlToLeft angegeben. Beispiele: ActiveCell.EntireRow.Insert ActiveCell.EntireColumn.Insert

'fügt Zeile ein 'fügt Spalte ein

'fügt Zeile ein, alle übrigen Zellen werden nach rechts verschoben ActiveCell.Insert Shift:=xlToRight

Löschen von Zellinhalten Neben numerischen und alphanumerischen Werten besitzen Zellen auch Formatierungen und Notizen. Für ein Range-Objekt gibt es daher verschiedene Löschanweisungen. Tabelle 1-16. Löschanweisungen für das Range-Objekt Methode

Auswirkung im angegebenen Bereich

Clear

Zellen leeren und Standardformat setzen

ClearContents

löscht nur Inhalte und Formeln

ClearComments

löscht alle Notizen

ClearFormats

löscht alle Formatierungen, die Inhalte bleiben

Delete

löscht Zellen und füllt diese mit dem Inhalt der nachfolgenden Zellen auf

Bereichsnamen für Range-Objekte vergeben Einzelnen Zellen oder Zellbereichen kann über die Eigenschaft Name des Range-Objekts ein Bereichsname zugeordnet werden. Beispiele: Range("A1").Name = "Brutto" Range("B1").Name = "Netto" Range("D1:E5").Name = "MWSt"

Da Bereichsnamen Objekte der Auflistung Names sind, kann für die Zuordnung eines Namens auch die Add-Methode verwendet werden.

48

|

Einführung in VBA

Beispiel: ActiveWorkbook.Names.Add "Test", "=Testeingabe!$A$1"

Der Sinn der Deklaration von Bereichsnamen für Range-Objekte liegt in der übersichtlichen Schreibweise. Beispiel: Range("MWSt")=0.16

Bereichsnamen können mit der Methode Delete gelöscht werden. Range("Tabelle1").Name.Delete

Suchen in Range-Objekten Für das Suchen in Zellbereichen gibt es die Find-Methode für Range-Objekte. Die Methode gibt ein Range-Objekt zurück, sodass dieses ausgewertet werden muss. Beispiele: 'Sucht im angegebenen Bereich nach der Zelle mit dem Inhalt Wert 'und gibt deren Inhalt an die Variable Suche weiter, 'die anschließend ausgegeben wird Suche = Range("B1:M25").Find("Wert").Value MsgBox Suche 'Sucht im angegebenen Bereich nach der Zelle Wert 'und gibt die Adresse an die Variable Adresse, 'die dann eine neue Zuweisung erhält Adresse = Range("B1:M25").Find("Wert").Address Range(Adresse).Value = "Test" 'Anweisung weist der Zelle mit dem gesuchten Inhalt ein Hintergrundmuster zu Range("B1:D5").Find("Wert").Interior.Pattern = 5

Das Suchen über Zellen nach Bedingungen ist am einfachsten durch Schleifen realisierbar. Beispiel: 'Suche nach numerischen Werten, die größer als 13 sind und dann farbliche 'Kennzeichnung des Hintergrundes Sub Suche() For Each Zelle In Range("B1:M25") If IsNumeric(Zelle.Value) Then If Zelle.Value > 13 Then Zelle.Interior.ColorIndex = 5 End If End If Next End Sub

1.5.8 Menüband-Objekte Bei dem Objekt CommandBars handelt es sich um eine Objektliste der Office-Bibliothek. Es sind Elemente des Menübandes und sie befinden sich als Steuerelement-Objekte Controls ebenfalls in einer Objektliste (Bild 1-44).

1.5 Objekte der Excel-Bibliothek

|

49

Bild 1-44. Die Hierarchie der CommandBars-Objekte mit der Eigenschaft Type Tabelle 1-17. Wichtige Eigenschaften des CommandBar-Objekts Eigenschaft

Beschreibung

Controls

CommandBarControls -Objekt, das alle Steuerelemente auf einer Befehlsleiste darstellt

Enable

Boolescher Wert, der angibt, ob der angegebene CommandBar aktiviert ist

Height

Abrufen oder Festlegen der Höhe (in Pixel) eines CommandBar

Width

Abrufen oder Festlegen der Breite (in Pixel) der angegebenen Befehlsleiste

Visible

Anzeige des CommandBar-Objekts (boolescher Wert)

Tabelle 1-18. Wichtige Methode des CommandBar-Objekts

Methode

Beschreibung

Delete

Löscht das CommandBar-Objekt

ShowPopup

Zeigt Befehlsleiste als Kontextmenü an den angegebenen Koordinaten oder an der aktuellen Position

Wie alle Objekte einer Objektliste sind auch sie über die For-Each-Next-Schleife zu erreichen. Die nachfolgende Prozedur ermittelt alle vorhandenen Befehlsleisten-Objekte und deren Steuerelemente.  2-12-01-05_CommandBars.xlsm Codeliste 1-9. Die Prozedur gibt alle vorhandenen Controls im Direktfenster aus Sub ReadCommandBars() Dim objMenuBars As CommandBars Dim objMenuBar As CommandBar Dim objMenu As CommandBarControl Set objMenuBars = Application.CommandBars For Each objMenuBar In objMenuBars Debug.Print "--- BAR: " & objMenuBar.Name For Each objMenu In objMenuBar.Controls Debug.Print "CONTROL: " & objMenu.Caption Next

50

|

Einführung in VBA

Next Set objMenuBars = Nothing End Sub

Ihre Bezeichnungen werden im Direktfenster angezeigt (Bild 1-45).

Bild 1-45. Auszug aus dem Protokoll der gefundenen Controls

Zuerst wird in der Prozedur die Objektliste mit einer Objektvariablen TempMenuBar belegt. Es ist sinnvoll hier auch das Eltern-Objekt Application anzugeben. Dann werden in einer Schleife alle im Menüband vorhandenen CommandBar-Objekte der Objektliste CommandBars gelesen. Zu jedem CommandBar-Objekt werden in einer weiteren Schleife alle vorhandenen CommandBarControl-Objekte aus der Objektliste der CommandBarControls gelesen. Im Direktfenster wird bei den Control-Bezeichnungen das Zeichen &, das als Steuerelement dient und im Menü den Buchstaben hinter dem Zeichen unterstreicht, um so auf seine zusätzliche Funktionalität hinzuweisen. Einträge mit einem unterstrichenen Buchstaben können mit der Tastenkombination ALT + Buchstabe/Ziffer aufgerufen werden, als Alternative zum Mausklick. Die folgende Prozedur bestimmt alle ausgeblendeten Elemente des Menübandes über die Eigenschaft Visible. Codeliste 1-10. Die Prozedur liest alle ausgeblendeten Elemente Sub ReadUnvisibleCommandBars() Dim Bar As CommandBar For Each Bar In Application.CommandBars If Not Bar.Visible Then Debug.Print Bar.Name Next End Sub

Wie alle Objektlisten verfügt auch die der CommandBars über die Add-Methode, sodass eigene Einträge dem Menüband hinzugefügt werden können. Alle eigenen Einträge sollten eine Kennung bei der Instanziierung erhalten, sodass die Controls mit dem Beenden auch wieder entfernt werden können. Dazu erhält eine konstante Variable einen entsprechenden Menütitel. Der Menütitel sollte auf die Verwendung der eigenen Menüeinträge hinweisen, denn er erscheint auch im Menüband in der Eigenschaft Caption des CommandBar-Objekts. Ähnlich wie im Menüband zusammengehörige Funktionen in einer Gruppe zusammengefasst sind, sollten auch die eigenen Einträge als Gruppe zusammengefasst werden. Es passiert oft, dass auch noch andere Einträge hinzukommen und dann alles etwas unübersichtlich wird. Die Prozedur MenuTemplate erzeugt einen Rahmen mit Eintrag und einem Popup-Kontrollelement

1.5 Objekte der Excel-Bibliothek

|

51

als Gruppenelement zur Aufnahme weiterer Controls für Aktionen. Die Prozedur RemoveMenu entfernt den Menüeintrag wieder. Codeliste 1-11. Die Prozedur zeigt eine Grundstruktur für einen Eintrag im Menüband Const sMenuTemp As String = "MenuTemplate" Private Sub CreateMenuTemplate() Dim objMenuBar As CommandBar Dim objMenuGroup As CommandBarControl RemoveMenuTemplate 'Fügt einen Eintrag ins Menüband unter Add-Ins Set objMenuBar = Application.CommandBars.Add _ (sMenuTemp, msoBarTop) objMenuBar.Visible = True 'Erstellt eine Gruppe für Controls Set objMenuGroup = objMenuBar.Controls.Add _ (Type:=msoControlPopup, Temporary:=False) With objMenuGroup .Caption = sMenuTemp .Tag = sMenuTemp .TooltipText = "Aktion wählen ..." End With Set objMenuBar = Nothing Set objMenuGroup = Nothing End Sub Private Sub RemoveMenuTemplate() Dim objMenuBar As CommandBar Dim objMenuControl As CommandBarControl 'Sucht alle Menüelemente mit dem Menütitel 'und entfernt sie aus dem Menüband For Each objMenuBar In Application.CommandBars For Each objMenuControl In objMenuBar.Controls If objMenuControl.Tag = sMenuTemp Then objMenuControl.Delete End If Next If objMenuBar.Name = sMenuTemp Then objMenuBar.Delete End If Next End Sub

Die Gruppe Benutzerdefinierte Symbolleiste wird automatisch im Register Add-Ins eingestellt (Bild 1-46).

Bild 1-46. Neuer Menüeintrag als Popup-Control

52

|

Einführung in VBA

Eine interessante Methode ist ShowPopup, sie zeigt das CommandBar-Objekt in einem Kontextmenü. Codeliste 1-12. Die Prozedur zeigt ein Kontextmenü Const sMenuName As String = "KontextMenü" Private Sub CreateKontextMenu() Dim objBar As CommandBar Dim objCtl As CommandBarControl 'Erstellt ein Kontextmenü On Error GoTo ErrHandler Set objBar = Application.CommandBars.Add _ (Name:=sMenuName, _ Position:=msoBarPopup, _ Temporary:=False) 'Erstellt eine Gruppe für Controls With objBar Set objCtl = .Controls.Add(Type:=msoControlEdit, Temporary:=True) With objCtl .BeginGroup = True .Text = "Eingabe" End With Set objCtl = Nothing Set objCtl = .Controls.Add(Type:=msoControlComboBox, Temporary:=True) With objCtl .BeginGroup = True .Text = "Auswahl" .AddItem "Auswahl 1" .AddItem "Auswahl 2" .AddItem "Auswahl 3" End With Set objCtl = Nothing .ShowPopup End With ErrHandler: objBar.Delete Set objCtl = Nothing Set objBar = Nothing End Sub

Die drei wichtigsten Steuerelemente für ein Anwendungsmenü sind eine Schaltfläche msoControlButton, ein Eingabefeld msoControlEdit und ein Auswahlfeld msoControlComboBox. Die folgenden Prozeduren zeigen die Anwendung dieser Steuerelemente mit einfachen Textausgaben. Codeliste 1-13. Die Prozedur zeigt die verschiedenen Controltypen für einen Eintrag im Menüband Const sMenuExample As String = "MenuExample" 'Ausgabe durch Button-Control Private Sub Meldung() MsgBox sMenuExample & " ausgeführt!" End Sub 'Eingabefeld Private Sub Übergabe() Dim objControl As CommandBarComboBox On Error Resume Next Set objControl = _ Application.CommandBars(sMenuExample).Controls("Eingabe")

1.5 Objekte der Excel-Bibliothek

|

53

MsgBox objControl.Caption & " / " & objControl.Text On Error GoTo 0 Set objControl = Nothing End Sub 'Auswahlfeld Private Sub Auswahl() Dim objControl As CommandBarComboBox On Error Resume Next For Each objControl In _ Application.CommandBars(sMenuExample).Controls If objControl.Caption = "EingabeWahl" Then MsgBox objControl.Caption & " / " & objControl.Text End If Next On Error GoTo 0 Set objControl = Nothing End Sub 'Erzeuge Menü Private Sub CreateMenuExample() Dim objMenuBar As CommandBar Dim objMenuGroup As CommandBarControl Dim objMenuButton As CommandBarControl Dim objMenuBox As CommandBarControl Dim objMenuCombo As CommandBarComboBox RemoveMenuExample 'Menükopf Set objMenuBar = Application.CommandBars.Add _ (sMenuExample, msoBarTop) objMenuBar.Visible = True ‘ControlPopup Set objMenuGroup = objMenuBar.Controls.Add _ (Type:=msoControlPopup, Temporary:=False) With objMenuGroup .Caption = sMenuExample .Tag = sMenuExample .TooltipText = "Aktion wählen ..." End With 'ControlButton Set objMenuButton = objMenuGroup.Controls.Add _ (Type:=msoControlButton, Temporary:=True) With objMenuButton .BeginGroup = False .Caption = "Meldung ausgeben" .FaceId = 59 .OnAction = "Meldung" .Style = msoButtonIconAndCaption .TooltipText = "Schaltfläche betätigen" .Tag = "Aktion" End With 'ControlEdit Set objMenuBox = objMenuBar.Controls.Add _ (Type:=msoControlEdit, Temporary:=True) With objMenuBox .BeginGroup = False .Text = "Eingabe"

54

|

Einführung in VBA

.Caption = "Eingabe" .OnAction = "Übergabe" .TooltipText = "Text eingeben und bestätigen" .Tag = "Eingabe" End With 'ControlComboBox Set objMenuCombo = objMenuBar.Controls.Add _ (Type:=msoControlComboBox, Temporary:=True) With objMenuCombo .BeginGroup = True .Text = "Auswahl" .Caption = "EingabeWahl" .OnAction = "Auswahl" .TooltipText = "Auswahl treffen" .Tag = "Auswahl" .AddItem "Test1" .AddItem "Test2" .AddItem "Test3" End With Set objMenuBar = Set objMenuGroup Set objMenuBar = Set objMenuBox = Set objMenuCombo End Sub

Nothing = Nothing Nothing Nothing = Nothing

Private Sub RemoveMenuExample() Dim objMenuBar As CommandBar Dim objMenuControl As CommandBarControl 'Sucht alle Menüelemente mit dem Menütitel 'und entfernt sie aus dem Menüband For Each objMenuBar In Application.CommandBars For Each objMenuControl In objMenuBar.Controls If objMenuControl.Tag = sMenuExample Then objMenuControl.Delete End If Next If objMenuBar.Name = sMenuExample Then objMenuBar.Delete End If Next End Sub

Übung 1-6. Kreisberechnung im Menüband Die in der Übung 1-3 erstellten Menüeinträge unter Register Makros haben den Nachteil, dass sie konstant in allen Projekt-Anwendungen existieren. Die Kombination von den Ereignisprozeduren Auto_Open und Auto_Close zusammen mit den Controls macht es möglich, dass mit dem Start einer Projekt-Anwendung das zugehörige Menü installiert und mit dem Schließen auch wieder entfernt wird. Codeliste 1-14. Die Prozedur erzeugt einen Menüeintrag zur Kreisberechnung Const sMenuName As String = "Kreisberechnung" Public Sub InitMenu() Dim objMenuBar Dim objMenuGroup

As CommandBar As CommandBarControl

1.5 Objekte der Excel-Bibliothek

|

55

Dim objMenuButton

As CommandBarControl

Call RemoveMenu Set objMenuBar = Application.CommandBars.ActiveMenuBar Set objMenuGroup = objMenuBar.Controls.Add _ (Type:=msoControlPopup, Temporary:=False) With objMenuGroup .Caption = sMenuName .Tag = sMenuName .TooltipText = "Aktion wählen ..." End With Set objMenuButton = objMenuGroup.Controls.Add _ (Type:=msoControlButton, Temporary:=True) With objMenuButton .Caption = "Tabelle1 / Makro Kreis1" .OnAction = "Tabelle2.Kreis1" .Style = msoButtonIconAndCaption .Tag = sMenuName End With Set objMenuButton = objMenuGroup.Controls.Add _ (Type:=msoControlButton, Temporary:=True) With objMenuButton .Caption = "Modul modKreisFläche / Makro Kreis2" .OnAction = "Kreis2" .Style = msoButtonIconAndCaption .Tag = sMenuName End With Set objMenuBar = Nothing Set objMenuGroup = Nothing Set objMenuButton = Nothing End Sub Public Sub RemoveMenu() Dim objMenu As Object Dim objMenuBar As Object Set objMenuBar = CommandBars.ActiveMenuBar For Each objMenu In objMenuBar.Controls If objMenu.Tag = sMenuName Then objMenu.Delete End If Next Set objMenuBar = Nothing End Sub

Installiert wird der Menüeintrag mit den folgenden Ereignisprozeduren im Objekt DieseArbeitsmappe. Codeliste 1-15. Erstellung und Entfernung der Menüeinträge Private Sub Workbook_BeforeClose(Cancel As Boolean) RemoveMenu End Sub Private Sub Workbook_Open() InitMenu End Sub

56

|

Einführung in VBA

1.6 Eigene Klassen und Objekte Im vorangegangenen Abschnitt wurden Excel-Objekte mit ihren Eigenschaften und Methoden beschrieben. Aber Objekte finden sich überall im realen Leben. Ein Auto ist so ein Objekt. Es hat Eigenschaften, man spricht hier von Attributen, wie Farbe, Länge, Radabstand, Anzahl Türen, Fensterform. Und es hat Methoden wie Starten, Beschleunigen, Bremsen.

1.6.1 Klassendiagramm Der Hersteller eines Autos gleichen Typs, möchte davon möglichst viele herstellen und benötigt dazu einen Bauplan. Dieser wird in der objektorientierten Programmierung (OOP) als Klasse bezeichnet. Klassen stellen somit ein abstraktes Modell für eine Reihe ähnlicher Objekte dar. Die daraus entstehenden Objekte werden als Instanziierung der Klasse bezeichnet. Der erste Schritt zur Nutzung eigener Objekte ist die Erstellung einer (Software-) Architektur. Diese wird z. B. als Klassendiagramm (UML) erstellt. Darin werden die Beziehungen der Klassen untereinander und die Eigenschaften und Methoden jeder Klasse definiert. In der Objektorientierung ist die Klasse ein abstrakter Begriff zur Beschreibung gemeinsamer Strukturen und Verhalten von Objekten. Die grafische Darstellung einer Klasse zeigt Bild 1-47 am Beispiel ebener Dreiecke.

Bild 1-47. Klasse mit den Eigenschaften (Seite, Umfang und Fläche) und den Methoden Berechne

Klassen werden durch Rechtecke dargestellt, die entweder nur den Namen der Klasse oder zusätzlich auch Eigenschaften, Methoden und Ereignisse darstellen. Dabei werden die Rubriken durch eine horizontale Linie getrennt. Vor den Eigenschaften und Methoden werden sogenannte Modifizierer gesetzt. Sie beschreiben die Zugriffmöglichkeiten auf die Elemente der Klasse. Tabelle 1-19. Modifizierer für Eigenschaften und Methoden Zeichen

Bedeutung

Beschreibung



private

nur innerhalb der Klasse selbst

+

public

"von außen" sichtbar, gehört also zur öffentlichen Schnittstelle

#

protected

nur innerhalb der Klasse selbst oder innerhalb davon abgeleiteter Klassen

Zur Modellierung von Klassendiagrammen sind bestimmte Elemente vorgesehen (Bild 1-48).

1.6 Eigene Klassen und Objekte

|

57

Eine Klasse wird vereinfacht als ein Rechteck dargestellt, in dem der Name der Klasse steht. Ausführlicher werden in Rechtecken darunter Eigenschaften und Methoden aufgeführt. Eine abstrakte Klasse wird kursiv geschrieben und besitzt keine Objekte, sondern dient nur der Strukturierung. Eine Assoziation ist eine Beziehung zwischen Klassen. Ihre Objekte tauschen über die Assoziation ihre Nachrichten aus. Sie hat einen Namen und kann einen Pfeil für die Richtung haben. An den Enden stehen die Rollen der Klassen und ihre Multiplizität. Eine gerichtete Assoziation hat einen offenen Pfeil und Nachrichten werden nur in dieser Richtung getauscht. Eine Vererbung wird mit einem leeren Pfeil dargestellt. Die Unterklasse erbt die Eigenschaften der Oberklasse. Eine Aggregation ist eine Teile-Ganzes-Beziehung und wird durch eine Raute ausgedrückt. Sind die Teile existenzabhängig vom Ganzen, spricht man von einer Komposition und die Raute ist gefüllt.

Bild 1-48. Die wichtigsten Klassendiagramm-Elemente

Die Abbildung realer Objekte in der Programmierung hat, nach der prozeduralen und modularen Programmierung, diese noch einmal revolutioniert. Auch VBA erlaubt die Nutzung objektorientierter Strukturen und Klassendiagramme sind die Basis für deren Entwurf. Daher sind sie auch der zentrale Diagrammtyp der UML. Die Grundidee der Objektorientierung ist es, Daten und deren Behandlungsmethoden möglichst eng zu einem Objekt zusammenzufassen. Mitunter ist es sinnvoll, diese Daten und Methoden nach außen hin zu verbergen (zu kapseln). Dann müssen Schnittstellen (Interfaces) definiert werden, damit andere Objekte mit ihnen in Wechselwirkung treten können. In Klassendiagrammen wird zwischen dem Analyse- und dem Design-Modell unterschieden. Das Analyse-Modell stellt dar, was das System aus Anwendersicht leisten soll. Ausgehend von den Objekten, die sich in der realen Welt befinden. Im Design-Modell wird der Aufbau des Systems unter Berücksichtigung der geforderten technischen Bedingungen bestimmt, damit die im Analyse-Modell festgelegten Eigenschaften realisiert werden. Im ersten Schritt hin zur Modellbildung sollten zuerst die relevanten Use-Cases bestimmt werden, aus denen sich dann die notwendigen Klassen ableiten lassen. Beginnend mit der Erstellung des Analyse-Modells sollte dann baldmöglichst auch das Design-Modell parallel dazu erstellt werden, damit die Wechselwirkung zwischen beiden auch ihre Berücksichtigung findet. Dieser Prozess ist in der Regel evolutionär und führt von einem funktionsfähigen Kern durch iterative Erweiterungen zu einer umfassenden Lösung. Eine Abwandlung des Klassendiagramms wird zur Darstellung einzelner Objekte genutzt. Diese Darstellung wird als Objektdiagramm bezeichnet. Dabei wird der Name des Objekts durch einen Doppelpunkt vom Typ (Klasse) getrennt geschrieben und unterstrichen. Ein Objektdiagramm zeigt den Zustand eines Objekts zu einem fixen Zeitpunkt. Bild 1-49 zeigt zwei Dreieck-Objekte zum Zeitpunkt ihrer Instanziierung.

58

|

Einführung in VBA

Bild 1-49. Objekte der Klasse Dreieck

Die Eigenschaften erhalten konkrete Werte und die Methoden der Klasse werden nicht dargestellt. Dabei werden auch die mit der Instanziierung bestimmten abgeleiteten Werte angegeben (Umfang und Flächeninhalt). Während das Klassendiagramm die Strukturen eines OOP-Systems zeigt, dient das folgende Sequenz-Diagramm zur Dokumentation zeitlicher Abläufe und ist damit auch ein Mittel zur Beschreibung der Semantik.

1.6.2 Sequenzdiagramm Ein Sequenzdiagramm ist ein weiteres Diagramm in UML und gehört zur Gruppe der Verhaltensdiagramme. Es beschreibt die Nachrichten zwischen Objekten in einer bestimmten Szene, und ebenso die zeitliche Reihenfolge (Bild 1-50). Eine Strichfigur stellt den Nutzer der Szene dar. Eine Szene kann aber auch durch das System angestoßen werden. In einem Rechteck wird Objektname und Klasse genannt, so wie in der Instanzspezifikation. Ein Pfeil an das Objekt kennzeichnet die Instanziierung. Eine senkrechte gestrichelte Linie stellt die Lebenslinie (lifeline) des Objekts dar. Die Lebenslinie endet mit gekreuzten Linien. Nachrichten werden als Pfeile eingezeichnet. Die Bezeichnung der Nachricht steht am Pfeil. Ein geschlossener Pfeil kennzeichnet eine synchrone Nachricht, ein geöffneter eine asynchrone Nachricht. Eine gestrichelte Linie kennzeichnet die Rückmeldung (Return). Bild 1-50. Die wichtigsten Sequenzdiagramm-Elemente

Die Zeit verläuft im Diagramm von oben nach unten. Die Reihenfolge der Pfeile gibt den zeitlichen Verlauf der Nachrichten wieder. Sequenzdiagramme können ebenfalls verschachtelt sein. Aus einem Sequenzdiagramm kann ein Verweis auf Teilsequenzen in einem anderen Sequenzdiagramm existieren. Ebenso kann eine alternative Teilsequenz existieren, die in Abhängigkeit von einer Beziehung ausgeführt wird. Bild 1-51 beschreibt Teilszenen aus einem Sequenzdiagramm.

1.6 Eigene Klassen und Objekte

|

59

Die Instanziierung eines Objekts wird durch eine Nachricht an den Rahmen des Objekts dargestellt. Damit beginnt die Lebenslinie unterhalb des Objekts als gestrichelte Linie. Ein X am Ende der Lebenslinie kennzeichnet ihr Ende. Ein geschlossener Pfeil kennzeichnet synchrone Nachrichten. Das SenderObjekt wartet, bis das Empfänger-Objekt ein Return sendet und setzt dann die Verarbeitung fort. Der Aufruf hat einen Namen und in Klammern können Parameter (Name und Typ) angegeben werden. Ein geöffneter Pfeil kennzeichnet asynchrone Nachrichten. Das SenderObjekt wartet nicht auf eine Rückmeldung, sondern setzt nach dem Senden die Verarbeitung fort.

Bild 1-51. Wichtige Teilszenen aus einem Sequenzdiagramm

1.6.3 Definition einer Klasse Zur Definition einer Klasse stellt VBA ein besonderes Modul zur Verfügung, das Klassenmodul (Bild 1-52). Es ist der Container für die Definition der Eigenschaften und Methoden einer Klasse.

Bild 1-52. Ein Klassenmodul erstellen

Das Klassenmodul besitzt einen Namen, der sich im Eigenschaftsfenster ändern lässt. Natürlich benutzt man Namen, die die Objekte der Klasse eindeutig beschreiben. Das Klassenmodul hat außerdem noch die Eigenschaft Instancing und dies ist auf Private gesetzt. Das bedeutet, dass alle Definitionen in dieser Klasse „nach außen“ nicht zugänglich sind.  2-12-01-06_KreisKlasse.xlsm Als einfaches Beispiel wird die Berechnung von Fläche und Umfang eines Kreises bei gegebenem Durchmesser betrachtet und es sollen gleich mehrere Kreise berechnet werden. Immer wenn mehrere Objekte des gleichen Typs vorliegen, bietet sich eine Klasse an. Das Klassendiagramm (Bild 1-53) gibt eine erste Vorstellung von der Anwendung.

60

|

Einführung in VBA

Bild 1-53. Klasse Kreis mit Eigenschaften und Methoden

Im ersten Schritt wird in VBA die Klasse clsKreis definiert (Bild 1-54).

Bild 1-54. Aufbau der Klasse Kreis

1.6.4 Konstruktor und Destruktor Wenn in der Kopfzeile des Codefensters das Objekt Class angewählt wird, lassen sich im danebenstehenden Kombifeld zwei Ereignis-Methoden anwählen, die sich nach der Anwahl als private Prozeduren darstellen. Die Methode Class_Initialize wird in OOP-Sprachen als Konstruktor bezeichnet. Entsprechend die Methode Class_Terminate als Destruktor. Sie werden später bei jeder Instanziierung eines Objektes (Initialize) bzw. vor der Löschung (Terminate) aufgerufen. Als private Prozeduren können sie nicht von außen aufgerufen werden, erscheinen also auch nicht als Makros. Konstruktoren und Destruktoren stammen zwar aus der OOP, sind aber ein von der objektorietierten Programmierung unabhängiges Konzept und daher nicht darauf beschränkt. Man findet sie auch in prozeduralen Programmiersprachen. Konstruktoren können mit Parametern versehen werden, die zur Erstellung und Auflösung der betreffenden Variablen beitragen. Destruktoren verfügen in der Regel über keine Parameter.

1.6.5 Instanziierung von Objekten Das Arbeiten mit der Klasse soll in einem eigenen Modul durchgeführt werden. Dazu wird ein Modul unter dem Namen modKreise eingefügt. Es erhält die Prozedur Kreise (Bild 1-55). Die Prozedur kann auch als Makro aufgerufen werden.

1.6 Eigene Klassen und Objekte

|

61

Bild 1-55. Modul Kreise

In einem Arbeitsblatt sollen ein paar zu berechnende Werte stehen (Bild 1-56).

Bild 1-56. Arbeitsblatt mit Zeitwerten

Innerhalb der Prozedur wird die Anzahl belegter Zeilen über den Zeilenzähler des UsedRangeObjekts bestimmt und mithilfe einer For-Next-Schleife werden die Werte gelesen. Um zu kontrollieren, ob diese Prozedur richtig funktioniert, erfolgt hinter der Wertzuweisung noch eine Ausgabe in das Direktfenster (über Ansicht einstellbar) mit der Anweisung Debug.Print. Sub Kreise() Dim dD As Double Dim iMax As Integer Dim iRow As Integer iMax = ActiveSheet.UsedRange.Rows.Count For iRow = 2 To iMax dD = CDbl(Cells(iRow, 1)) Debug.Print dD Next iRow End Sub

62

|

Einführung in VBA

Die Funktion CDbl (für Convert Double) sorgt dafür, dass Dezimalwerte mit Nachkommastellen korrekt übertragen werden und wird immer dann auftauchen, wenn Zellenwerte gelesen werden. Mehr zur Konvertierung in Kapitel 2. Eine Ausführung zeigt das Ergebnis im Direktfenster (Bild 1-57).

Bild 1-57. Ausgabe der gelesenen Durchmesserwerte im Direktfenster

Zur Instanziierung eines Objekts wird, wie bereits beschrieben, zunächst eine Objektvariable definiert. Für jeden Kreis wird dann in der Schleife ein Objekt der Klasse clsKreis instanziiert. Bei der Codeeingabe wird bereits die installierte Klasse vorgeschlagen (Bild 1-58).

Bild 1-58. Vorgabe der Klasse durch Intellisense

1.6.6 Arbeiten mit Objekten Doch wie bekommen nun die Eigenschaften einer Klasse ihre Werte, da sie ja von außerhalb des Klassenmoduls durch dessen Private-Eigenschaft nicht zugänglich sind. Eine Möglichkeit ist die Public-Definition der Variablen außerhalb der Prozedur Kreise. Zum Beweis wandert die Ausgabe zum Direktfenster in den Konstruktor der Klasse.  2-12-01-07_KreisKlasse.xlsm Der Code im Modul modKreise lautet nun: Public dDu As Double Sub Kreise() Dim iMax Dim iRow Dim objKreis

As Integer As Integer As Object

iMax = ActiveSheet.UsedRange.Rows.Count For iRow = 2 To iMax

1.6 Eigene Klassen und Objekte

|

63

dDu = CDbl(Cells(iRow, 1)) Set objKreis = New clsKreis Next iRow End Sub

Der Code im Klassenmodul clsKreis lautet: 'Eigenschaften Dim dDurchm As Double Dim dUmfang As Double Dim dFläche As Double 'Methoden Private Sub Class_Initialize() dDurchm = dDu 'Auswertung Debug.Print dDurchm End Sub

Die Ausgabe ins Direktfenster bestätigt die Funktionalität. Nun kann im Konstruktor, dort wo als Kommentar Auswertung steht, die Berechnung der anderen Eigenschaften erfolgen. Man spricht auch von abgeleiteten Eigenschaften. 'Eigenschaften Dim dDurchm As Double Dim dUmfang As Double Dim dFläche As Double 'Methoden Private Sub Class_Initialize() dDurchm = dDu dUmfang = 4 * Atn(1) * dDurchm dFläche = Atn(1) * dDurchm ^ 2 Debug.Print dDurchm, dUmfang, dFläche End Sub

Die Funktion Atn(1) liefert als Wert S/4 und kann auch in den Formeln gut angewendet werden. Eine Funktion, die man sich merken sollte, da S immer wieder Bestandteil von Formeln ist. Eine andere Möglichkeit ist die Anwendung der Worksheet-Funktion PI. dUmfang = WorksheetFunction.Pi * dDurchm dFläche = WorksheetFunction.Pi / 4 * dDurchm ^ 2

In den Worksheet-Funktionen finden sich alle Funktionen wieder, die auch im Arbeitsblatt in Formeln angewendet werden können, manchmal aber unter einem anderen Namen. Eine erneute Ausgabe ins Direktfenster bestätigt die erfolgte Berechnung (Bild 1-59).

Bild 1-59. Ausgabe der berechneten Werte

Die Definition einer globalen Variablen ist allerdings nicht der übliche Weg zur Nutzung der Eigenschaften einer Klasse. Die Zuweisung von Werten an eine Objekt-Eigenschaft und das

64

|

Einführung in VBA

Auslesen des Wertes werden durch die Verwendung sogenannter Property-Funktionen vorgenommen. Property bedeutet übersetzt nichts anderes als Eigenschaft. Für eine Zuweisung wird die Property Let-Funktion verwendet. [Public|Private][Static] Property Let Name ([Parameterliste], Wert) [Anweisungen] [Exit Property] [Anweisungen] End Property

Das Auslesen aus einer Objekt-Eigenschaft übernimmt die Property Get-Funktion. [Public|Private][Static] Property Get Name ([Parameterliste])[As Typ] [Anweisungen] [Name = Ausdruck] [Exit Property] [Anweisungen] [Name = Ausdruck] End Property

Es bleibt noch festzustellen, dass es sich bei der Property Let-Funktion um eine Prozedur handelt, während die Property Get-Funktion eine echte Funktion darstellt. Für eine Klasseneigenschaft wird also immer ein Property-Paar Let und Get benötigt. Am einfachsten werden die Prozedurrümpfe in der Klasse über Register Einfügen unter Prozedur im Dialogfenster Prozedur hinzufügen (Bild 1-60).

Bild 1-60. Erstellung eines Property-Paares für die Eigenschaft Durchm (Fenster geteilt)

Im Dialogfenster wird ein noch nicht benutzter Name der Eigenschaft (hier Durchm) eingegeben und als Prozedur-Typ Property gewählt. Mit Public haben die Prozeduren im gesamten Projekt ihre Gültigkeit. Public Property Get Durchm() As Variant End Property Public Property Let Durchm(ByVal vNewValue As Variant) End Property

Die Property-Funktionen dürfen sogar namensgleich sein, da der Compiler den lesenden und schreibenden Zugriff auseinanderhalten kann. Die Property-Funktionen müssen natürlich noch mit Leben gefüllt werden. Auch ihr Datentyp wird angepasst. Für das Beispiel wird noch ein Lesezugriff auf Umfang und Fläche benötigt. Daher wird die Berechnung gleich integriert, sodass die Klasse nur noch die Eigenschaft Durchm benötigt. Die Klasse clsKreis hat jetzt folgenden Inhalt:

1.6 Eigene Klassen und Objekte

|

65

'Eigenschaft Dim dDurchm

As Double

'Methoden Public Property Let Durchm(ByVal dNeuDurchm As Double) dDurchm = dNeuDurchm End Property Public Property Get Durchm() As Double Durchm = dDurchm End Property Public Property Get Umfang() As Double Umfang = 4 * Atn(1) * dDurchm End Property Public Property Get Fläche() As Double Fläche = Atn(1) * dDurchm ^ 2 End Property

Entsprechend wird der Code der Prozedur Kreise angepasst: Sub Kreise() Dim iMax Dim iRow Dim dDu Dim objKreis

As As As As

Integer Integer Double clsKreis

iMax = ActiveSheet.UsedRange.Rows.Count For iRow = 2 To iMax Set objKreis = New clsKreis dDu = CDbl(Cells(iRow, 1)) With objKreis .Durchm = dDu Debug.Print .Durchm, .Umfang, .Fläche End With Next iRow End Sub

Oft kommt es in Prozeduren vor, dass mehrere Eigenschaften und Methoden eines Objekts hintereinanderstehen. Dafür gibt es die verkürzte Schreibweise: With Object .Attribut1 = Wert .Attribut2 = Wert … .Methode1 ([Parameterliste1]) .Methode2 ([Parameterliste2]) … End With

Eigenschaften und Methoden eines Objektes werden durch With und End With geklammert. So kann die vor den Punkt gehörende Objektbezeichnung entfallen. Die berechneten Werte können nun auch direkt ins Arbeitsblatt eingetragen werden.  2-12-01-08_KreisKlasse.xlsm Sub Kreise() Dim iMax Dim iRow Dim dDu Dim objKreis

66

|

Einführung in VBA

As As As As

Integer Integer Double clsKreis

Worksheets("Kreisberechnung").Activate iMax = ActiveSheet.UsedRange.Rows.Count For iRow = 2 To iMax Set objKreis = New clsKreis dDu = CDbl(Cells(iRow, 1)) With objKreis .Durchm = dDu Debug.Print .Durchm, .Umfang, .Fläche End With Next iRow End Sub

Soll nach der Leseprozedur auf einzelne Objekte zugegriffen werden, so gibt es immer noch das Problem, dass dies nicht geht. Alle erzeugten Objekte haben den gleichen Namen, obwohl mit jedem New ein neuer Speicherbereich für das Objekt angelegt wird. Indizierte Objektvariable Eine Lösung ist die Einführung einer indizierten Objektvariablen. Dadurch ist jedes Objekt über seinen Index eindeutig adressierbar. Option Base 1 Sub KreiseIndiziert() Dim iMax As Integer Dim iRow As Integer Dim dDu As Double Dim objKreis() As clsKreis 'Lesen und Instanziierung Worksheets("Kreisberechnung").Activate iMax = ActiveSheet.UsedRange.Rows.Count For iRow = 2 To iMax ReDim Preserve objKreis(iRow - 1) Set objKreis(iRow - 1) = New clsKreis dDu = CDbl(Cells(iRow, 1)) objKreis(iRow - 1).Durchm = dDu Next iRow 'Schreiben in das Arbeitsblatt Range("A2:C8").ClearContents 'löscht vorher alte Werte For iRow = 2 To iMax With objKreis(iRow - 1) Cells(iRow, 1) = Str(.Durchm) Cells(iRow, 2) = Str(.Umfang) Cells(iRow, 3) = Str(.Fläche) End With 'löscht das Objekt im Speicher Set objKreis(iRow - 1) = Nothing Next iRow End Sub

Eleganter als eine indizierte Variable ist die Nutzung einer eigenen Objektliste.

1.6.7 Objektlisten Bereits unter Objekte haben wir Objektlisten kennengelernt, die zu vorgegebenen VBAObjektbibliotheken gehören. Objektlisten lassen sich aber auch für eigene Objekte erstellen. Dazu bedient man sich der einfachen Klasse Collection (Auflistung).

1.6 Eigene Klassen und Objekte

|

67

Collection Ein Collection-Objekt bietet die Möglichkeit, eine Sammlung von Datenelementen anzulegen, die nicht zwangsläufig denselben Datentyp haben. Die Klasse Collection bietet die nachfolgend aufgelisteten Methoden. Tabelle 1-20. Die Methoden und Eigenschaften der Klasse Collection Add (Item, Key, Before, After)

Hinzufügen eines Elements Item: Element beliebigen Datentyps Key: Textschlüssel für den Zugriff Before, After: Relative Positionierung der Zufügung

Remove (Index)

Entfernt ein Element Index: Key oder Zahl in der Liste

Item

1 b und s > c folgen. Dies muss eine eigene Funktion auch berücksichtigen. Für die

Aufnahme wird ein Modul verwendet, das den Namen modFunktionen bekommt. In das Codefenster wird die Funktion Heron eingetragen.  2-12-01-14_EigeneFunktion.xlsm Codeliste 1-18. Funktion Heron im Modul modFunktionen Function Heron( _ da As Double, _ db As Double, _ dc As Double) As Variant Dim ds As Double 'Hilfsgröße halber Umfang ds = (da + db + dc) / 2 'Bedingungen If ds @Bedingung;"Ziel erreicht"; "Ziel verfehlt")

Als sogenanntes „Helferchen“ steht im Modul modDelete eine Prozedur zur Löschung aller Bereichsnamen in der aktuellen Arbeitsmappe. Codeliste 3-1. Prozedur löscht alle Bereichsnamen im aktuellen Workbook Sub NamenDelete() Dim Temp On Error Resume Next For Each Temp In ActiveWorkbook.Names Temp.Delete Next End Sub

Die jeweiligen Worksheets beinhalten die Prozeduren zur Namensvergabe, zur Formelerstellung und alternativ zur Wertbestimmung. Vor jedem Aufruf sollten alle Bereichsnamen gelöscht werden (Prozedur NamenDelete). Codeliste 3-2. Prozeduren im Worksheet WENN Private Sub NamenVergeben() Call NamenDelete With ActiveWorkbook.Names .Add Name:="Januar", RefersTo:=Range("WENN!B2:B5") .Add Name:="Februar", RefersTo:=Range("WENN!C2:C5") .Add Name:="März", RefersTo:=Range("WENN!D2:D5") .Add Name:="Gesamtumsatz", RefersTo:=Range("WENN!B6:D6") .Add Name:="Bedingung", RefersTo:=Range("WENN!A9") End With End Sub Private Sub FormelnSchreiben() Range("B6").Formula = "=SUM(Januar)" Range("C6").Formula = "=SUM(Februar)" Range("D6").Formula = "=SUM(März)" Range("B9:D9").Formula = _ "=IF(Gesamtumsatz>Bedingung,""Ziel erreicht"",""Ziel verfehlt"")" End Sub

3.3 Funktionen

|

131

Private Sub WerteZuweisen() Range("B6") = Evaluate("=SUM(Januar)") Range("C6") = Evaluate("=SUM(Februar)") Range("D6") = Evaluate("=SUM(März)") Range("B9:D9") = Evaluate _ ("=IF(Gesamtumsatz>Bedingung,""Ziel erreicht"",""Ziel verfehlt"")") End Sub

UND-Funktion Syntax zur UND-Funktion: =UND (Wahrheitswert1; Wahrheitswert2; ...) Aufgabe zur UND-Funktion: Ein Controller soll die Umsätze eines Verkäufers in einem Vertriebsgebiet aus der Auftragsliste ermitteln (Bild 3-14). Hierzu fügt er in der Liste die Aussage "gefunden" ein, um mit der Funktion SUMMEWENN die Umsätze zu summieren, die das Kriterium "gefunden" erfüllen. Um die Markierung zu erstellen, setzt er eine WENN-Funktion ein, welche in der Prüfung die UND-Funktion enthält, die beide Kriterien Gebiet und Verkäufer abgleicht.

Bild 3-14. Verkaufsumsätze Tabelle 3-5. Bereichsnamen UND Bereich Name

Bereich Name

Bereich

Bereichsname

A2:A10 Gebiet1

C2:C10 Umsatz1

B14

Verkäufer1.1

B2:B10 Verkäufer1 B13

Gebiet1.1 D2:D10 Bemerkung1

Tabelle 3-6. Formeln im Worksheet UND Bereich Formel D2:D10 =WENN(UND(@Gebiet1.1 =Gebiet1;@Verkäufer1.1=Verkäufer1); "gefunden";"") B15

132

=SUMMEWENN(Bemerkung;"gefunden";Umsatz)

|

Formeln und Funktionen

Codeliste 3-3. Prozeduren im Worksheet UND Private Sub NamenVergeben() Call NamenDelete With ActiveWorkbook.Names .Add Name:="Gebiet1", RefersTo:=Range("UND!A2:A10") .Add Name:="Verkäufer1", RefersTo:=Range("UND!B2:B10") .Add Name:="Umsatz1", RefersTo:=Range("UND!C2:C10") .Add Name:="Bemerkung1", RefersTo:=Range("UND!D2:D10") .Add Name:="Gebiet1.1", RefersTo:=Range("UND!B13") .Add Name:="Verkäufer1.1", RefersTo:=Range("UND!B14") End With End Sub Private Sub FormelnSchreiben() Range("D2:D10").Formula = _ "=IF(AND(Gebiet1.1=Gebiet1,Verkäufer1.1= Verkäufer1)," & _ """gefunden"","""")" Range("B15").Formula = "=SUMIF(Bemerkung1,""gefunden"",Umsatz1)" End Sub Private Sub WerteZuweisen() Dim iRow As Integer For iRow = 2 To 10 If Cells(iRow, 1) = Cells(13, 2) And _ Cells(iRow, 2) = Cells(14, 2) Then Cells(iRow, 4) = "gefunden" Else Cells(iRow, 4) = "" End If Next iRow Range("B15") = Evaluate("=SUMIF(Bemerkung1,""gefunden"",Umsatz1)") End Sub

ODER-Funktion Syntax zur ODER-Funktion: =ODER (Wahrheitswert1; Wahrheitswert2; ...) Aufgabe zur ODER-Funktion: Ein Controller soll den Gesamtumsatz (Bild 3-15) der Regionen Nord und Ost ermitteln. Tabelle 3-7. Bereichsnamen im Worksheet ODER Bereich

Name

Bereich Name

Bereich Name

A2:A10

Gebiet2

B13

Gebiet2.1

C2:C10 Bemerkung2

B2:B10

Umsatz2

B14

Gebiet2.2

Tabelle 3-8. Formeln im Worksheet ODER Bereich

Formel

C2:C10

=WENN(ODER(Gebiet2.1=Gebiet2;Gebiet2.2=Gebiet2); "gefunden";"")

B15

=SUMMEWENN(Bemerkung2;"gefunden";Umsatz2)

3.3 Funktionen

|

133

Hierzu markiert er alle Umsätze in der Spalte Bemerkung mit dem Wort "gefunden". Im Anschluss wird mit Hilfe der SUMMEWENN-Funktion der Gesamtumsatz errechnet.

Bild 3-15. Gebietsumsätze Codeliste 3-4. Prozeduren im Worksheet ODER Private Sub NamenVergeben() Call NamenDelete With ActiveWorkbook.Names .Add Name:="Gebiet2", RefersTo:=Range("ODER!A2:A10") .Add Name:="Umsatz2", RefersTo:=Range("ODER!B2:B10") .Add Name:="Bemerkung2", RefersTo:=Range("ODER!C2:C10") .Add Name:="Gebiet2.1", RefersTo:=Range("ODER!B12") .Add Name:="Gebiet2.2", RefersTo:=Range("ODER!B13") End With End Sub Private Sub FormelnSchreiben() Range("C2:C10").Formula = _ "=IF(OR(Gebiet2.1=Gebiet2,Gebiet2.2=Gebiet2),""gefunden"","""")" Range("B14").Formula = "=SUMIF(Bemerkung2,""gefunden"",Umsatz2)" End Sub Private Sub WerteZuweisen() Dim iRow As Integer For iRow = 2 To 10 If Cells(iRow, 1) = Cells(12, 2) Or _ Cells(iRow, 1) = Cells(13, 2) Then Cells(iRow, 3) = "gefunden" Else Cells(iRow, 3) = "" End If Next iRow Range("B14") = Evaluate("=SUMIF(Bemerkung2,""gefunden"",Umsatz2)") End Sub

BEREICH.VERSCHIEBEN-Funktion Syntax zur BEREICH.VERSCHIEBEN-Funktion: =BEREICH.VERSCHIEBEN (Bezug; Zeilen; Spalten; Höhe; Breite)

134

|

Formeln und Funktionen

Aufgabe zur BEREICH.VERSCHIEBEN-Funktion: Ein Controller möchte eine Summenfunktion (Bild 3-16) auf einen bestimmten Bezug verschieben. Im ersten Beispiel soll die Summenfunktion in Abhängigkeit des Monats verschoben werden. Im zweiten Beispiel soll eine weitere Summenfunktion in Abhängigkeit der Warengruppe verschoben werden. Es könnten auch beide Funktionen kombiniert werden.

Bild 3-16. Warengruppenumsätze Tabelle 3-9. Bereichsnamen und Formeln im Worksheet BEREICH.VERSCHIEBEN Bereich Name

Bereich Formel

B2:B5

Warengruppe B9

=SUMME(BEREICH.VERSCHIEBEN(Warengruppe;;Monat))

C1:E1

Quartal

=SUMME(BEREICH.VERSCHIEBEN(Quartal;Position;))

C8

Monat

C12

Position

B13

Codeliste 3-5. Prozeduren im Worksheet BEREICH.VERSCHIEBEN Private Sub NamenVergeben() Call NamenDelete With ActiveWorkbook.Names .Add Name:="Warengruppe", RefersTo:=Range("B2:B5") .Add Name:="Quartal", RefersTo:=Range("C1:E1") .Add Name:="Monat", RefersTo:=Range("C8") .Add Name:="Position", RefersTo:=Range("C12") End With End Sub Private Sub FormelnSchreiben() Range("C9").Formula = "=SUM(OFFSET(Warengruppe,,Monat))" Range("C13").Formula = "=SUM(OFFSET(Quartal,Position,))" End Sub Private Sub WerteZuweisen() Range("C9") = Evaluate("=SUM(OFFSET(Warengruppe,,Monat))") Range("C13") = Evaluate("=SUM(OFFSET(Quartal,Position,))") End Sub

3.3 Funktionen

|

135

MIN-Funktion Syntax zur MIN-Funktion: =MIN (Zahl1; Zahl2; ...) Aufgabe zur MIN-Funktion: Ein Controller soll Folgendes bestimmen (Bild 3-17): x x x

in der Summe die am wenigsten verkaufte Menge eines Produktes die geringste Menge der Produkte 1 und 3 die geringste Menge bei einer Verkaufsmenge über 300 Stück.

Bild 3-17. Produktmengen mit MIN Tabelle 3-10. Bereichsnamen und Formeln im Worksheet MIN Bereich Name

Bereich Formel

B2:D13 Mengen

B16

=MIN(Mengen)

B2:B13 Produkt1 B17

=MIN(Produkt1;Produkt3)

C2:C13 Produkt2 B18

=MIN(WENN(Mengen>300;Mengen))

D2:D13 Produkt3 Codeliste 3-6. Prozeduren im Worksheet MIN Sub NamenVergeben() Call NamenDelete With ActiveWorkbook.Names .Add Name:="Mengen", RefersTo:=Range("B2:D13") .Add Name:="Produkt1", RefersTo:=Range("B2:B13") .Add Name:="Produkt2", RefersTo:=Range("C2:C13") .Add Name:="Produkt3", RefersTo:=Range("D2:D13")

136

|

Formeln und Funktionen

End With End Sub Sub FormelnSchreiben() Range("B16").Formula = "=MIN(Mengen)" Range("B17").Formula = "=MIN(Produkt1,Produkt3)" Range("B18").FormulaArray = "=MIN(IF(Mengen>300,Mengen))" End Sub Sub WerteZuweisen() Range("B16") = Evaluate("=MIN(Mengen)") Range("B17") = Evaluate("=MIN(Produkt1,Produkt3)") Range("B18") = Evaluate("=MIN(IF(Mengen > 300,Mengen))") End Sub

MAX-Funktion Syntax zur MAX-Funktion: =MAX (Zahl1; Zahl2; ...) Aufgabe zur MAX-Funktion: Dem Controller liegt eine Liste (Bild 3-18) mit Stückzahlen und folgenden Aufgaben vor: x x x x

größte Stückzahl aus der gesamten Liste bestimmen, um somit das leistungsstärkste Produkt zu finden die größte verkaufte Menge bei den Produkten P1 und P3 ermitteln die größte Menge unter 300 Stück bestimmen (diesen Schritt mithilfe einer WENNFunktion als Matrix-Funktion umsetzen) den größten Wert zwischen 650 und 830 bestimmen.

Bild 3-18. Produktmengen mit MAX

3.3 Funktionen

|

137

Tabelle 3-11. Bereichsnamen und Formeln im Worksheet MAX Bereich Name

Bereich Formel

B2:D13 Mengen

B16

=MAX(Mengen)

B2:B13 Produkt1 B17

=MAX(Produkt1;Produkt3)

C2:C13 Produkt2 B18

{=MAX(WENN(Mengen=650;WENN(Mengen 0 Set wbkBook = Workbooks.Open(Filename:=sFile) For Each wshTemp In wbkBook.Worksheets If Left(wshTemp.Name, 4) = "Werk" Then Debug.Print wbkBook.Name & "." & wshTemp.Name End If Next wshTemp wbkBook.Close Set wbkBook = Nothing sFile = Dir() 'nächste Mappe Loop End Sub

Zur weiteren Betrachtung wählen wir den einfachsten Fall. Für die Summenbildung wird ein neues Arbeitsblatt angelegt (Bild 4-2).

Bild 4-2. Visualisierung der konsolidierten Umsätze Codeliste 4-4. Prozedur konsolidiert Listen in einer Mappe Sub ListenKonsolidieren() Dim wshSum As Worksheet Dim wshTemp As Worksheet Dim rngData As Range Dim sArtikel As String Dim lRow As Long Dim lRowMax As Long Dim lCol As Long Dim lColMax As Long Dim lSum As Long Dim lRowSum As Long Dim lIstDa As Long 'Summen-Arbeitsblatt 'am Ende der Listen erstellen With ThisWorkbook Set wshSum = .Worksheets.Add _ (after:=.Worksheets(.Worksheets.Count)) wshSum.Name = "Summen"

4.1 Daten konsolidieren

|

193

lRowSum = 1 'Listen lesen und Summen bilden For Each wshTemp In .Worksheets If Left(wshTemp.Name, 4) = "Werk" Then lRowMax = wshTemp.UsedRange.Rows.Count lColMax = wshTemp.UsedRange.Columns.Count 'Überschrift If lRowSum = 1 Then For lCol = 1 To lColMax wshSum.Cells(1, lCol) = wshTemp.Cells(1, lCol) Next lCol End If 'Liste auswerten For lRow = 2 To lRowMax sArtikel = wshTemp.Cells(lRow, 1) If Not sArtikel = "" Then lIstDa = 0 If lRowSum > 0 Then For lSum = 1 To lRowSum If wshSum.Cells(lSum, 1) = sArtikel Then lIstDa = lSum Exit For End If Next lSum End If 'Eintrag vorhanden If lIstDa > 0 Then For lCol = 2 To lColMax wshSum.Cells(lIstDa, lCol) = _ wshSum.Cells(lIstDa, lCol) + _ wshTemp.Cells(lRow, lCol) Next lCol 'neuer Eintrag Else lRowSum = lRowSum + 1 wshSum.Cells(lRowSum, 1) = sArtikel For lCol = 2 To lColMax wshSum.Cells(lRowSum, lCol) = _ wshTemp.Cells(lRow, lCol) Next lCol End If End If Next lRow End If Next End With 'Summenbereich formatieren und sortieren With wshSum Set rngData = .Range(.Cells(2, 2), _ .Cells(lRowSum, lColMax)) rngData.NumberFormat = "#,##0.00 _€" Set rngData = Nothing Set rngData = .Range(.Cells(2, 1), _ .Cells(lRowSum, lColMax)) rngData.EntireColumn.AutoFit .Range("A2").Select .Sort.SortFields.Clear .Sort.SortFields.Add Key:=Range("A2"), _ SortOn:=xlSortOnValues, _ Order:=xlAscending, _ DataOption:=xlSortNormal

194

|

Datenaufbereitung

With .Sort .SetRange rngData .Header = xlNo .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With 'einfaches Balkendiagramm .Shapes.AddChart2(201, xlColumnClustered).Select ActiveChart.SetSourceData Source:=rngData End With Set wshTemp = Nothing Set wshSum = Nothing Set rngData = Nothing End Sub

Die Prozedur ist so gehalten, dass die Monate in den Listen ein Quartal, ein Halbjahr, ein Jahr oder beliebige Monate umfassen können. Einzige Voraussetzung: die Anordnung der Monate ist in allen Listen gleich. Artikel können in einer Liste, in zwei Listen usw. beliebig enthalten sein. Einzige Voraussetzung: eine Liste darf keine Leerzeilen enthalten.

4.1.3 Manuelle Einstellungen Die manuelle Erstellung lässt sich ebenfalls einfach bewerkstelligen: x x x x

Wie schon beschrieben, bekommen alle drei Datentabellen die Namen Werk1, Werk2 und Werk3 Neues Blatt anlegen und Zelle A2 markieren Im Register Daten / Datentools die Methode Konsolidieren wählen Im Dialogfenster Konsolidieren (Bild 4-3) die drei Werke eintragen und linke Spalte mit Beschriftung wählen

Bild 4-3. Dialogfenster Konsolidieren

x x

Mit der Schaltfläche OK startet die Konsolidierung und der Bereich bleibt markiert Unter Register Einfügen / Diagramme das gruppierte Säulendiagramm wählen.

4.1 Daten konsolidieren

|

195

4.2 Daten filtern 4.2.1 Autofilter Die Handhabung des Autofilters ist in VBA relativ einfach. Als Beispiel verwenden wir die zuvor konsolidierten Daten und filtern nach allen Schrauben- und Muttern-Sorten. Codeliste 4-5. Prozedur erstellt einen Autofilter mit Kriterien Sub SetAutofilter() Dim wshSum As Worksheet Set wshSum = ActiveSheet 'Filter aufheben, falls vorhanden wshSum.Cells(2, 1).Select Selection.AutoFilter 'neuer Filter wshSum.UsedRange.AutoFilter Field:=1, _ Criteria1:=Array("*schrauben", "*muttern"), _ Operator:=xlFilterValues Set wshSum = Nothing End Sub

Entsprechend werden im Diagramm auch nur die gefilterten Werte angezeigt (Bild 4-4).

Bild 4-4. Visualisierung der gefilterten Umsätze

4.2.2 Benutzerdefinierte Ansichten Auswertungen auf Datenlisten müssen oft bei Veränderungen wiederholt werden. Auch wenn dazu nur ein paar Operationen notwendig sind, so ist der Vorgang oft sehr aufwendig. Zu diesem Problem wurden die benutzerdefinierten Ansichten entwickelt. Im ersten Schritt wird die noch nicht gefilterte Datenquelle als Basisansicht gespeichert. Unter Register Ansicht / Arbeitsmappenansicht wird dazu die Methode Benutzerdefinierte Ansichten aufgerufen. Das sich öffnende Dialogfenster zeigt zuerst noch keinen Eintrag im Listenfeld

196

|

Datenaufbereitung

Ansichten. Über die Schaltfläche Hinzufügen bekommt die aktuelle Ansicht den Namen Quelldaten (Bild 4-5).

Bild 4-5. Quelldaten als benutzerdefinierte Ansicht festlegen

Danach können die Ansichten beliebiger Filteranwendungen ebenfalls als benutzerdefinierte Ansicht gespeichert werden. Zum Beispiel die Filterung aller Federn mit dem Textfilter endet mit federn unter Artikel (Bild 4-6).

Bild 4-6. Anwendung des Textfilters unter Artikel mit endet als federn

Diese Ansicht wird nun ebenfalls als benutzerdefinierte Ansicht z. B. mit dem Namen Federn gespeichert. Mit Aufruf der Ansicht Quelldaten wird wieder die Ursprungsliste aufgerufen. Auf diese Weise können weitere Ansichten erstellt werden.

4.2.3 Erweiterter Filter Aber Excel verfügt noch über einen erweiterten Filter. Mit dieser Methode können auch komplexere Filterkriterien erstellt werden. Als Beispiel sind alle Schraubenumsätze über 20 TEuro im Januar und alle Muttern über 10 TEuro im März gesucht. Dazu wird ein KriterienBereich auf einem neuen Arbeitsblatt per Eintrag vorgegeben, mit Überschriften und Kriterien-Angaben (Bild 4-7).

Bild 4-7. Kriterienbereich

4.2 Daten filtern

|

197

Bedingungen in einer Zeile sind UND- und in verschiedenen Spalten ODER-verknüpft. Der Aufruf der Prozedur (Codeliste 4-6) erfolgt auf dem Worksheet mit dem Kriterienbereich, der später auch die gefilterten Daten enthält. So lassen sich verschiedene Auswertungen auf verschiedenen Arbeitsblättern durchführen. Codeliste 4-6. Prozedur erstellt einen Spezialfilter mit Kriterien Sub SetSpezialfilter() Dim wshSum As Worksheet Dim rngSummen As Range Dim rngKriterien As Range ActiveSheet.Range("A1").Select Set rngKriterien = ActiveSheet.UsedRange Set wshSum = Worksheets("Summen") Set rngSummen = wshSum.UsedRange Application.CutCopyMode = False rngSummen.AdvancedFilter _ Action:=xlFilterCopy, _ CriteriaRange:=rngKriterien, _ CopyToRange:=Range("A10"), _ Unique:=False Set rngKriterien = Nothing Set rngSummen = Nothing Set wshSum = Nothing End Sub

Nach dem Aufruf der Prozedur stehen die gefilterten Daten von Zeile 10 an abwärts im Arbeitsblatt mit den Kriterien (Bild 4-8).

Bild 4-8. Kriterienbereich und gefilterte Daten

4.2.4 Die FILTER-Funktion Wie bereits in Kapitel 3.4 gezeigt, lässt sich die FILTER-Funktion auf Tabellen relativ einfach anwenden. Als Beispiel wird eine Auftragsliste verwendet, die als Tabelle mit dem Namen Liste vorliegt.  2-12-04-05_Umsatzliste.xlsm Der Aufruf eines Filters erfolgt mit den Tabellenelementen (Bild 4-9).

198

|

Datenaufbereitung

Bild 4-9. Anwendung der FILTER-Funktion Codeliste 4-7. Die Prozedur filtert eine Liste nach einem Suchkriterium Sub ListeFilter() Range("F5").Formula2 = "=FILTER(Liste,Liste[Produkt]=G1,"""")" End Sub

Mehrfachkriterien werden UND-verknüpft durch Multiplikation der Bedingungen (Bild 4-10).

Bild 4-10. Anwendung der FILTER-Funktion mit UND-verknüpften Bedingungen Codeliste 4-8. Die Prozedur filtert eine Liste nach UND-verknüpften Bedingungen Sub ListeUndFilter() Range("G6").Formula2 = _ "=FILTER(Liste,(Liste[Produkt]=H1)*(Liste[Region]=H2),"""")" End Sub

Mehrfachkriterien werden ODER-verknüpft durch Addition der Bedingungen (Bild 4-11).

Bild 4-11. Anwendung der FILTER-Funktion mit ODER-verknüpften Bedingungen Codeliste 4-9. Die Prozedur filtert eine Liste nach ODER-verknüpften Bedingungen Sub ListeOderFilter() Range("G6").Formula2 = _ "=FILTER(Liste,(Liste[Produkt]=H1)+(Liste[Region]=H2),"""")" End Sub

4.2 Daten filtern

|

199

Die Bedingungen lassen sich auch untereinander verschachteln, dabei ist die Klammersetzung zu beachten.

4.2.5 Teilergebnisse Mit der Methode Teilergebnisse liefert Excel eine schnelle Möglichkeit, vorhandene Werte in Bezug auf ihre Gesamtsumme, ihren Mittelwert, ihrer Extremwerte etc. zu filtern. Gleichzeitig mit einer Gruppierung und Sortierung. Als Beispiel betrachten wir noch einmal die Auftragsliste. Die nachfolgende Prozedur erstellt eine Kopie, auf der dann die Teilsummen gebildet werden. Voraussetzung ist diesmal, dass es sich bei der Liste nicht um eine Tabelle handelt. Codeliste 4-10. Prozedur wertet eine Liste (keine Datentabelle) mit Teilergebnissen aus Sub SetTeilsummen() Dim wshListe Dim wshTeilsummen Dim rngListe Dim lRowMax Dim lColMax Dim lCol

As As As As As As

Worksheet Worksheet Range Long Long Long

Set wshListe = Worksheets("Auftragsliste") lRowMax = wshListe.UsedRange.Rows.Count Set rngListe = wshListe.Range("A2:G" & Trim(Str(lRowMax))) wshListe.Activate wshListe.Select wshListe.Copy after:=Worksheets(2) Set wshTeilsummen = Worksheets(3) wshTeilsummen.Name = "Teilsummen" wshTeilsummen.Sort.SortFields.Clear wshTeilsummen.Sort.SortFields.Add _ Key:=Range("A2"), _ SortOn:=xlSortOnValues, _ Order:=xlAscending, _ DataOption:=xlSortNormal With wshTeilsummen.Sort .SetRange rngListe .Header = xlNo .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With 'Gliederung wshTeilsummen.Select Selection.Subtotal GroupBy:=1, Function:=xlSum, _ TotalList:=Array(5), _ Replace:=True, _ PageBreaks:=False, SummaryBelowData:=True wshTeilsummen.Outline.ShowLevels RowLevels:=2 'Spalten anpassen und ausblenden lRowMax = wshTeilsummen.UsedRange.Rows.Count lColMax = wshTeilsummen.UsedRange.Columns.Count wshTeilsummen.Columns _ ("A:" & Chr(64 + lColMax)).EntireColumn.AutoFit For lCol = 2 To lColMax If wshTeilsummen.Cells(lRowMax, lCol) = "" Then

200

|

Datenaufbereitung

wshTeilsummen.Cells(lRowMax, lCol).Columns.Hidden = True End If Next lCol Set rngListe = Nothing Set wshListe = Nothing Set wshTeilsummen = Nothing End Sub

Über die Eigenschaft Key der Methode Sort.SortFields.Add wird die Spalte bestimmt, für die die Teilergebnisse erstellt werden sollen. In diesem Fall Key:=Range("A2"). Über das Attribut Function der Methode Subtotal wird die Funktion zum Teilergebnis bestimmt (Bild 4-12).

Bild 4-12. Teilergebnisse nach Regionen Tabelle 4-1. Liste der wichtigsten Funktionskonstanten Konstante

Erläuterung

Konstante

Erläuterung

xlAverage

Mittelwert

xlProduct

Produkt

clCount

Anzahl

xlStDevP

Standardabweichung Grundgesamtheit

xlCountNums

Anzahl Zahlen

xlSum

Summe

xlDistinctCount Keine Duplikate xlUnknown xlMax

Maximum

xlVar

Varianz

xlMin

Minimum

xlVarP

Varianz Grundgesamtheit

4.2.6 Datenschnitte Datenschnitte sind zusätzliche Schaltflächen auf dem Arbeitsblatt, die eine Auswahl ähnlich einem Filter erlauben. Durch die Anzeige des aktuellen Filterstatus ist die Darstellung der Daten verständlicher. Voraussetzung ist, dass die Daten als Tabelle vorliegen. Wir verwenden noch einmal eine Umsatzliste die bereits als Tabelle mit dem Namen Liste vorliegt (Bild 4-13).

Bild 4-13. Auftragsliste als Datentabelle (Filter ausgeschaltet)

4.2 Daten filtern

|

201

 2-12-04-06_Umsatzliste.xlsm Auch die Umsatzsumme und die Anzahl wurden unterhalb der Liste mit Listenverweisen bereits erstellt. Im Register Tabellenentwurf der Tabelle unter Tabellenformatoptionen wählen wir Schaltfläche „Filter“ ab, denn wir wollen ja die Filterung über Datenschnitte ausführen. Mit der Schaltfläche Datenschnitt einfügen in der Gruppe Tools öffnet sich ein Auswahlfenster (Bild 4-14).

Bild 4-14. Auswahl der Datenschnitte

Nach Auswahl und Bestätigung mit OK erhalten wir vier Datenschnitte, die wir neben der Datentabelle anordnen (Bild 4-15). Beim Start sind alle Kriterien angewählt. Die Prozedur SetDatenschnitte (Codeliste 4-11) erstellt die Datenschnitte zum Beispiel. Codeliste 4-11. Prozedur erstellt neue Datenschnitte Sub SetDatenschnitte() Dim wbkTemp As Workbook Dim wshTemp As Worksheet Dim scsTemp As SlicerCache Set wbkTemp = ThisWorkbook Set wshTemp = Worksheets("Datenschnitte") wshTemp.Activate 'vorh. Datenschnitte löschen For Each scsTemp In wbkTemp.SlicerCaches scsTemp.Delete Next 'neue Datenschnitte With wbkTemp .SlicerCaches.Add2(ActiveSheet.ListObjects("Auftragsliste"), "Region").Slicers.Add ActiveSheet, , "Region", _ "Region", 20, 500, 140, 180 .SlicerCaches.Add2(ActiveSheet.ListObjects("Auftragsliste"), "Verkäufer").Slicers.Add ActiveSheet, , "Verkäufer", _ "Verkäufer", 20, 640, 140, 180 .SlicerCaches.Add2(ActiveSheet.ListObjects("Auftragsliste"), "Kunde").Slicers.Add ActiveSheet, , "Kunde", _ "Kunde", 200, 500, 140, 180 .SlicerCaches.Add2(ActiveSheet.ListObjects("Auftragsliste"),

202

|

Datenaufbereitung

_

_

_

_

"Produktkategorie").Slicers.Add _ ActiveSheet, , "Produktkategorie", _ "Produktkategorie", 200, 640, 140, 180 End With Set wbkTemp = Nothing Set wshTemp = Nothing End Sub

Mit einem Klick auf eine Schaltfläche erfolgt die Filterung und das ausgewählte Kriterium wird aus der Liste entfernt, auch in mehreren Datenschnitten. Mit einem nochmaligen Klick wird die Filterung wieder aufgehoben. Auch ein Klick auf das Filtersymbol in der Kopfzeile einer Datenschnitte löscht die Filterung. Das Symbol neben der Filterung in der Kopfzeile steht für eine Mehrfachauswahl. Ein Klick darauf und es können mehrere Schaltflächen in einem Datenschnitt ausgewählt werden. Ein erneuter Klick löscht auch diese Einstellung. Auch Datenschnitte haben ein eigenes Registerblatt Optionen, in dem weitere Einstellungen zur Funktionalität und zum Design vorgenommen werden können.

Bild 4-15. Datentabelle mit Datenschnitte

Eine Tabelle besitzt eine Ergebniszeile, die unter Register Tabellenentwurf in der Auswahl von Tabellenformatoptionen ausgewählt wird. In der Ergebniszeile unter Umsatz wählen wir aus der Auswahliste die SUMME-Funktion aus. In der Befehlsleiste sehen wir, dass es in Wirklichkeit aber die TEILERGEBNIS-Funktion ist. Diese Auswahl kann für jede Spalte in der Ergebniszeile getroffen werden (Bild 4-16).

4.2 Daten filtern

|

203

Bild 4-16. Auswahl der Ergebnisfunktion in der Ergebniszeile

Etwas unschön ist, dass wir nach jeder Filtereinstellung an das Ende der Datentabelle schauen müssen. Wir erstellen daher am Anfang neben der Liste Ergebnisszellen (Bild 4-17) und geben ihnen die Formeln nach Tabelle 4-2.

Bild 4-17. Ausgabe der Ergebnisswerte in eine beliebige Zelle Tabelle 4-2. Formeln Bereich Formel J1

Bereich Formel

=Liste[[#Ergebnisse];[Umsatz]] J2

=Liste[[#Ergebnisse];[Eingang]]

Mit jeder neuen Filterung werden nur die gefilterten Zeilen ausgewertet.

4.3 Pivot-Tabellen Der Name Pivot kommt aus dem Französischen und bedeutet so viel wie Dreh- oder Angelpunkt. Pivot-Tabellen in Excel bieten viele Möglichkeiten, Daten in verschiedener Art darzustellen und auszuwerten, ohne die Quelldaten zu ändern. Dabei lassen sich große Datenmengen auf eine überschaubare Darstellung verdichten. Zur Erstellung von Auswertungen in einer Pivot-Tabelle bietet Excel einen Pivot-Assistenten an. Doch dieser setzt voraus, dass die Form des Ergebnisses bekannt ist. Dabei genügt es, eine beliebige Auswertung zu erstellen, die später meistens sowieso umgestellt wird. Diese Umstellungen lassen sich im Pivot-Schema sehr leicht durchführen, also warum nicht direkt mit dem Pivot-Schema starten?

4.3.1 Das Pivot-Schema Zur Bestimmung von Summen wurden bisher zu einer Liste mit Überschriften und Werten in Zeilen eine leere Zeile hinzugefügt, oder bei Kreuztabellen, die über Überschriften zu Spalten und Zeilen verfügen, eine leere Zeile und Spalte hinzugefügt. Mit der AUTOSUMMEFunktion (Σ) werden dann in diesen leeren Zellen z. B. die Summen gebildet (Bild 4-18).

204

|

Datenaufbereitung

Bild 4-18. Auswertungsschema von Listen und Kreuztabellen

Die Idee zur Pivot-Tabelle war es, die Summe, oder einen anderen Funktionswert, von Spalte und/oder Zeile direkt im Schnittpunkt anzugeben, dem Pivotelement (Bild 4-19).

Bild 4-19. Teilergebnisse in Listen und Kreuztabellen

Ausgehend von einer Liste, die über mehrere Spalten verfügt, wird mit dem Aufruf einer Pivot-Tabelle eine Feldliste erstellt, die alle Überschriften der Liste enthält, die als Feldelemente bezeichnet werden. Die Werte in einer Spalte müssen vom gleichen Datentyp sein, also nur Werte, Texte, Datumswerte, Dezimalwerte etc. Durch Ziehen mit der Maus werden die Felder in das Schema gezogen. Zusätzlich besitzt jedes Feldelement in der PivotTabelle einen Filter, angepasst auf den Datentyp im Feld. Und durch Ziehen von Werten in das Ergebnisfeld werden Summen, Mittelwerte, Maximalwerte etc., je nach Wahl als Ergebnis gebildet (Bild 4-20).

Bild 4-20. Aufruf einer Pivot-Tabelle

4.3 Pivot-Tabellen

|

205

Die Quelldaten sollten am besten in einer Liste mit Überschriften vorliegen. Durch Hinzufügen von neuen Spalten werden diese dann in der Pivot-Tabelle berücksichtigt. Bei der Erstellung einer Pivot-Tabelle wird eine als Cache bezeichnete Momentaufnahme der Daten verwendet, sodass die Quelldaten nicht geändert werden.

4.3.2 Erste Pivot-Tabelle  2-12-04-07_Umsatzliste.xlsm Beginnen wir mit der Erstellung unserer ersten Pivot-Tabelle. Als Quelle dient noch einmal eine Auftragsliste mit dem Namen Liste. Zur Pivot-Tabelle gelangen wir in folgenden Schritten: x x x

Eine beliebige Zelle in der Liste anklicken. Dadurch erkennt Excel den Umfang der Liste (Anzahl Zeilen und Spalten) und markiert sie Unter dem Register Einfügen / Tabellen die Methode PivotTable auswählen Im geöffneten Dialogfenster PivotTable erstellen (Bild 4-21) und die Bestätigungstaste OK anklicken, denn die wichtigste Auswahl Neues Arbeitsblatt ist bereits vorgegeben

Bild 4-21. Aufruf einer Pivot-Tabelle

x x x x

206

|

Im neuen Arbeitsblatt befindet sich am rechten Rand die Feldliste, aber das PivotSchema fehlt noch Auf den Hinweistext rufen wir das Kontextmenü auf und wählen in der Auswahl PivotTable-Optionen Im Dialogfeld PivotTable-Optionen wählen wir unter dem Register Anzeige die Option Klassisches PivotTable-Layout (ermöglicht das Ziehen von Feldern im Raster) Nun erkennen wir im neuen Arbeitsblatt das klassische PivotTable-Schema (Bild 4-22) am linken Rand

Datenaufbereitung

Bild 4-22. Klassisches Pivotschema mit Feldliste

Mit VBA wird alles etwas leichter, so erstellt die Prozedur CreatePivotTabelle (Codeliste 4-12) ebenfalls ein leeres Pivot-Schema mit Feldliste. Codeliste 4-12. Prozedur erstellt zur Tabelle ein Pivot-Schema mit Feldliste Sub CreatePivotTable() Dim wbkBook As Workbook Dim wshData As Worksheet Dim wshPivot As Worksheet Dim pvcTemp As PivotCache Dim pvtTemp As PivotTable Dim sTable As String 'Excel Objekte Set wbkBook = ThisWorkbook Set wshData = wbkBook.Worksheets("Auftragsliste") 'Chache erstellen Set pvcTemp = wbkBook.PivotCaches.Create( _ SourceType:=xlDatabase, SourceData:="Liste") 'Pivot Arbeitsblatt und Pivot Tabelle erstellen Set wshPivot = wbkBook.Worksheets.Add Set pvtTemp = pvcTemp.CreatePivotTable( _ TableDestination:=wshPivot.Cells(4, 1)) pvtTemp.InGridDropZones = True pvtTemp.RowAxisLayout xlTabularRow 'Pivot-Schema sTable = pvtTemp.Name wshPivot.PivotTables(sTable).InGridDropZones = True wshPivot.Cells(4, 2).Select 'Aufräumen Set wbkBook = Nothing Set wshData = Nothing Set pvcTemp = Nothing Set wshPivot = Nothing Set pvtTemp = Nothing End Sub

4.3 Pivot-Tabellen

|

207

Ziehen wir nun mit der Maus das Feld Produkt aus der Feldliste in das Zeilenfeld und das Feld Umsatz in das Ergebnisfeld, welches standardmäßig auf Summe eingestellt ist, dann bekommen wir die erste Auswertung, ähnlich wie bei den Teilergebnissen (Bild 4-23).

Bild 4-23. Die Umsätze der Produktkategorien

Die Werte müssen dann nur noch in Währung formatiert werden, natürlich wieder über das Kontextmenü der markierten Daten und der Auswahl Zellen formatieren. Das Ergebnis zeigt noch einmal deutlich die Aufgabe des Zeilenfeldes. Alle doppelt vorhandenen Begriffe, hier in Produkt, werden zusammengefasst. Dies gilt auch für die Verwendung des Spalten- und Seitenfeldes. Wie die Zuordnung eines Feldes aus der Feldliste ins Zeilenfeld per VBA funktioniert, zeigt die Funktion FieldToRowField (Codeliste 4-13) mit den Parametern Position und Feldname. Die Position hat zunächst den Wert 1, denn es können mehrere Felder dem Zeilenfeld hinzugefügt werden. Codeliste 4-13. Funktion FieldToRowField überträgt ein Feld in das Zeilenfeld Function FieldToRowField(iPos, sName) As Variant Dim pvt As PivotTable Dim pvf As PivotField Dim vReturn As Variant 'neues Datenfeld Set pvt = ActiveSheet.PivotTables(1) Set pvf = pvt.PivotFields(sName) With pvf .Orientation = xlRowField .Position = iPos End With 'aufräumen Set pvt = Nothing Set pvf = Nothing End Function

Die nächste Prozedur (Codeliste 4-14) überträgt ein Feld in das Ergebnisfeld, auch Datenfeld genannt. Codeliste 4-14. Funktion FieldToDataField überträgt ein Feld in das Ergebnisfeld Function FieldToDataField(sName) As Variant Dim pvt As PivotTable Dim pvf As PivotField Dim vReturn As Variant

208

|

Datenaufbereitung

'neues Datenfeld Set pvt = ActiveSheet.PivotTables(1) Set pvf = pvt.PivotFields(sName) vReturn = pvt.AddDataField(pvf, Function:=xlSum) 'aufräumen Set pvt = Nothing Set pvf = Nothing End Function

4.3.3 Mehrfachzuordnung Wertefeld Mit einer Testprozedur (Codeliste 4-15) erzeugen wir eine Pivot-Tabelle, in der sich das Feld Produkt im Zeilenfeld und viermal das Feld Umsatz im Ergebnisfeld (Bild 4-24) befinden. Codeliste 4-15. Testprozedur für eine Pivot-Tabelle mit Umsätzen der Produktkategorien Sub CreateMultipleValues() Dim vReturn As Variant Call CreatePivotTable vReturn = FieldToRowField(1, "Produkt") vReturn = FieldToDataField("Umsatz") vReturn = FieldToDataField("Umsatz") vReturn = FieldToDataField("Umsatz") vReturn = FieldToDataField("Umsatz") End Sub

In Pivot-Tabellen ist es also möglich, ein Feld mehrfach einem Zeilen-, Spalten- und Seitenfeld zuzuweisen.

Bild 4-24. Pivot-Tabelle mit Produktkategorie-Umsätzen

Natürlich wollen wir nicht viermal die gleichen Werte sehen und beginnen mit der Anpassung: x x

In der ersten Wertspalte ändern wir die Überschrift Summe von Umsatz durch Anklicken in der Befehlszeile ab in Umsatzsumme. Die Werte bekommen über das Kontextmenü unter Zellen formatieren das Standardformat Währung. Die zweite Wertspalte bekommt die Überschrift Umsatzanzahl. Um diese zu bestimmen, markieren wir eine Zelle der zweiten Wertspalte und rufen über das Kontextmenü Wertfeldeinstellungen (Bild 4-25) auf.

4.3 Pivot-Tabellen

|

209

Bild 4-25. Dialogfeld zu Wertfeldeinstellungen

x x x

Das Dialogfeld zeigt uns, dass es neben der Funktion Summe für das Ereignisfeld auch noch andere Funktionen gibt und wir wählen daraus Anzahl. Das Ergebnis zeigt uns, aus wie vielen Positionen sich die Umsatzsumme zusammensetzt. Die dritte Wertspalte erhält die Überschrift Umsatzanteil und in den Wertfeldeinstellungen wählen wir zunächst das Register Werte anzeigen als und in der Auswahlliste Werte anzeigen als die Wahl % des Gesamtergebnisses. Die vierte Wertspalte erhält die Überschrift Umsatzanteil GB (GB für Gelenkbolzen) und in den Wertfeldeinstellungen wählen wir zunächst wieder das Register Werte anzeigen als und in der Auswahlliste Werte anzeigen als die Wahl % von. Weiter wählen wir als Basisfeld Produkt und als Basiselement Gelenkbolzen.

Diese Übung hat gezeigt, dass gleiche Werte in einem Wertefeld auf unterschiedliche Weise, ob nun entsprechend formatiert oder durch Funktionswahl in Wertfeldeinstellungen, dargestellt werden können (Bild 4-26).

Bild 4-26. Produktumsätze mit verschiedenen Darstellungsformen

210

|

Datenaufbereitung

4.3.4 Einzelwerte Die Pivot-Tabelle hält noch eine weitere Überraschung bereit. Wir wollen wissen, wie z. B. die Umsatzsumme für die Gelenkbolzen zustande gekommen ist. Dazu genügt ein Doppelklick auf den Wert und Excel erstellt eine neue Tabelle, in der nur die Zeilen aus den Quelldaten zu finden sind, die zur Umsatzsumme beigetragen haben (Bild 4-27).

Bild 4-27. Einzelpositionen von Umsatzanteilen an Gelenkbolzen

Die Ergebniszeile weist die gleichen Summenwerte aus. Nachfolgend noch einmal die Umformung mit VBA (Codeliste 4-16). Codeliste 4-16. Umformung der vier Umsatzspalten Sub UmsatzView() 'Überschrift Range("B4").Value = "Umsatzwerte" With ActiveSheet.PivotTables(1) 'erste Wertspalte With .PivotFields("Summe von Umsatz") .NumberFormat = "#,##0" End With Range("B5") = "Umsatzsumme" 'zweite Wertspalte With .PivotFields("Summe von Umsatz2") .Function = xlCount End With Range("C5") = "Umsatzanzahl" 'dritte Wertspalte With .PivotFields("Summe von Umsatz3") .Calculation = xlPercentOfTotal End With Range("D5") = "Umsatzanteil" 'vierte Wertspalte With .PivotFields("Summe von Umsatz4") .Calculation = xlPercentOf .BaseField = "Produkt" .BaseItem = "Gelenkbolzen" End With Range("E5") = "Umsatzanteil von GB" End With End Sub

4.3.5 Zeilen- und Spaltenfeld Im nächsten Schritt bekommt auch das Spaltenfeld eine Feldzuweisung. Dies kann manuell geschehen, aber mit einer VBA-Funktion (Codeliste 4-17) ist es einfacher.

4.3 Pivot-Tabellen

|

211

Codeliste 4-17. Funktion FieldToColumnField überträgt ein Feld in das Spaltenfeld Function FieldToColumnField(iPos, sName) As Variant Dim pvt As PivotTable Dim pvf As PivotField Dim vReturn As Variant 'neues Datenfeld Set pvt = ActiveSheet.PivotTables(1) Set pvf = pvt.PivotFields(sName) With pvf .Orientation = xlColumnField .Position = iPos End With 'aufräumen Set pvt = Nothing Set pvf = Nothing End Function

Eine neue Testprozedur (Codeliste 4-18) erstellt eine neue Pivot-Tabelle (Bild 4-28).

Bild 4-28. Produktumsätze nach Regionen geordnet Codeliste 4-18. Testprozedur Sub CreateRowColumn() Dim vReturn As Variant Call CreatePivotTable vReturn = FieldToRowField(1, "Produkt") vReturn = FieldToColumnField(1, "Region") vReturn = FieldToDataField("Umsatz") Range("A4") = "Umsatzsummen" Range("B6:F21").NumberFormat = "#,##0" End Sub

4.3.6 Mehrfachzuordnung Zeilenfeld Der Einsatz von Filtern per VBA lässt sich durch Aufzeichnung von Makros leicht erlernen. Im nächsten Schritt wollen wir uns eine Mehrfachbelegung im Zeilenfeld ansehen. Unsere Testprozedur (Codeliste 4-19) nutzt den Positionswert zur Spaltenposition im Zeilenfeld.

212

|

Datenaufbereitung

Codeliste 4-19. Testprozedur Pivot-Tabelle Verkäuferumsätze Sub CreateRegionSales() Dim vReturn As Variant Call CreatePivotTable vReturn = FieldToRowField(1, "Region") vReturn = FieldToRowField(2, "Verkäufer") vReturn = FieldToDataField("Umsatz") Range("A4") = "Umsatzsummen" Range("C6:C30").NumberFormat = "#,##0" End Sub

Das Ergebnis (Bild 4-29) ist zunächst eine Gruppierung der Umsätze nach Regionen und danach nach Verkäufern. Durch diese Doppelbelegung im Zeilenfeld kommt es auch zur Ausgabe eines Teilergebnisses nach Regionen. Über das Kontextmenü können diese aus- oder eingeblendet werden. Aber auch durch Setzen der PivotField-Eigenschaft Subtotals mit VBA.

Bild 4-29. Pivot-Tabelle Verkäuferumsätze (Zeilen ausgeblendet)

Die Testprozedur (Codeliste 4-20) schaltet die Teilergebnisse ein und wieder aus. Codeliste 4-20. Testprozedur zum Ein- und Ausschalten der Teilergebnisse Sub TogglePartResults() Dim pvt As PivotTable Set pvt = ActiveSheet.PivotTables(1) pvt.PivotFields("Region").Subtotals(1) = True MsgBox "Weiter?" pvt.PivotFields("Region").Subtotals(1) = False Set pvt = Nothing End Sub

4.3.7 Zeitliche Gruppierung Neben einer geographischen Gruppierung ist auch oft eine zeitliche Gruppierung von Interesse. Eine Testprozedur (Übungsaufgabe für den Leser) liefert die Verkäuferumsätze bezogen auf den Auftragseingang (Bild 4-30).

4.3 Pivot-Tabellen

|

213

Bild 4-30. Pivot-Tabelle mit Datumswerten (Auszug)

Die Darstellung der Datumswerte lässt sich über das Kontextmenü mit der Methode Gruppierung klassifizieren. Im Dialogfenster wählen wir dazu die Gruppierung nach Jahren. Die standardmäßige Einstellung nach Monaten muss abgewählt werden. Auch hier werden wieder Teilergebnisse zu den Verkäufern angezeigt. Durch Ausblenden der Teilergebnisse über das Kontextmenü wird die Darstellung übersichtlicher (Bild 4-31).

Bild 4-31. Verkäuferumsätze nach Jahren

Noch übersichtlicher wird die Darstellung, wenn wir den Feldnamen Eingang ins Spaltenfeld ziehen (Bild 4-32).

Bild 4-32. Auszug Verkäuferumsätze nach Jahren

Auch ein Spaltenfeld kann mehrere Einteilungen aufnehmen. Wählen wir zum Ergebnis zusätzlich in Gruppierung noch die Quartale aus (hier ist eine Mehrfachwahl möglich), dann werden die Jahre noch in Quartale unterteilt (Bild 4-33).

214

|

Datenaufbereitung

Bild 4-33. Auszug Verkäuferumsätze nach Quartalen

4.3.8 Benutzerdefinierte Gruppierung In einer Pivot-Tabelle sind auch benutzerdefinierte Gruppierungen möglich. Beispiel: x x x x x x x x

Eine Pivot-Tabelle mit den Umsatzdaten der Produkte erstellen Federarten in einer Gruppe zusammenfassen. Dazu markieren wir zuerst die Druckfedern, halten dann die STRG-Taste gedrückt und markieren noch nacheinander die Tellerfedern und die Zugfedern. Danach geben wir die STRG-Taste frei Zu den markierten Zellen rufen wir im Kontextmenü die Methode Gruppieren auf Dadurch bildet sich eine neue Spalte Produkt2 die wir in Produktgruppe umbenennen Die neu entstandene Gruppe1 bekommt den Namen Federn Gruppe Zahnräder mit Kegelräder, Stirnräder und Zahnräder erstellen Gruppe Antrieb mit Gleitlager, Kettenglieder, Kupplungen und Wälzlager erstellen Der Rest gehört zur neuen Gruppe Elemente.

Die neue Spalte Produktgruppe im Zeilenfeld steht damit auch in der Feldliste. Jede Produktgruppe erhält auch ein Teilergebnis (Bild 4-34), das sich auch ausblenden lässt.

Bild 4-34. Benutzerdefinierte Gruppe

4.3.9 Seitenfeld nutzen Die nächste Pivot-Tabelle bringt auch das Seitenfeld ins Spiel. Die Prozedur FieldToPageField (Codeliste 4-21) ist uns dabei behilflich.

4.3 Pivot-Tabellen

|

215

Codeliste 4-21. Funktion FieldToPageField überträgt ein Feld in das Seitenfeld Function FieldToPageField(iPos, sName) As Variant Dim pvt As PivotTable Dim pvf As PivotField Dim vReturn As Variant 'neues Datenfeld Set pvt = ActiveSheet.PivotTables(1) Set pvf = pvt.PivotFields(sName) With pvf .Orientation = xlPageField .Position = iPos End With 'aufräumen Set pvt = Nothing Set pvf = Nothing End Function

Die neue Pivot-Tabelle (Bild 4-35) erhält folgende Feldzuweisungen: x x x x x

Produkt ins Zeilenfeld Eingang (Jahre) ins Spaltenfeld Umsatz ins Ergebnisfeld Region ins Seitenfeld Kunde ins Seitenfeld

Bild 4-35. Auszug Pivot-Tabelle mit Feldern im Seitenfeld

In dieser Pivot-Tabelle lassen sich die Umsätze von Produktkategorien nach Jahr, Kunde (auch mehrere) und Region (auch mehrere) filtern.

4.3.10 Bereichsnamen einsetzen In Pivot-Tabellen lassen sich auch neue Felder aus vorhandenen berechnen. Der Editor dazu ist so umständlich, dass ich den Bereichsnamen den Vorzug gebe. Dazu folgende Aufgabe: Einem Controller liegen die Umsätze der Produkte der letzten Periode vor. Ebenso zu jedem Produkt eine Prognose zur Umsatzänderung in Prozent für die nächste Periode. Er soll nun bestimmen, welche Umsätze einschließlich Gesamtumsatz zu erwarten sind.

216

|

Datenaufbereitung

x

Er erstellt eine Pivot-Tabelle der Umsätze und trägt dazu die Prognosen ein (Bild 4-36).

Bild 4-36. Umsatzprognosen für die nächste Periode

x x x x

Dann markiert er Umsätze und Prognosen ohne Summe, aber mit den Überschriften, hier der Bereich B5:C20. Unter dem Register Formeln in der Gruppe Definierte Namen wählt er Aus Auswahl erstellen. Damit besitzen die Umsätze den Bereichsnamen Ergebnis und die Prognosewerte den Bereichsnamen Prognosen, mit denen er nun rechnen kann. In der Zelle D6 schreibt er die Formel =Ergebnis*(1+Prognosen), die einen Überlauf erzeugt. Im letzten Schritt formatiert er das Ergebnis (Bild 4-37), benennt die Spalte und bildet die Summe.

Bild 4-37. Umsatzprognose

4.3 Pivot-Tabellen

|

217

Der Aufruf des Kontextmenüs auf dem Registerauswahlfeld (links am Rand neben den Arbeitsblatt-Registern) zeigt (Bild 4-38), dass wir schon einige Pivot-Tabellen erstellt haben. Mit einem Doppelklick auf ein Listenelement wird auch das entsprechende Arbeitsblatt gewählt.

Bild 4-38. Auswahlliste Arbeitsblätter

4.3.11 Datenschnitt und Zeitachse Auch in einer Pivot-Tabelle ist der Einsatz von Datenschnitten möglich. Hier besteht sogar die Möglichkeit, Feldelemente, die nicht in der Tabelle verwendet werden, als Datenschnitt mit einzubringen. Unter Register PivotTable-Analyse / Filtern wird die Methode Datenschnitt einfügen aufgerufen. Die gleichnamige Eingabemaske zeigt alle Feldelemente als Option (Bild 4-39).

Bild 4-39. Auswahl der Feldelemente für einen Datenschnitt

Für zeitbasierte Feldelemente gibt es im gleichen Register ein weiteres Filterelement, die Zeitachse. Mit dem Aufruf zeigt Excel die Feldelemente, die in Frage kommen, hier das Feld Eingang (Bild 4-40).

218

|

Datenaufbereitung

Bild 4-40. Auswahl zeitbasierter Feldelemente für eine Zeitachse

Über die Methode Filterverbindungen lassen sich die einzelnen Filterelemente verbinden (Bild 4-41).

Bild 4-41. Filterverbindungen

In der Zeitachse gibt es zusätzlich die Auswahl für unterschiedliche Zeiträume. Durch Anfassen des Balkens mit der Maus lässt sich der Bereich verschieben oder die Balkenenden verändern. Die Anordnung der Filterelemente sollte übersichtlich sein (Bild 4-42).

Bild 4-42. Einsatz der Filterelemente

4.3 Pivot-Tabellen

|

219

4.3.12 Konsolidieren in der Pivot-Tabelle Die Zusammenführung von mehreren Arbeitsblättern in eine Pivot-Tabelle wird durch den PivotTable-Assistenten gesteuert. Vor seiner Nutzung muss er durch Zuweisung der Symbolleiste hinzugefügt werden (Bild 4-43).

Bild 4-43. Hinzufügen des PivotTable-Assistenten

 2-12-04-08_Konsolidieren.xlsm Die Anwendung des Assistenten erfolgt in drei Schritten (Bild 4-44).

Bild 4-44. Schritt 1 – Mehrere Konsolidierungsbereiche

In Schritt 2 wird eine einfache Seitenfelderstellung gewählt (Bild 4-45)

Bild 4-45. Schritt 2 - Seitenfelderstellung

220

|

Datenaufbereitung

Nach der Bestätigung erscheint das Dialogfenster Schritt 2b (Bild 4-46). Darin werden die Verweise erfasst.

Bild 4-46. Schritt 2b – Verweise zur Konsolidierung sammeln

Mit Weiter erscheint eine letzte Eingabemaske, die den Ausgabebereich festlegt. In unserem Fall ein neues Arbeitsblatt (Bild 4-47).

Bild 4-47. Schritt 3- Speicherort bestimmen

Mit Fertig stellen erscheint die Pivot-Tabelle (Bild 4-48).

Bild 4-48. Konsolidierte Daten als Pivot-Tabelle

4.3 Pivot-Tabellen

|

221

Die folgende Prozedur erzeugt eine Pivot-Tabelle mit konsolidierten Daten. Codeliste 4-22. Prozedur erstellt ein Fächerdiagramm mit den Beispieldaten Sub PivotKonsolidiert() Dim wbkTemp As Workbook Dim wshTemp As Worksheet Set wbkTemp = ActiveWorkbook wbkTemp.PivotCaches.Create( _ SourceType:=xlConsolidation, _ SourceData:=Array(Array("Werk1", "Element1"), _ Array("Werk2", "Element2"), _ Array("Werk3", "Element3")), _ Version:=7).CreatePivotTable _ TableDestination:="", _ TableName:="UmsatzSummen", _ DefaultVersion:=7 Set wshTemp = wbkTemp.ActiveSheet With wshTemp .Range("A3") = "Umsatzsummen" .Range("B3") = "Monate" .Columns("B:B").EntireColumn.AutoFit .Range("B5:E40").NumberFormat = "#,##0" .Cells.Font.Name = "Calibri" .Cells.Font.Size = 11 End With Set wshTemp = Nothing Set wbkTemp = Nothing End Sub

4.4 Pivot-Diagramme Zu den Pivot-Tabellen gehören natürlich auch die PivotCharts, auch wenn sie so gut wie nie direkt aufgerufen werden. Viel einfacher ist es, die Daten in einer Pivot-Tabelle zu markieren und dann das gewünschte Diagramm über die Registerkarte Einfügen aus der Gruppe der Diagramme auszuwählen. Auch Bereichsnamen sind hier sehr hilfreich.  2-12-04-09_PivotCharts.xlsm

4.4.1 Fächerdiagramm Der Vorteil, ein Diagramm aus einer Pivot-Tabelle zu generieren ist, dass die Filter mit übernommen werden, sodass eine Auswahl auch im nachherein möglich ist. Als Vorlage dient noch einmal die Auftragsliste, aus der wir eine Pivot-Tabelle über die ProduktkategorieUmsätze erstellen und danach die Zuweisungen und Auswertungen vornehmen. Tabelle 4-3. Bereichsnamen und Formeln zur Pivot-Tabelle Produktumsätze Bereich Name

Bereich Name

Formel

A5:A19 Produkte C4

=Anteil

B5:B19 Umsatz

C5:C19 Anteil

=Umsatz/Gesamt

B20

C20

=SUMME(Anteil)

Gesamt

C5:C20 Anteile

Daraus entsteht die Pivot-Tabelle mit den berechneten Anteilen (Bild 4-49).

222

|

Datenaufbereitung

Bild 4-49. Produktumsätze und Anteile

Ein Fächerdiagramm (Bild 4-50) wird aus einem Kreisdiagramm wie folgt abgeleitet: x x x x x x x x

Der Trick zu diesem Diagramm besteht darin, dass wir zu den einzelnen Anteilen auch die 100 % dazunehmen und den Bereich C5:C20 markieren und Anteile benennen Dann wählen wir unter Register Einfügen in der Gruppe Diagramme das 2DKreisdiagramm Im Kontextmenü auf der Datenreihe wählen wir Datenreihen formatieren Unter Reihenoptionen stellen wir den Winkel des ersten Segments auf 270 Grad Danach klicken wir zweimal auf das Datensegment 100 %, sodass nur dies markiert ist Im Kontextmenü von Datenpunkt formatieren wählen wir unter Füllung nicht sichtbar Im Register Entwurf des Diagramms in der Gruppe Diagrammlayouts unter Diagrammelement hinzufügen wählen wir für die Legende die rechte Position Hier werden noch weitere Anpassungen durchgeführt, ebenso im Kontextmenü zu den einzelnen Diagramm-Objekten.

Bild 4-50. Produktanteile als Fächerdiagramm

4.4 Pivot-Diagramme

|

223

Codeliste 4-23. Prozedur erstellt ein Fächerdiagramm mit den Beispieldaten Sub CreateFächerdiagramm() Dim wbkTemp As Workbook Dim wshTemp As Worksheet Dim rngDaten As Range Dim shpTemp As Shape Dim chrTemp As Chart 'Excel Objekte instanziieren Set wbkTemp = ThisWorkbook Set wshTemp = wbkTemp.ActiveSheet wshTemp.DrawingObjects.Delete 'Dias löschen Set rngDaten = wshTemp.Range("Anteile") 'Kreisdiagramm erstellen Set shpTemp = wshTemp.Shapes.AddChart2(251, xlPie) Set chrTemp = shpTemp.Chart With chrTemp .SetSourceData Source:=rngDaten .ChartGroups(1).FirstSliceAngle = 270 'Drehung .FullSeriesCollection(1).Points(16).Format.Fill.Visible = _ msoFalse 'wird unsichtbar .FullSeriesCollection(1).ApplyDataLabels 'Datenbeschriftung 'Beschriftung 100 % löschen .FullSeriesCollection(1).Points(16).DataLabel.Delete 'Beschriftung mit Produktnamen .FullSeriesCollection(1).XValues = Range("Produkte") 'Legende anpassen .SetElement (msoElementLegendRight) .Legend.Top = 1.9 .Legend.Height = 248 .Legend.Width = 106 'Diagrammtitel .HasTitle = True .ChartTitle.Text = "Produktumsätze" .ChartTitle.Format.TextFrame2.TextRange.Font.Size = 16 End With 'aufräumen Set shpTemp Set chrTemp Set wbkTemp Set wshTemp End Sub

= = = =

Nothing Nothing Nothing Nothing

4.4.2 Cockpit-Tachometer Das Tachometer entsteht nach dem gleichen Trick wie das Fächerdiagramm, verwendet wird diesmal aber ein Kreisringdiagramm. Die manuelle Erstellung ist sehr aufwendig, sodass wir dazu eine Prozedur in mehreren Schritten entwickeln. Ein Hilfsfeld (Bild 4-51) sorgt für eine gleichmäßige Einteilung der Skala.

224

|

Datenaufbereitung

Bild 4-51. Hilfsfeld zur Skala

Der Bereich E5:E15 erhält den Bereichsnamen Teilung. Wie vorher blenden wir den 100Anteil wieder aus. Die Prozedur Skala (Codeliste 4-24) ist ausreichend kommentiert. Codeliste 4-24. Prozedur erstellt eine Skala Sub Skala() Dim wbkTemp Dim wshTemp Dim rngDaten Dim shpTemp Dim chrTemp 'Excel Set Set Set

As As As As As

Workbook Worksheet Range Shape Chart

Objekte instanziieren wbkTemp = ThisWorkbook wshTemp = wbkTemp.ActiveSheet rngDaten = wshTemp.Range("E5:E15")

'Kreisdiagramm erstellen Set shpTemp = wshTemp.Shapes.AddChart2(251, xlDoughnut) Set chrTemp = shpTemp.Chart With chrTemp .SetSourceData Source:=rngDaten .ChartGroups(1).FirstSliceAngle = 270 'drehen .ChartGroups(1).DoughnutHoleSize = 50 'Innenring .ChartTitle.Delete 'Titel löschen .Legend.Delete 'Legende löschen 'Anteil 100 ausblenden With .FullSeriesCollection(1).Points(11) .Format.Line.Visible = msoFalse .Format.Fill.Visible = msoFalse End With 'Farbzuordnung With .FullSeriesCollection(1) .Points(1).Format.Fill.ForeColor.RGB = RGB(220, 0, 0) .Points(2).Format.Fill.ForeColor.RGB = RGB(255, 0, 0) .Points(3).Format.Fill.ForeColor.RGB = RGB(255, 80, 0) .Points(4).Format.Fill.ForeColor.RGB = RGB(255, 180, 0) .Points(5).Format.Fill.ForeColor.RGB = RGB(255, 255, 0) .Points(6).Format.Fill.ForeColor.RGB = RGB(255, 255, 80) .Points(7).Format.Fill.ForeColor.RGB = RGB(180, 255, 180) .Points(8).Format.Fill.ForeColor.RGB = RGB(130, 240, 70) .Points(9).Format.Fill.ForeColor.RGB = RGB(100, 225, 40) .Points(10).Format.Fill.ForeColor.RGB = RGB(0, 190, 0) End With

4.4 Pivot-Diagramme

|

225

End With 'Position With shpTemp .Top = 130 .Left = 360 .Height = 250 .Width = 250 End With 'aufräumen Set shpTemp Set chrTemp Set wbkTemp Set wshTemp End Sub

= = = =

Nothing Nothing Nothing Nothing

Damit ist die Skala des Tachometers (Bild 4-52) erstellt. Wer mag, kann die Farbwerte verändern. Das gilt auch für die Abmessungen.

Bild 4-52. Kreisringdiagramm als Skala zum Tachometer

Das nächste Diagramm soll den Zeiger zum Tacho wiedergeben. Auch dazu benötigen wir ein Hilfsfeld (Bild 4-53).

Bild 4-53. Hilfsfeld zum Zeiger

Die Zelle H5 dient zur Eingabe des Wertes, den der Zeiger darstellen soll. Das ActiveXSteuerelement Scrollleiste wird über die Eigenschaft LinkedCell mit der Zelle H5 verbunden. Weitere Eigenschaftswerte sind Max = 100, Min = 0 und SmallChange = 1. Tabelle 4-4. Formeln zum Hilfsfeld-Zeiger Bereich Formel

Bemerkung

H7

=100-H5

Die Formel sorgt dafür, dass in H8 immer 100 stehen.

H8

=SUMME(H5:H7)

Der Trick hierbei ist, dass der Bereich H5:H8 in einem Kreisdiagramm dargestellt wird und dann bis auf den Anteil 0,001 alle anderen ausgeblendet werden. Dadurch erhalten wir eine dünne Linie, den Zeiger. Die Prozedur Zeiger (Codeliste 4-25) ist ebenfalls ausreichend kommentiert.

226

|

Datenaufbereitung

Codeliste 4-25. Prozedur erstellt eine Skala Sub Zeiger() Dim wbkTemp Dim wshTemp Dim rngDaten Dim shpTemp Dim chrTemp 'Excel Set Set Set

As As As As As

Workbook Worksheet Range Shape Chart

Objekte instanziieren wbkTemp = ThisWorkbook wshTemp = wbkTemp.ActiveSheet rngDaten = wshTemp.Range("H5:H8")

'Kreisdiagramm erstellen Set shpTemp = wshTemp.Shapes.AddChart2(251, xlPie) Set chrTemp = shpTemp.Chart With chrTemp .SetSourceData Source:=rngDaten .ChartGroups(1).FirstSliceAngle = 270 'Drehung 'Formatvorlage 10 .ClearToMatchStyle .ChartStyle = 260 .ChartTitle.Delete 'Titel löschen 'Datenbeschriftun löschen .FullSeriesCollection(1).DataLabels.Delete .ChartArea.Format.Fill.Visible = msoFalse '1. Datenelement ausblenden With .FullSeriesCollection(1).Points(1) .Format.Fill.Visible = msoFalse .Format.Line.Visible = msoFalse End With '2. Datenelement färben .FullSeriesCollection(1).Points(2) _ .Format.Fill.ForeColor.RGB = RGB(255, 0, 0) '3. Datenelement ausblenden With .FullSeriesCollection(1).Points(3) .Format.Fill.Visible = msoFalse .Format.Line.Visible = msoFalse End With '4. Datenelement ausblenden With .FullSeriesCollection(1).Points(4) .Format.Fill.Visible = msoFalse .Format.Line.Visible = msoFalse End With End With 'Position und Größe sorgt für eine Überlagerung 'mit der Skala With shpTemp .Top = 130 .Left = 360 .Height = 250 .Width = 250 End With 'Drehpunkt wshTemp.Shapes.AddShape(msoShapeOval, 480, 250, 10, 10).Select With Selection.ShapeRange.Fill .Visible = msoTrue .ForeColor.RGB = RGB(0, 112, 192) End With

4.4 Pivot-Diagramme

|

227

'aufräumen Set shpTemp Set chrTemp Set wbkTemp Set wshTemp End Sub

= = = =

Nothing Nothing Nothing Nothing

Die Ausführung beider Prozeduren ergibt zwei sich überlagernde Diagramme (Bild 4-54). Veränderungen in Zelle H5 werden direkt vom Zeiger wiedergegeben.

Bild 4-54. Tachometer aus zwei Kreisdiagrammen

Kommen wir nun zur eigentlichen Anwendung. Aus der Auftragsliste erstellen wir eine PivotTabelle mit zweimal den Umsatz im Wertefeld für die Produkte. Die zweite Umsatzspalte stellen wir über Wertfeldeinstellungen um auf % von Gelenkbolzen (Bild 4-55). Mithilfe der Hilfsfelder erstellen wir erneut ein Tachometer.

Bild 4-55. Pivot-Tabelle mit Hilfsfeldern Tabelle 4-5. Bereichsnamen und Formeln zum Beispiel Bereich Name

Formel Bemerkung

A5:C19 Matrix

Basis für einen SVERWEIS

I4

Suchfeld für Matrix

Produkt

I5

=H5

Benutzerdefinierte Formatierung: 0,0“ %“

Unterhalb des Tachometers erstellen wir ein ActiveX-Steuerelement des Typs Kombinationsfeld. Es bekommt folgende Eigenschaftswerte:

228

|

Datenaufbereitung

x x x x x

Name: cbbProdukt LinkedCell: Produkt ListFillRange: Matrix Font: Calibri / 12 SpecialEffect: 0 - fmSpecialEffectFlat

Noch im Entwurfsmodus rufen wir mit einem Doppelklick auf das Steuerelement das Codefeld das aktiven Arbeitsblattes Tachometer2 auf und finden dort die Ereignisprozedur cbbProdukt_Change, die immer dann aufgerufen wird, wenn sich der Text im Kombinationsfeld ändert. Diese Prozedur (Codeliste 4-26) füllen wir nun mit Leben. Codeliste 4-26. Ereignisprozedur im Worksheet Tachometer2 Private Sub cbbProdukt_Change() Range("Produkt") = cbbProdukt.Text Range("H5") = Evaluate("=VLookup(Produkt,Matrix, 3)*100") End Sub

Die Prozedur schreibt zunächst den Text aus dem Kombinationsfeld in die Zelle Produkt. Danach sucht sie mittels der SVERWEIS-Funktion das Produkt in der Matrix und schreibt den gefundenen Wert aus der dritten Spalte in das Zeigerfeld H5, der ja als Vorgabe für den Zeiger dient. Design und Funktionalität dieses Beispiels können beliebig verändert werden. Mit diesem Beispiel sind wir ein wenig vom Thema PivotChart abgekommen.

4.4.3 Treemap Der Diagrammtyp Treemap eignet sich zur Darstellung von Proportionen innerhalb einer Hierarchie durch Rechtecke. Nach der Auswahl der Daten in der Pivot-Tabelle und dem anschließenden Einfügeversuch eines Treemap wird eine Fehlermeldung (Bild 4-56) ausgegeben, wie bei einigen anderen Diagrammen auch.

Bild 4-56. Fehlermeldung beim Einfügen eines Treemap-Diagramms

Das Problem lässt sich durch eine VBA-Prozedur (Codeliste 4-27) leicht umgehen. Codeliste 4-27. Prozedur erstellt ein Treemap Sub CreateTreeMap() Dim wbkTemp As Workbook Dim wshTemp As Worksheet Dim shpTemp As Shape Dim chrTemp As Chart 'Excel Objekte instanziieren Set wbkTemp = ThisWorkbook Set wshTemp = wbkTemp.ActiveSheet 'Kreisdiagramm erstellen wshTemp.Range("A5:B24").Select Set shpTemp = wshTemp.Shapes.AddChart2(410, xlTreemap) Set chrTemp = shpTemp.Chart

4.4 Pivot-Diagramme

|

229

With chrTemp .Legend.Position = xlRight .HasTitle = True .ChartTitle.Text = "Verkäuferumsätze" End With 'Position und Größe With shpTemp .Top = 20 .Left = 200 .Height = 450 .Width = 300 End With 'aufräumen Set shpTemp = Nothing Set chrTemp = Nothing Set wbkTemp = Nothing Set wshTemp = Nothing End Sub

Die Prozedur CreateTreeMap erstellt ein Treemap-Diagramm (Bild 4-57).

Bild 4-57. Treemap-Diagramm zum Verkäuferumsatz (Diagramm geteilt)

4.4.4 3D-Oberfläche Dieser Diagrammtyp eignet sich besonders gut dazu, die Abhängigkeit von zwei Parametern zu visualisieren. Ein zweidimensionales Spannungsfeld liegt in einer Pivot-Tabelle dann vor, wenn Zeilen- und Spaltenfeld besetzt sind. Als Beispiel verwenden wir noch einmal die Auftragsliste und erstellen daraus eine PivotTabelle der Umsätze, von Produkten im Zeilenfeld und Regionen im Spaltenfeld. Codeliste 4-28. Prozedur erstellt ein Oberflächendiagramm Sub CreateSurface() Dim wbkTemp As Workbook Dim wshTemp As Worksheet Dim shpTemp As Shape Dim chrTemp As Chart 'Excel Objekte instanziieren Set wbkTemp = ThisWorkbook

230

|

Datenaufbereitung

Set wshTemp = wbkTemp.ActiveSheet 'Diagramm erstellen Range("A5:E19").Select Set shpTemp = wshTemp.Shapes.AddChart2(307, xlSurface) Set chrTemp = shpTemp.Chart With chrTemp .HasTitle = True .ChartTitle.Text = "Umsätze Produkt / Region" End With 'aufräumen Set shpTemp = Nothing Set chrTemp = Nothing Set wbkTemp = Nothing Set wshTemp = Nothing End Sub

Die Prozedur CreateSurface erstellt ein Oberflächendiagramm in der Umsatzliste (Bild 4-58).

Bild 4-58. Pivot-Tabelle mit Oberflächendiagramm

4.4.5 Netz Dieser Diagrammtyp eignet sich gut zur Bewertung von Merkmalen für festgelegte Kriterien, wie in diesem Fall die Umsätze in Regionen. Als Beispiel verwenden wir noch einmal die Auftragsliste und erstellen daraus eine Pivot-Tabelle der Umsätze, von Produkten im Zeilenfeld und Regionen im Spaltenfeld. Codeliste 4-29. Prozedur erstellt ein Netzdiagramm Sub CreateRadar() Dim wbkTemp Dim wshTemp Dim shpTemp Dim chrTemp

As As As As

Workbook Worksheet Shape Chart

'Excel Objekte instanziieren Set wbkTemp = ThisWorkbook Set wshTemp = wbkTemp.ActiveSheet

4.4 Pivot-Diagramme

|

231

'Diagramm erstellen Range("A5:E19").Select Set shpTemp = wshTemp.Shapes.AddChart2(317, xlRadar) Set chrTemp = shpTemp.Chart With chrTemp .HasTitle = True .ChartTitle.Text = "Umsätze Produkt / Region" End With Set shpTemp = Nothing Set chrTemp = Nothing Set wbkTemp = Nothing Set wshTemp = Nothing End Sub

Die Prozedur CreateRadar erstellt ein Netzdiagramm in der Umsatzliste (Bild 4-59).

Bild 4-59. Umsatzanteile im Netzdiagramm

232

|

Datenaufbereitung

KAPITEL 5

Datenmodelle

Datenmodelle bilden die Grundlage einer modellbasierten Entwicklung. Darin werden Prozesse der realen Welt mit Objekten abgebildet, um sie in objektorientierten Prozeduren zu nutzen. In diesen Modellen werden nur die Eigenschaften und Methoden der Objekte beschrieben, die zur Lösung unseres Projekts erforderlich sind. Betrachten wir ein Datenmodell in der realen Welt. Eine Person kommt in ein Krankenhaus und zur Verwaltung ihres Aufenthalts wird das Modell Patient genutzt. Darin sind alle Daten enthalten, die für den Krankenhausaufenthalt notwendig sind. Die Krankengeschichte (Anamnese), Name und Wohnort, Behandlungsdaten, Abrechnungsdaten und vieles mehr. Im Modell Patient sind nicht enthalten, welche Vorlieben die Person hat, welchen Hobbys sie nachgeht, wer zu ihrem Bekanntenkreis gehört, ihren Lebenslauf und so weiter. Es würde wahrscheinlich jeden Datenspeicher sprengen, wollte man alle ihre Daten erfassen wollen. Das Modell Patient ist eben nur eine Teilmenge des realen Objekts Person und die reicht für den Zweck der Behandlung vollkommen aus. Zu diesem Datenmodell gehören auch die Behandlungsdaten, die Ernährungsdaten, die Abrechnungsdaten etc. Nicht dazu gehören Informationen, wie sie sich die Zeit vertreibt, welche Bücher sie liest, wer sie besucht und vieles mehr.

5.1 Beziehungen Bereits im ersten Kapitel wird der Begriff Objekt eingeführt, mit Eigenschaften und Methoden. Es werden die wichtigsten Excel-Objekte und ihre Anwendungen beschrieben. Ein entscheidender Schritt in Richtung Datenmodell ist die Definition eigener Objekte. Mit ihnen lässt sich die reale Welt abbilden. Es fehlt nur noch ein entscheidendes Element, die Beziehung von Objekten untereinander. Dieses Modell bildet dann die Basis für relationale Datenbanken.

5.1.1 Relationen Eine Relation ist in der Datenbanksprache eine Tabelle mit Spalten und Zeilen, die Informationen zu bestimmten Objekten beinhalten. In einem relationalen Datenbankdesign muss es für jedes Objekt eine Relation (Tabelle) geben. Eine Relation bezieht sicht nicht auf die Beziehung zwischen den Tabellen (Bild 5-1).

© Springer Fachmedien Wiesbaden GmbH, ein Teil von Springer Nature 2023 H. Nahrstedt, Excel + VBA für Controller, https://doi.org/10.1007/978-3-658-43157-0_5

Bild 5-1. Schema einer Relation (Tabelle)

Zu einer Relation gehören folgende Begrifflichkeiten. Bezeichnung

Beschreibung

Attribute (Eigenschaften)

Die jeweils zu einem Objekt vorhandenen Informationen werden Attributen (Eigenschaften) zugeordnet. Ein Attribut besitzt einen Namen und einen Wert.

Tupel (Datensatz)

Die Tupel stellen in der Tabelle Zeilen dar und sind somit eine Menge von Attributen. Man spricht von einem Datensatz.

Domäne (Wertebereich)

Eine Domäne beschreibt den zulässigen Wertebereich eines Attributs.

Primärschlüssel

Das Relationsmodell fordert eine eindeutige Identifizierung eines Datensatzes. Liegen keine eindeutigen Attribute vor, muss ein zusätzliches Attribut definiert werden. Dieses Attribut wird als Primärschlüssel bezeichnet. Eine Tabelle kann nur einen Primärschlüssel haben und wird nach diesem sortiert.

Sekundärschlüssel

Ein Sekundärschlüssel erlaubt die Suche nach einem anderen Kriterium, wenn eine Sortierung umständlich und zeitraubend ist.

Fremdschlüssel

Ein Fremdschlüssel in einem Feld der Tabelle stellt eine Beziehung zu einem Schlüssel (primär oder sekundär) einer anderen Tabelle her.

In einer relationalen Datenbank werden die Sachverhalte tabellarisch dargestellt. Mit einem ERM können die notwendigen Tabellen abgeleitet werden. Eine Tabelle (Relation) ist gekennzeichnet durch: x x x x x

einen eindeutigen Namen mehrere Spalten (Attribute) keine bis beliebig viele Tabellenzeilen (Tupel) einen einzigen Wert je Feld (Attribut) einen Primärschlüssel, bestehend aus einem oder mehreren Datenfeldern, die jeden Datensatz eindeutig identifizieren und dessen Wert sich während der Existenz des Datensatzes nicht ändert

5.1.2 Entity-Relationship-Model Im Rahmen einer semantischen Datenmodellierung wird gerne das Entity-Relationship-Model (kurz ERM) genutzt. Darin werden die realen Objekte als Entitäten bezeichnet und eine Beziehung (Relationship) zwischen Entitäten durch eine Verbindungslinie dargestellt.

234

|

Datenmodelle

Zwischen mindestens zwei Tabellen können in Excel Beziehungen definiert werden, wenn jede Tabelle eine Spalte aufweist, die einer Spalte in einer anderen Tabelle zugeordnet werden kann (Fremdschlüssel – Primärschlüssel). Als Beispiel ist eine Arbeitsmappe Produktionsdaten gegeben.  2-12-05-01_Produktionsdaten.xlsm Auf zwei Arbeitsblättern befinden sich die Tabellen Produktion und Maschinen. In der Tabelle Produktion ist aufgeführt, welcher Zeitaufwand nötig war, um die Bauteile eines Produkts mit der angegebenen Anzahl herzustellen. Die Zeitangaben beziehen sich auf eine Person mit dem aufgeführten Stundenlohn. Die Person bedient dazu in der Zeit eine Maschine, deren Nummer ebenfalls angegeben ist. In der Tabelle Maschinen wird neben der Maschinennummer auch der Stundensatz der Maschine aufgeführt. Eine Beziehung zwischen Tabellen lässt sich grafisch in einem Entity-Relationship-Model (kurz ERM) darstellen (Bild 5-2).

Bild 5-2. ERM einer 1:n Beziehung

Die Tabellen Maschinen und Produktion werden als Entitäten bezeichnet und die zugeordneten Elemente (Anzahl, Std., Lohn etc.) als Attribute. Diese besitzen Wertebereiche, die als Domäne bezeichnet werden. Unterstrichene Attribute werden als Schlüssel gekennzeichnet. Ich verwende gerne eine eigene Kurzform für das ERM (Bild 5-3), schon wegen der einfachen Grafik.

Bild 5-3. Vereinfachtes ERM mit einer 1:n Beziehung

Beziehungen werden durch Rauten dargestellt und die Beziehung im Beispiel liest sich: Eine Maschine wird in mehreren (n) Produktionen eingesetzt. Man spricht von einer 1:n Beziehung. Um eine 1:n-Beziehung zu definieren, muss eine Tabelle einen Primärschlüssel besitzen. Das bedeutet, dass jeder Wert in der relevanten Spalte für den Primärschlüssel nur einmal existiert. In der verbundenen Tabelle wird dieser als Fremdschlüssel bezeichnet und darf beliebig oft vorkommen. So besitzt die Tabelle Maschinen den Primärschlüssel MNr und die Tabelle

5.1 Beziehungen

|

235

Produktion den entsprechenden Fremdschlüssel MNr. Die Namen müssen nicht zwangsläufig übereinstimmen. Unter Register Daten / Datentools wird die Methode Beziehungen aufgerufen. Im Dialogfenster Beziehungen verwalten gibt es noch keinen Eintrag. Mit der Schaltfläche Neu wird eine Maske zur Definition einer Beziehung gestartet (Bild 5-4).

Bild 5-4. Definition einer Beziehung zwischen den Tabellen über die Maschinennummer

Zuerst wird die Tabelle mit dem Fremdschlüssel und dann die mit dem Primärschlüssel genannt. Excel prüft die Reihenfolge der Tabelleneingabe und vertauscht notfalls die Reihenfolge. Danach kann in einem neuen Blatt Kosten die Berechnung der Lohnkosten, Maschinenkosten, Gesamtkosten etc. erfolgen (Bild 5-5).

Bild 5-5. Kostenrechnung auf der Basis der definierten Beziehung (Auszug) Tabelle 4-6. Bereichsnamen und Formeln zum Beispiel Bereich Formel A2

=Produktion[Produkt]:Produktion[Lohn]

F2

=XVERWEIS(Produktion[MNr];Maschinen[MNr];Maschinen[Satz])

G2

=Produktion[Std]*Produktion[Lohn]

H2

=Produktion[Std]*F2#

I2

=G2#+H2#

J2

=I2#/Produktion[Anzahl]

236

|

Datenmodelle

Die folgende Prozedur CreateModelRelationShip erstellt die beschriebene Beziehung und die Prozedur ReadModelRelationships zeigt alle vorhandenen Beziehungen im Direktfenster. Codeliste 5-1. ModelRelationship Prozeduren Sub CreateModelRelationship() Dim wbkTemp As Workbook Dim relTemp As ModelRelationship Set wbkTemp = ActiveWorkbook With wbkTemp .Model.ModelRelationships.Add _ ActiveWorkbook.Model.ModelTables( _ "Produktion").ModelTableColumns("MNr"), _ ActiveWorkbook.Model.ModelTables( _ "Maschinen").ModelTableColumns("MNr") End With Set relTemp = Nothing Set wbkTemp = Nothing End Sub Sub ReadModelRelationships() Dim wbkTemp As Workbook Dim relTemp As ModelRelationship Set wbkTemp = ActiveWorkbook For Each relTemp In wbkTemp.Model.ModelRelationships With relTemp Debug.Print "Aktiv: "; .Active, Debug.Print .ForeignKeyTable.Name, .ForeignKeyColumn.Name, _ .PrimaryKeyTable.Name, .PrimaryKeyColumn.Name End With Next Set wbkTemp = Nothing End Sub

5.1.3 Beziehungen in der Pivot-Tabelle Die andere Möglichkeit, mithilfe einer Beziehung die Daten aufzubereiten, ist die Verwendung einer Pivot-Tabelle. Die Ausgangsdaten sind noch einmal die beiden Tabellen Produktion und Maschinen.  2-12-05-02_Produktionsdaten.xlsm Wieder wird, wie zuvor beschrieben, eine Beziehung über die Maschinennummer erstellt. Wird aus einer der beiden Tabellen eine Pivot-Tabelle aufgerufen, dann muss im Dialogfeld PivotTable erstellen die Option Dem Datenmodell diese Daten hinzufügen ausgewählt werden (Bild 5-6). Außerdem soll dazu ein neues Arbeitsblatt verwendet werden. Codeliste 5-2. Prozedur deaktiviert und aktiviert eine Beziehung Sub DeActivateRelation() Dim wbkModel As Workbook Set wbkModel = ActiveWorkbook With wbkModel .Model.ModelRelationships(1).Active = False Stop .Model.ModelRelationships(1).Active = True End With Set wbkModel = Nothing End Sub

5.1 Beziehungen

|

237

Bild 5-6. Start einer neuen Pivot-Tabelle

Das Arbeitsblatt bekommt den Namen Kosten und verfügt wieder über eine Feldliste, in der unter der Auswahl Alle, die Tabellen und ihre Attribute als Feldelemente zur Auswahl angeboten werden. Das klassische Pivot-Schema wird aufgerufen und die Feldelemente werden den Feldern zugewiesen (Bild 5-7).

Bild 5-7. Zuordnung der Feldelemente

Um die Kostenwerte zu bestimmen, gibt es verschiedene Möglichkeiten. Da ein Datenmodell verwendet wird, sind berechnete Felder ausgeschlossen. Allerdings gehen Bereichsnamen immer und sie sind leicht zu handhaben.

5.1.4 Berechnung mit Bereichsnamen Die Spalten von C:E erhalten ihre Bereichsnamen für die Zeilen von 5 bis 55 aus den Überschriften. Die Spalte F bekommt den Namen Anzahl. Neben der Pivot-Tabelle erfolgt die Berechnung (Bild 5-8).

238

|

Datenmodelle

Bild 5-8. Kostenberechnung mit Bereichsnamen Tabelle 4-7. Bereichsnamen und Formeln zum Beispiel Bereich Name

Bereich

C5:C55 Std

G5:G55 Lohnkosten

D5:D55 Lohn

H5:H55 Maschinenkosten =Std*Satz

E5:E55 Satz

I5:I55

F5:F55

Name

Gesamtkosten

Anzahl J5:J55

Formel =Std*Lohn

=Lohnkosten+Maschinenkosten =Gesamtkosten/Anzahl

5.1.5 Berechnung mit VBA Den größten Spielraum bietet wieder VBA und so erstellt die nachfolgende Prozedur die Kostenanalyse ohne die Definition einer Beziehung, die als Funktion ersetzt wird.  2-12-05-03_Produktionsdaten.xlsm Codeliste 5-3. Prozedur erstellt die Kostenberechnung mit Diagramm Option Base 1 Sub Kosten() Dim wbkBook Dim wshPro Dim wshMa Dim wshKst Dim iMax Dim iRow Dim iCol Dim iInd Dim cVal Dim dSum(5) Dim iPro Dim shpDia Dim chrDia Dim rngPro

As As As As As As As As As As As As As As

Workbook Worksheet Worksheet Worksheet Integer Integer Integer Integer Currency Variant Integer Shape Chart Range

Set wbkBook = ActiveWorkbook

5.1 Beziehungen

|

239

Set wshPro = wbkBook.Worksheets("Produktionsdaten") Set wshMa = wbkBook.Worksheets("Maschinendaten") Set wshKst = wbkBook.Worksheets.Add(After:=wshMa) 'Überschriften With wshKst .Activate .Range("A1:J1") = Array("Produkt", "Bauteil", _ "Anzahl", "Std", "Lohn", "Satz", "Lohnkosten", _ "Maschinenkosten", "Gesamtkosten", "Kosten/Stück") .Columns("A:J").EntireColumn.AutoFit iMax = wshPro.UsedRange.Rows.Count For iRow = 2 To iMax 'Daten lesen For iCol = 1 To 5 Select Case iCol Case 1, 2, 3, 4 .Cells(iRow, iCol) = wshPro.Cells(iRow, iCol) Case 5 cVal = Format(wshPro.Cells(iRow, iCol), "#,##0.00 €") .Cells(iRow, iCol) = cVal End Select Next iCol iInd = CInt(wshPro.Cells(iRow, 6)) cVal = Format(Satz(wshMa, iInd), "#,##0.00 €") .Cells(iRow, 6) = cVal 'Berechnung .Cells(iRow, 7) = .Cells(iRow, 4) * .Cells(iRow, 5) .Cells(iRow, 8) = .Cells(iRow, 4) * .Cells(iRow, 6) .Cells(iRow, 9) = .Cells(iRow, 7) + .Cells(iRow, 8) .Cells(iRow, 10) = .Cells(iRow, 9) / .Cells(iRow, 3) 'Produktsumme iPro = Asc(.Cells(iRow, 1)) - 64 dSum(iPro) = dSum(iPro) + .Cells(iRow, 9) Next iRow .Range(Cells(2, 7), Cells(iMax, 19)).NumberFormat = "#,##0.00 €" .Columns("A:J").EntireColumn.AutoFit 'Produktchart For iCol = 1 To 5 .Cells(iCol, 12) = Chr(64 + iCol) .Cells(iCol, 13) = dSum(iCol) Next iCol Set rngPro = .Range("L1:M5") Set shpDia = .Shapes.AddChart2(201, xlColumnClustered) Set chrDia = shpDia.Chart chrDia.SetSourceData Source:=rngPro chrDia.ChartTitle.Text = "Produktumsätze" chrDia.FullSeriesCollection(1).Name = "=""Produkte""" End With Set wshKst = Nothing Set wshMa = Nothing Set wshPro = Nothing Set wbkBook = Nothing End Sub Function Satz(wshTmp As Worksheet, iMNr As Integer) As Double Satz = wshTmp.Cells(iMNr + 1, 2) End Function

Zusätzlich werden die Produktsummen als Säulendiagramm ausgewiesen (Bild 5-9).

240

|

Datenmodelle

Bild 5-9. Kostenanalse

5.2 Datenmodell und Tools Die Tools sind mit der Installation in die leistungsfähige Umgebung von Excel integriert und interagieren miteinander auf der Basis eines Datenmodells (Bild 5-10).

Bild 5-10. Datenmodellierung in Excel

Der Umgang mit Daten in Excel, ausgehend von einfachen Listen bis hin zum Datenmodell, wurde in den vorherigen Kapiteln beschrieben. Dazu wurden verschiedene Methoden verwendet, die man auch gerne als Tools bezeichnet. Oft wurden sie zuerst dem Anwender als Add-In zur Verfügung gestellt, daher auch die Bezeichnung Tool, und später dann in Excel integriert. Noch immer gibt es Add-Ins, besonders zur Datenanalyse, die im nächsten Kapitel beschrieben werden. So wurden auch neuere Tools zur Datenmodellierung in Excel bereitgestellt, unter dem Begriff Power Excel.

5.2 Datenmodell und Tools

|

241

Während sie in älteren Excel-Versionen noch als Add-In zur Verfügung standen, sind sie in den neueren Versionen bereits teilweise integriert. Unter Register Datei / Optionen / Add-Ins werden in der Liste Verwalten von COM-Add-Ins die Tools Power Map und Power Pivot für Excel angeboten, während Power Query bereits integriert ist. Das Tool Power BI kann als Desktop kostenlos geladen werden, landet dann aber wieder in einer kostenpflichtigen Version und wird daher von mir nicht beschrieben. Zumal die anderen Tools zum Einstieg in die Visualisierung ausreichen.

5.3 Abfragen und Verbindungen Bisher haben wir eine Beziehung direkt mit den Tabellen definiert. Doch das ist nicht immer der Fall. Oft müssen Daten erst aus Datenquellen abgefragt und transformiert werden. Dabei werden Verbindungen genutzt, die auch für das Datenmodell Bestand haben können und bei Änderung der Quelldaten das Datenmodell aktualisieren. Excel ermöglicht Verbindungen zu externen Datenquellen unterschiedlichster Art und Weise (Bild 5-11). Eine Abfrage gestattet die Auswahl von Daten aus externen Quellen und importiert sie in ein Arbeitsblatt.

Bild 5-11. Auswahl für Datenabfragen Tabelle 5-1. Auswahlmethoden bezogen auf Bild 5-11 Nr

Quelle

Beschreibung

1

Aus Text/CSV

Importieren von Daten im Text, durch Trennzeichen getrennt

2

Vorhandene Abfragen

Zuletzt verwendete Quellen verwalten und damit verbinden

3

Aus dem Web

Daten von Webseite importieren

4

Vorhandene Verbindungen

Daten aus gemeinsamen Quellen importiren

5

Aus Tabelle/Bereich

Neue Abfrage mit ausgewählter Excel-Tabelle

Codeliste 5-4. Die Prozedur liest alle Abfragen im aktuellen Workbook Sub ReadQueries() Dim queTemp As WorkbookQuery For Each queTemp In ActiveWorkbook.Queries Debug.Print queTemp.Name Next End Sub

Unter Daten abrufen öffnet sich eine Auswahl von Möglichkeiten nach Kategorien (Bild 5-12).

242

|

Datenmodelle

5.3.1 Abfragen aus Dateien

Bild 5-12. Abfragen aus einer Datei

Als Beispiel für eine Abfrage aus einer Arbeitsmappe werden noch einmal die Produktionsdaten gewählt. Durch die Auswahl beider Tabellen im Navigator werden die Inhalte eingeblendet (Bild 5-13).

Bild 5-13. Abfrageauswahl aus einer Excel-Arbeitsmappe

Im Navigator kann durch die Schaltfläche Laden der Import fortgesetzt werden. Dabei gibt es verschiedene Möglichkeiten (Bild 5-14).

5.3 Abfragen und Verbindungen

|

243

Bild 5-14. Ausgabeformat für die Abfragedaten

5.3.2 Abfragen aus Datenbanken Eine andere Möglichkeit ist die Abfrage aus einer Datenbank (Bild 5-15).

Bild 5-15. Abfragen aus einer Datenbank

244

|

Datenmodelle

5.4 Power Query Power Query ist der Nachfolger des veralteten MS Query. Auch in Power Query können Daten im sogenannten Clean Up angepasst werden, d. h. Spalten werden entfernt, Datentypen geändert oder Tabellen kombiniert. Formeln können zur Analyse eingesetzt und die Ergebnisse als Abfragen verwaltet werden. Letztlich lassen sich die Abfragen in Tabellen oder Pivot-Tabellen übertragen, wie schon zum Navigator beschrieben. Grundsätzlich werden folgende Phasen unterschieden: x x x x

Verbinden Transformieren Kombinieren Verwalten

Als Beispiel erfolgt eine Abfrage aus einer Access-Datenbank (Bild 5-15).  2-12-05-04_Lagerverwaltung.accdb

5.4.1 Navigator In einer neuen Excel-Arbeitsmappe, über Register Daten / Daten abrufen und transformieren / Daten abrufen / Aus Datenbank / Aus Microsoft Access Datenbank mit der Auswahl der Datei öffnet sich der Navigator von Power Query und meldet, dass die Verbindung hergestellt wird. Diese Meldung wird nur so lange eingeblendet, bis der Vorgang abgeschlossen ist. Im Navigator werden dann alle Tabellen der Access-Datei angezeigt (Bild 5-16).

Bild 5-16. Tabellenanzeige im Navogator

Mit der Option Mehrere Elemente auswählen sind auch die Tabellen einzeln auswählbar und die jeweils ausgewählte Tabelle wird in der Vorschau rechts angezeigt.

5.4 Power Query

|

245

Im nächsten Schritt muss entschieden werden, ob die Daten in Power Query transformiert werden sollen, oder ob eine Weitergabe an andere Tools erfolgt. Unter der Schaltfläche Laden im Navigator gibt es die Auswahl Laden und Laden in. Unter Laden in öffnet sich das Dialogfenster Daten importieren (Bild 5-17).

Bild 5-17. Auswahl der Importdarstellung

5.4.2 Laden in Tabelle Mit der Wahl Tabelle bekommt jede Entität ein Arbeitsblatt, auf dem sich die Tabellen befinden. Es fehlen noch die erforderlichen Beziehungen für ein Datenmodell. Dazu verwenden wir das folgende Beispiel. Ein Controller bekommt die Aufgabe, die Produkte nach Regionen mit ihren Umsätzen anzuzeigen. Dazu sind zwei Beziehungen erforderlich (Bild 5-18).

Bild 5-18. Benötigte Verbindungen zur Aufgabe

Zum besseren Verständnis hier noch einmal das Datenmodell zur Aufgabenstellung im vereinfachten ERM (Bild 5-19).

Bild 5-19. Datenmodell zur Aufgabenstellung

246

|

Datenmodelle

Das noch leere Arbeitsblatt Tabelle1 wird nun zur Auswertung genutzt (Bild 5-20).

Bild 5-20. Auswertungsergebnis mit Tabellen Tabelle 5-2. Formeln Teil 1 Bereich

Formel

A2

=Verkaufsliste[Produkt]

B2

=XVERWEIS(A2#;Produkte[PNr];Produkte[Produkt])

C2

=XVERWEIS(A2#;Produkte[PNr];Produkte[Preis])

D2

=Verkaufsliste[Region]

E2

=XVERWEIS(D2#;Regionen[RNr];Regionen[Region])

F2

=Verkaufsliste[Anzahl]

H2

=EINDEUTIG(E2#)

I2

=EINDEUTIG(B2#)

Tabelle 5-3. Bereichsnamen und Formeln Teil2 Bereich

Name

Bereich

Formel

B2:B501

Produkt

J2(:J16)

=XVERWEIS(I2;Produkt;Preis)

C2:C501

Preis

K2(:K16)

=SUMMEWENNS(Anzahl;Produkt;$I2;Region;$H$2)

E2:E501

Region

L3(:L16)

=SUMMEWENNS(Anzahl;Produkt;$I2;Region;$H$3)

F2:F501

Anzahl

M3(:M16)

=SUMMEWENNS(Anzahl;Produkt;$I2;Region;$H$4)

N3(:N16)

=SUMMEWENNS(Anzahl;Produkt;$I2;Region;$H$5)

O3(:O16)

=SUMME(K2:N2)

P2(:P16)

=J2*O2

 2-12-05-05_Lagerverwaltung.xlsm

5.4 Power Query

|

247

5.4.3 Laden in PivotTable Auch hier soll die Aufgabe gelöst werden. Noch einmal wird der Import aus einer leeren Arbeitsmappe gestartet. Doch diesmal wird im Navigator (Bild 5-17) der PivotTable-Bericht in einem neuen Arbeitsblatt ausgewählt. In der Pivot-Tabelle werden die Beziehungen definiert und das Pivot-Schema geladen. Dann erhält das Zeilenfeld den Produktnamen und den Preis, das Spaltenfeld die Regions-Namen und die Summe der Anzahlen wird im Wertefeld gebildet (Bild 5-21).

Bild 5-21. Lösen der Aufgabe

Mit den Bereichsnamen Preis und Summen bestimmt sich letztlich der Umsatz.  2-12-05-06_Lagerverwaltung.xlsm

5.4.4 Daten transformieren Mit der Schaltfläche Daten transformieren gelangen die Abfragen in den Power Query-Editor. Das Transformieren bedeutet, dass die Daten in irgendeiner Weise geändert werden, damit sie die Anforderungen für eine Datenanalyse erfüllen. Beispielsweise kann eine Spalte entfernt, der Datentyp der Spalte geändert oder Zeilen gefiltert werden. Jeder dieser Transformationen wird auch als Strukturierung oder Clean Up von Daten bezeichnet. Der Power Query-Editor verfolgt alle Änderungen, die auf den Daten stattfinden und zeichnet jeden Schritt auf. Sie werden in der Liste Angewendete Schritte angezeigt und der letzte Schritt kann durch Anklicken wieder zurückgenommen werden. Die Abfrage Verkaufsliste wird ausgewählt, um sie entsprechend anzupassen (Bild 5-22).

248

|

Datenmodelle

Bild 5-22. Power Query-Editor (Ausschnitt)

Im ersten Schritt werden die Spalten gelöscht, die nicht benötigt werden. Das sind die Spalten ID, Verkäufer und Kunde. Im Kontextmenü der Kopfzeile gibt es dazu die Methode Entfernen. Übrig bleiben die Spalten Region, Produkt und Anzahl. Die Beziehungen zu Region und Produkt werden unter Register Start / Kombinieren mit der Methode Abfragen zusammenführen erreicht. Es öffnet sich das Dialogfenster Zusammenführen, in dem die Beziehung zwischen zwei Abfragen definiert werden kann. Vorgegeben ist die Verkaufsliste und dazu wird Regionen eingetragen. Welche Spalten übereinstimmen, wird durch Anklicken bestimmt und automatisch grün gekennzeichnet (Bild 5-23).

Bild 5-23. Kombinieren der Abfragen Verkaufsliste und Regionen

Beim Zusammenführen entsteht eine neue Abfrage aus zwei vorhandenen Abfragen. Die neue Abfrage enthält alle Spalten aus einer primären Tabelle, wobei eine Spalte als Primärschlüssel

5.4 Power Query

|

249

in einer Beziehung zu einer anderen Tabelle mit Fremdschlüssel dient. Die neue Tabelle enthält alle Zeilen der anderen Tabelle, die mit jeder Zeile aus dem gemeinsamen Spaltenwert übereinstimmt. Darüber hinaus können Spalten aus der anderen Tabelle die primäre Tabelle erweitern. Bei dem Vorgang entsteht eine neue Abfrage aus zwei vorhandenen Abfragen. Auf diese Weise lassen sich mehrere Abfragen zusammenführen. Die Vorgänge werden für jede Abfrage in tabellarischer Form ausgeführt und sind unabhängig von den Datenquellen. Mit Bestätigung erhält die Verkaufsliste eine Spalte Regionen mit den Einträgen Table in den Zeilen (Bild 5-24).

Bild 5-24. Neue Spalte Regionen (Ausschnitt)

Im Kopf der Spalte Regionen befindet sich rechts ein Doppelpfeil . Ein Klick darauf zeigt eine Auswahlliste, in der die gewünschten Spalten zur Übernahme ausgewählt werden (Bild 5-25).

Bild 5-25. Auswahl der Spalten zur Übernahme

In diesem Beispiel genügt die Bezeichnung der Region unter Region. Im nächsten Schritt wird die Spalte mit dem Schlüssel zur Region entfernt und die Spalte mit den Bezeichnungen der Regionen an den linken Rand geschoben, durch Anfassen der Kopfzeile und Ziehen oder über das Kontextmenü durch Verschieben / An den Anfang (Bild 5-26).

250

|

Datenmodelle

Bild 5-26. Neue Spalte Regionen

Eine weitere Kombination fügt auf die gleiche Weise Produktnamen und Preis in die Verkaufsliste ein (Bild 5-27).

Bild 5-27. Transformierte Verkaufsliste

Die eingefügten Spalten besitzen in der Kopfzelle (links) den Hinweis auf den Datentyp in der Spalte, z. B. ABC für Text, 123 für ganze Zahl, $ für Währung etc. Unter Register Transformieren / Beliebige Spalte kann der Datentyp aus einer Auswahlliste bestimmt werden, als Dezimalzahl, Währung, ganze Zahl, Prozentsatz, Datum, Zeit, Dauer, Text, booleschen Wert oder Binär. Im letzten Schritt wird eine benutzerdefinierte Spalte hinzugefügt. Unter Register Spalte hinzufügen / Allgemein öffnet sich ein Dialogfenster, in dem sich der Umsatz mit einer Formel berechnen lässt (Bild 5-28). Die Spalte Umsatz erhält noch den Datentyp Währung (Bild 5-29).

Bild 5-28. Umsatzformel

5.4 Power Query

|

251

Bild 5-29. Transformierte Verkaufsliste

Unter Register Datei / Schließen und laden in kann wie schon vorher wieder das Tools zu Weiterverarbeitung ausgewählt werden. Noch einmal wird die Pivot-Tabelle gewählt und darin die transformierte Verkaufsliste mit den Umsätzen (Bild 5-30). Auch eine Visualisierung mit einem 3D-Säulendiagramm ist so möglich.

Bild 5-30. Umsätze visualisiert

 2-12-05-07_Lagerverwaltung.xlsm

5.5 Power Pivot Power Pivot ist ebenfalls ein Tool zur Datenmodellierung, mit dem sich Datenmodelle aus großen Datasets erstellen, umfangreiche Beziehungen definieren und komplexe Berechnungen erstellen lassen. Power Query und Power Pivot ergänzen sich gegenseitig. Während Power Query auf die Generierung von Datenmodellen spezialisiert ist, ist Power Pivot spezialisiert auf die Ausgestaltung von Datenmodellen.

252

|

Datenmodelle

5.5.1 Datenmodell  2-12-05-08_Produktionsdaten.xlsm Ausgehend von den Produktionsdaten am Anfang dieses Kapitels, die als Tabellen vorliegen, wird die Beziehung definiert und damit ein Datenmodell erstellt. Unter Register Daten / Datentools gibt es die Methode Zum Power Pivot-Fenster wechseln. Mit dem Aufruf öffnet sich das Fenster (Bild 5-31).

Bild 5-31. Power Pivot-Fenster

In diesem Fenster wird das Datenmodell verwaltet. Um das Datenmodell um eine Beziehung zu ergänzen, wird unter Register Start / Ansicht die Diagrammsicht gewählt. Damit ist eine grafische Darstellung des Modells zu sehen (Bild 5-32).

Bild 5-32. Grafische Darstellung (ERM) des Datenmodells Produktion

5.5 Power Pivot

|

253

Durch Ziehen des Fremdschlüssels MNr in Produktion auf den Primärschlüssel MNr in Maschinen erkennt Excel eine 1:n Beziehung. Zur Bearbeitung des Modells wird unter Start / Ansicht wieder die Datensicht aufgerufen Eine Beziehung kann hier auch unter Register Entwurf / Beziehungen erstellt und verwaltet werden.

5.5.2 Kombinieren Die Tabelle Produktion enthält Produktionsdaten und wird über die Beziehung um eine weitere Spalte Satz ergänzt. Die angedeutete Spalte mit der Beschriftung Spalte hinzufügen, wird ausgewählt und in der Bearbeitungsleiste die Formel =RELATED(Maschinen[Satz]) eingetragen (Bild 5-33).

Bild 5-33. Eingefügte Spalte Satz

Um einen Tabellennamen in die Formel einzutragen, wird mit dem Namen begonnen. Die Autovervollständigungs-Funktion stellt eine Dropdown-Liste bereit, die alle gültigen Namen enthält, die mit der Eingabe übereinstimmen. Um einen Spaltennamen in die Formel einzutragen, wird mit der [ Klammer begonnen und mit einem Klick die entsprechende Spalte in der aktuellen Tabelle ausgewählt. Ist die Spalte in einer anderen Tabelle, so werden wieder die ersten Buchstaben des Spaltennamens eingegeben. Eine Dropdown-Liste gibt auch hier alle Möglichkeiten vor. Bei der Anweisung RELATED handelt es sich um eine DAX-Funktion (Data Analysis Expression). DAX ist eine Sammlung von Funktionen, Operatoren und Konstanten, die in Formeln verwendet werden können. Mit einem Klick auf fx neben der Bearbeitungsleiste werden in einem Fenster alle möglichen Funktionen eingeblendet. Ein Klick auf eine Funktion ist die einfachste Möglichkeit mit einer Formel zu beginnen. RELATED liefert einen zugehörigen Wert aus einer anderen Tabelle.

5.5.3 DAX in Power Pivot DAX ist eine Formelsprache und leicht zu verstehen. Mit DAX können berechnete Spalten und berechnete Felder (Measures) erstellt werden. DAX besitzt Excel ähnliche Funktionen und solche, die für das Arbeiten mit relationalen Daten erforderlich sind.

254

|

Datenmodelle

Um eine berechnete Spalte zu erhalten, wird eine DAX-Formel in die Bearbeitungsleiste eingegeben, die dann automatisch auf die gesamte Spalte angewendet wird, auch als Überlauf bezeichnet (Bild 5-34).

Bild 5-34. Berechnete Spalte

Nach dem Erstellen kann eine berechnete Spalte über das Kontextmenü umbenannt und verschoben werden. Der Spaltenname muss eindeutig sein und darf nur einmal verwendet werden. Ein berechnetes Feld (auch als Measure bzw. KPI bezeichnet) enthält eine Formel, die speziell zur Verwendung im Wertebereich in einer Pivot-Tabelle erstellt wird, die aus Power Pivot entsteht. Die Formeln basieren auf Standardaggregationsfunktionen, wie z. B. SUM oder COUNT und werden häufig in Berichten verwendet. Ein berechnetes Feld wird im Berechnungsbereich, unterhalb der Tabelle, mit einer DAX-Formel erstellt. Die Formel in der Bearbeitungsleiste beginnt mit der Beschriftung, im Beispiel LK:=SUM([Lohnkosten]), Beschriftung der Zelle gefolgt von := und der Formel (Bild 5-35).

Bild 5-35. Berechnete Felder Kostensummen

Viele DAX-Funktionen sind ausschließlich für eine Anwendung als geschachtelte Funktion gedacht und liefern als Rückgabewert eine Tabelle, die nicht gespeichert werden kann, sondern als Eingabe für eine DAX-Funktion dient. Zum Beispiel erwarten SUMX, AVERAGEX und MINX eine Tabelle als erstes Argument.

5.5.4 Transformieren und Pivotisieren Die Spalte Lohnkosten weist zuerst nur Zahlen aus. Unter Register Start / Formatierung wird als Datentyp und Format Währung gewählt. Das Datumsformat muss nicht geändert werden, ebenso die Textspalten.

5.5 Power Pivot

|

255

Im nächsten Schritt wird unter Register Start die Methode PivotTable aufgerufen. In einer Auswahlliste gibt es noch andere Ausgaben. Die Pivot-Tabelle kann nun, wie schon vorher, entsprechend auf einem neuen Arbeitsblatt gestaltet werden (Bild 5-36).

Bild 5-36. Berechnete Kosten

Die gleichen Werte liefern auch die berechneten Felder (Bild 5-37).

Bild 5-37. Berechnete Felder in der Pivot-Tabelle

5.5.5 Dashboard oder Folie Um zu den berechneten Kosten ein Dashboard oder eine Folie als Bericht zu erstellen, übergeben wir die Kostenübersicht in Power Pivot unter Daten / PivotTable in der Auswahl an Diagramm und Tabelle (horizontal) an ein neues Arbeitsblatt (Bild 5-38). Die Pivot-Tabelle wird zur Darstellung der Produkt-Gesamtkosten genutzt und als Diagrammtyp wird ein Kreis gewählt, der die Gesamtkosten-Anteile nach Produkten zeigt. Als Ergänzung zur Pivot-Tabelle wird ein Datenschnitt zum Produkt eingefügt (Bild 5-39).

256

|

Datenmodelle

Bild 5-38. PivotChart und PivotTable auf einem neuen Arbeitsblatt

Bild 5-39. Angepasste Tabelle mit Diagramm (horizontal)

Noch einmal wird die Kostenübersicht genutzt, um ein Arbeitsblatt mit zwei Diagrammen (horizontal) zu erstellen. In ihnen werden die Lohn- und Materialkosten als Säulendiagramme dargestellt. Nach der Formatierung werden die Diagramme zum Arbeitsblatt mit Tabelle und Diagramm durch Kopieren hinzugefügt (Bild 5-40).

Bild 5-40. Dashboard Kostenbericht

5.5 Power Pivot

|

257

Im Kontextmenü vom Datenschnitt wird die Methode Berichtsverbindungen aufgerufen. Darunter lassen sich die Einstellung im Datenschnitt mit den Darstellungen in den Diagrammen verbinden (Bild 5-41).

Bild 5-41. Auswahl der Berichtsverbindungen

Entsprechend werden mit einer Teilauswahl über den Datenschnitt nur die relevanten Daten angezeigt (Bild 5-42).

Bild 5-42. Darstellung einer Produktauswahl

5.5.6 m:n Beziehungen Am häufigsten sind m:n Beziehungen. Eine solche Beziehung liegt vor, wenn ein oder mehrere Attribute einer Entität eine Beziehung zu einer oder mehreren Attributen einer anderen Entität aufweisen.  2-12-05-09_Projektstunden.xlsx

258

|

Datenmodelle

Als Beispiel betrachten wir das Modell Projektaufwand. Darin können mehrere Mitarbeiter an mehreren Projekten beteiligt sein und umgekehrt können mehrere Projekte auch mehrere Mitarbeiter beschäftigen (Bild 5-43).

Bild 5-43. ERM einer n:m Beziehung

Zur Erstellung einer m:n Beziehung ist eine weitere Tabelle erforderlich, die auch als Brückentabelle bezeichnet wird (Bild 5-44).

Bild 5-44. ERM einer n:m Beziehung mit einer Brückentabelle

Mit den so definierten Tabellen werden die erforderlichen Beziehungen definiert und unter Register Power Pivot / Datenmodell mit Verwalten der Power Pivot-Editor aufgerufen. Danach wird unter Register Start / Ansicht die Diagrammsicht gewählt (Bild 5-45).

Bild 5-45. Diagrammansicht des vorliegenden Datenmodells

Die Tabelle Stunden wird noch mit den anderen Tabellen kombiniert, um die darin befindlichen Beschreibungen zu erhalten. Danach erfolgt wieder die Übergabe an eine PivotTabelle, die in der Feldliste alle Tabellen und ihre Feldelemente enthält. Eine mögliche Analyse zeigt den Aufwand der Abteilungen (Bild 5-46).

5.5 Power Pivot

|

259

Bild 5-46. Arbeitsaufwand in den Abteilungen

Da die Mitarbeiterin Lehrer eine Zuweisung zur Abteilungsnummer 5 besitzt, diese aber nicht existiert, werden die Stunden unter dem Eintrag (Leer) verwaltet.

5.6 Power Map Die Aufgabe von Power Map war ursprünglich eine Visualisierung von Daten mit geographischer Zuordnung. Über eine Zeitschiene lassen sich Veränderungen per Videoclip zeigen.

5.6.1 3D-Karte Dazu ein einfaches Beispiel, mit zwei Tabellen (Bild 5-47) als Ausgangspunkt.  2-12-05-10_Projektkosten.xlsm Tabelle1 enthält die anfallenden Kosten für ein Projekt und Tabelle2 die Aufgabenverteilung der Standorte.

Bild 5-47. Projektkosten

Unter Register Einfügen, in der Gruppe Touren wählen wir 3D-Karten. Es öffnet sich ein Arbeitsfenster mit einer Landkarte im Hintergrund, auf der die gefundenen Orte in Tabelle1 bereits markiert sind (Bild 5-48). Als Diagrammform wählen wir die gestapelte Säule und treffen durch Ziehen der Feldelemente aus der Feldliste, Kosten zu Höhe und Datum zu Zeit, weitere Zuordnungen. Um noch die Tabelle2 ins Spiel zu bringen, benötigen wir eine Beziehung dazu.

260

|

Datenmodelle

Bild 5-48. Power Map Arbeitsfenster

Im Register Daten des Excel-Arbeitsblatts unter Datentools gibt es die Methode Beziehungen, in der noch kein Eintrag existiert. Hier erstellen wir die erforderliche Beziehung (Bild 5-49).

Bild 5-49. Beziehung zwischen den Tabellen

Danach existiert auch Tabelle2 in unserer Feldliste und wir können das Feldelement Bereich ins Kategoriefeld ziehen. Das Ergebnis sind farblich nach Bereichen gruppierte Säulen über den jeweiligen Standorten (Bild 5-50).

Bild 5-50. Visualisierte Projektkosten

5.6 Power Map

|

261

Mit der Belegung des Zeitfeldes wird auch eine Zeitleiste angezeigt. Sie lässt sich starten und zeigt den zeitlichen Verlauf der Kostenzunahme in den Standorten. Unter Tour kann dazu auch ein Video erstellt werden.  2-12-05-11_Projektkosten.mp4

5.6.2 Benutzerdefinierter Grundriss Power Map verfügt über die Möglichkeit, neben Kartenmaterial auch Grundrisse und Bilder als Hintergrund zu verwenden. Damit ergeben sich vielfältige neue Möglichkeiten. Auch dazu ein einfaches Beispiel.  2-12-05-12_Dreherei.xlsm Eine Dreherei verfügt über sechs Maschinen, deren Aufstellung in der Produktionshalle in einem Grundriss (Bild 5-51) (Pixel 300 x 200) vorliegen.

Bild 5-51. Grundriss der Produktionshalle

Tabelle1 verwaltet die Positionen der Maschinen und Tabelle2 zeigt die Produktionsdaten eines Arbeitstages (Bild 5-52). Jeder gefertigte Auftrag wird mit Stückzahl und Uhrzeit vermerkt.

Bild 5-52. Produktionsdaten

Natürlich müssen wir auch diesmal eine Beziehung zwischen den Tabellen über die Maschinen herstellen.

262

|

Datenmodelle

Danach folgt die Visualisierung: x x x x x x x

Aufruf der Methode 3D-Karte und eine neue Tour wählen Unter Start im Arbeitsfeld, in der Gruppe Szene die Methode Neue Szene aufrufen Benutzerdefinierte Karte wählen und die Daten im Dialogfenster (Bild 5-53) anpassen Mit der Schaltfläche Fertig übernehmen Die x- und y-Feldelemente dem Ort zuordnen und als X- bzw. Y-Koordinate definieren Unter Höhe die Menge eintragen Unter Zeit die Uhrzeit eintragen.

Bild 5-53. Benutzerdefinierte Karte einstellen

Die zeitliche Zunahme der Stückzahlen lässt sich wieder per Zeitachse betrachten (Bild 5-54).

Bild 5-54. Visualisierte Fertigungsmengen

 2-12-05-13_Dreherei.mp4

5.6 Power Map

|

263

5.7 CUBE-Funktionen Unter einem CUBE stellt man sich gedanklich einen Datenwürfel vor, in dem die zu analysierenden Daten als Elemente eines mehrdimensionalen Würfels angeordnet werden (Bild 5-55).

Bild 5-55. Schema eines dreidimensionalen Datenwürfels

Der Zugriff auf die Daten erfolgt über die Dimensionen des CUBE. Die CUBE-Funktionen gehören zum Bereich der Power Tools und setzen auf dem Datenmodell von Power Pivot auf. Mit den CUBE-Funktionen ergibt sich ein direkter Zugriff auf das Datenmodell, ohne zuvor eine Pivot-Tabelle erstellen zu müssen.

5.7.1 CUBE-Funktionen in Excel 2-12-05-14_Auftragsliste.xlsm Als Beispiel verwenden wir eine Auftragsliste, die aus einer einfachen Liste besteht. Zuerst muss das Datenmodell definiert werden und dazu benötigen wir Power Pivot. Wir wählen eine beliebige Zelle in der Liste aus und rufen unter Register Power Pivot / Tabellen die Methode Zu Datenmodell hinzufügen auf. Darauf wird die Eingabemaske Tabelle erstellen eingeblendet, die darauf hinweist, dass die Tabelle Überschriften besitzt. Mit Bestätigung durch OK öffnet sich der Power Pivot-Editor und wir können Änderungen und Ergänzungen am Datenmodell vornehmen. Die Spalte Umsatz erhält den Datentyp Währung und im Wertebereich wird die Formel für das Feld Summe.Umsatz:=SUM(Tabelle1[Umsatz]) eingegeben (Bild 5-56).

Bild 5-56. Datenmodell im Power Pivot-Editor

Wir betrachten unser Datenmodell noch einmal in der Diagrammsicht (Bild 5-57).

264

|

Datenmodelle

Bild 5-57. Datenmodell in der Diagrammansicht

Der Power Pivot-Editor wird geschlossen, denn es soll ja gezeigt werden, dass eine Auswertung mit dem Datenmodell frei von einer Pivot-Tabelle sein kann. In der Excelmappe erstellen wir ein neues Arbeitsblatt, auf dem eine einfache Auswertung erfolgen soll. Danach geben wir die folgenden Formeln ein. Tabelle 5-4. Formeln im neuen Arbeitsblatt Zelle

Formel

A1

=CUBEMENGE("ThisWorkbookDataModel";"[Tabelle1].[Produktkategorie].[All]. Children";"Produkte")

B1

=CUBEMENGENANZAHL(A1)

Die Funktion CUBEMENGE liefert die, entsprechend den Parametern definierten, Daten an Excel. Mit dem ersten Parameter ThisWorkbookDataModel wird das aktuelle Datenmodell angesprochen. Mit der Eingabe des Anführungszeichens werden die Auswahlmöglichkeiten eingeblendet. Mit dem zweiten Parameter wird Tabellenname.Feldelement angesprochen und [All].Children liefert alle Elemente der Spalte. Der dritte Parameter gibt die Beschriftung der ausgewählten Zelle vor, als Platzhalter für die ausgewählte Datenmenge, hier Produkte. Die Funktion CUBEMENGENANZAHL liefert die Anzahl der Datenelemente, die sich in der Datenmenge Produkte befindet. (Bild 5-58).

Bild 5-58. Ergebnisse der CUBE-Funktionen

Die in der Datenmenge Produkte befindlichen Daten betrachten wir genauer. Um zu zeigen, dass die Position im Arbeitsblatt beliebig sein kann, wählen wir die Zelle B5 für die CUBEFunktion aus, ab der die Liste der gefundenen Produkte als Überlauf stehen soll (Bild 5-59).

5.7 CUBE-Funktionen

|

265

Bild 5-59. Liste der gefundenen Produkte (Zeilen ausgeblendet) Tabelle 5-5. Formeln im neuen Arbeitsblatt Zelle

Formel

B5

=WENNNV(CUBERANGELEMENT("ThisWorkbookDataModel";A$1;ZEILE()-4);"")

Die Funktion CUBERANGEELEMENT liefert das n-te bzw. r-rangige Element der Datenmenge. Der erste Parameter bezieht sich wieder auf das aktuelle Datenmodell. Der zweite Parameter kennzeichnet die Zelle, die als Platzhalter für die definierte Datenmenge steht. Der dritte Parameter kennzeichnet die Position in der Datenmenge. Da die Ausgabe in der 5. Zeile beginnt, dort aber das erste Element stehen soll, wird logischerweise berechnet: aktuelle Zeile – 4. Zum Datenmodell gehört auch das berechnete Feld (Measure) Summe.Umsatz, das sich den entsprechenden Produkten zuordnen lässt (Bild 5-60).

Bild 5-60. Umsatzsummen aus dem berechneten Feld Summe.Umsatz

266

|

Datenmodelle

Tabelle 5-6. Formeln im neuen Arbeitsblatt Zelle

Formel

C5

=WENNNV(CUBEWERT("ThisWorkbookDataModel";B5;"[Measures].[Summe.Umsatz]");"")

Die Funktion CUBEWERT liefert einen aggregierten Wert aus dem CUBE. Eine andere Möglichkeit ist der Zugriff über das CUBEELEMENT. Tabelle 5-7. Formeln im neuen Arbeitsblatt Zelle

Formel

E5

=WENNNV(CUBEWERT("ThisWorkbookDataModel";B5;CUBEELEMENT ("ThisWorkbookDataModel";"[Measures].[Summe.Umsatz]"));"")

Die Formel liefert die gleichen Ergebnisse (Bild 5-61)

Bild 5-61. Umsatzsummen über das CUBEELEMENT Codeliste 5-5. Anwendung der CUBE-Funktionen Sub ReadCount() ActiveSheet.Range("B1").Formula = "=CUBESETCOUNT(A1)" End Sub Sub ReadElements() With ActiveSheet .Range("B5").Formula = _ "=IFNA(CUBERANKEDMEMBER(""ThisWorkbookDataModel""," & _ "A$1,ROW()-4),"""")" .Range("B5").AutoFill Destination:=Range("B5:B19"), _ Type:=xlFillDefault End With End Sub Sub SetMeasure() With ActiveSheet

5.7 CUBE-Funktionen

|

267

.Range("C5").Formula = _ "=IFNA(CUBEVALUE(""ThisWorkbookDataModel"", B5," & _ """[Measures].[Summe.Umsatz]""),"""")" .Range("C5").AutoFill Destination:=Range("C5:C19"), _ Type:=xlFillDefault .Range("E5").Formula = _ "=IFNA(CUBEVALUE(""ThisWorkbookDataModel"", B5," & _ "CUBEMEMBER(""ThisWorkbookDataModel""," & _ """[Measures].[Summe.Umsatz]"")),"""")" .Range("E5").AutoFill Destination:=Range("E5:E19"), _ Type:=xlFillDefault End With End Sub

CUBE-Funktionen bieten auch große Flexibilität bei der Gestaltung von Dashboards. So können gezielt nur bestimmte Werte abgefragt werden. Zusätzliche interaktive Elemente, wie Datenschnitte und Zeitachsen, ermöglichen dabei eine gezielte Datenauswahl.

5.7.2 CUBE-Funktionen aus der Pivot-Tabelle Die Syntax der CUBE-Funktionen ist etwas komplizierter als die Syntax der StandardExcelfunktionen. Sie basiert auf sogenannten MDX-Ausdrücken (Multidimensional Expressions). Diese Datenbanksprache muss nicht unbedingt gelernt werden, um die CUBEFunktionen anzuwenden. Mit einem einfachen Trick lassen sich die benötigten Formeln aus einer Pivot-Tabelle bestimmen. Dazu verwenden wir noch einmal die Auftragsliste unter Power Pivot. Sie enthält bereits ein berechnetes Feld Summe.Umsatz, das zum Datenmodell gehört. Um auch eine berechnete Spalte für unser Datenmodell zu erhalten, bestimmen wir die Mehrwertsteuer von 19% im Umsatz (Bild 5-62).

Bild 5-62. Auftragsliste mit berechneter Spalte und berechnetem Feld

Unter Start / PivotTable übergeben wir die Daten nun an eine Pivot-Tabelle in einem neuen Arbeitsblatt. Zur Übersichtlichkeit bestimmen wir darin die Umsatz- und MWSt-Summen der Regionen (Bild 5-63).

Bild 5-63. Pivot-Tabelle mit Umsatz und MWSt der Regionen

268

|

Datenmodelle

Im nächsten Schritt wählen wir unter Register PivotTable-Analyse / Berechnungen die Methode OLAP-Tools und darunter In Formeln konvertieren. Durch diese Konvertierung verliert die Pivot-Tabelle ihre Formatierung. Wenn wir eine Zelle der ehemaligen PivotTabelle auswählen, dann wird in der Bearbeitungsleiste die CUBE-Formel eingeblendet (Bild 5-64.

Bild 5-64. Umgewandelte Pivot-Tabelle mit CUBE-Funktion

Ein Vorteil durch die Umwandlung ist, dass wir nicht mehr an die Beschränkungen der PivotTabelle gebunden sind. Zeilen und Spalten lassen sich beliebig verschieben, einfügen oder löschen. Während die Excel-Funktionen automatisch aktualisiert werden, wenn dies eingestellt ist, werden die CUBE-Funktionen aus Zeitgründen nicht aktualisiert. Dazu muss unter Register Daten / Abfragen und Verbindungen die Methode Alle aktualisieren aufgerufen werden. In der Phase der Aktualisierung wird kurzzeitig der Text #GETTING DATA eingeblendet.

5.7.3 CUBE-Funktionen im Dashboard Da CUBE-Funktionen völlig unabhängig eingesetzt werden können, bieten sie sich auch in Dashboards an, in denen bestimmte Werte angezeigt werden sollen. Dazu ist keine PivotTabelle erforderlich, die Funktionen CUBEELEMENT und CUBEWERT reichen dazu aus. Für unser Beispiel Auftragsliste soll die Anzahl der Aufträge dargestellt werden, abhängig von einer flexiblen Auswahl. Dazu bieten sich zwei Varianten an. Datenauswahl durch Datenschnitt Wir erstellen ein neues Arbeitsblatt und die Zelle A1 erhält die Formel =CUBEELEMENT("ThisWorkbookDataModel";"[Measures].[Summe.Umsatz]";" ") mit dem Zugriff auf das berechnete Feld (Measure) Summe.Umsatz. Die Zelle bleibt leer, da am Ende der Formel ein Leerzeichen steht. Es ist damit für Berechnungen verfügbar, ohne sichtbar zu sein. Über Register Einfügen / Filter wird die Methode Datenschnitt aufgerufen und Region ausgewählt. Im Register Datentools wählen wir die Spaltenanzahl 2. Es fehlt noch die Anzeige der bestimmten Werte. Dazu erhält die Zelle B4 die Formel =CUBEWERT("ThisWorkbookDataModel";$A$1;Datenschnitt_Region) Mit der Beschriftung Umsatz in A4 (Bild 5-65).

5.7 CUBE-Funktionen

|

269

Bild 5-65. Umsatzanzeige nach Auswahl

Mit dieser Konstruktion wird die Umsatzsumme nach Auswahl angezeigt. Datenauswahl durch Zellinhalt Statt des Datenschnitts wird die Zelle B1 als Vorgabe für die Region verwendet. Sie erhält den Bereichsnamen Region. Während in A1 die Funktion CUBEELEMENT bleibt, bekommt die Zelle B4 die Formel =CUBEWERT("ThisWorkbookDataModel";$A$1;Region) und liefert damit das gleiche Ergebnis (Bild 5-66).

Bild 5-66. Umsatzanzeige nach Zellinhalt

Die nachfolgende Zelle erzeugt die Formeln zum Beispiel. Sub ShowSumme() Range("A1").Formula = _ "=CUBEMEMBER(""ThisWorkbookDataModel"",""[Measures].[Summe.Umsatz]"","" "")" Range("B4").Formula2 = "=CUBEVALUE(""ThisWorkbookDataModel"", A1,Region)" End Sub

Die Zellinhalte lassen sich auch aus einer Liste über die Datenüberprüfung vorgeben.

270

|

Datenmodelle

KAPITEL 6

Analyse-Methoden

Mit der Installation von Excel gibt es neben den bereits beschriebenen DatenaufbereitungsMethoden auch einige Analyse-Methoden und -Möglichkeiten. Sie sind im Register Daten / Prognose mit dem Eintrag Was-wäre-wenn-Analyse zu finden.

6.1 Integrierte Analyse-Methoden Tabelle 6-1. Liste integrierter Analyse-Methoden Analyse-Methode Anwendung SzenarioManager

Erlaubt die Darstellung verschiedener, auch sehr komplexer Szenarien mit festgelegten Werten

Zielwertsuche

Erlaubt die Variation von Parametern, die in Abhängigkeit eines Zielwertes stehen

Datentabelle

Zeigt gleichzeitig die Ergebnisse unterschiedlicher Eingaben

Prognoseblatt

Erstellt Datentrends auf einem zusätzlichen Arbeitsblatt

In den nachfolgenden Unterkapiteln betrachten wir den Einsatz dieser Methoden im strategischen und operativen Controlling anhand einfacher Beispiele.

6.1.1 Szenarien Ein Unternehmen möchte ein neues Produkt auf den Markt bringen und bestimmt durch eine vereinfachte Kalkulation (Bild 6-1) den Verkaufspreis. Nach der Festlegung, mit welchen Kosten die einzelnen Bereiche beteiligt sind, wird im zweiten Schritt aus der zu fertigenden Stückzahl unter Beachtung von Gewinn und Steuern der Preis des einzelnen Produkts bestimmt.  2-12-06-01_Szenarien.xlsm Den größten Anteil am Verkaufspreis tragen die Einzelkosten der Abteilungen. Es ist also denkbar, dass die genannten Kosten unter Annahme von diversen Einflüssen größer oder kleiner werden könnten. Neben den vorgegebenen Kosten werden daher in weiteren Spalten Kosten für ein Worst-Case-Szenario bzw. für ein Best-Case-Szenario aufgeführt. © Springer Fachmedien Wiesbaden GmbH, ein Teil von Springer Nature 2023 H. Nahrstedt, Excel + VBA für Controller, https://doi.org/10.1007/978-3-658-43157-0_6

Bild 6-1. Beispiel einer vereinfachten Preiskalkulation

Beim ersten Worst-Case nehmen Materialkosten einen steigenden Einfluss auf die Kalkulation. Beim zweiten Worst-Case sind es steigende Löhne. Die Kosten für die BestCase-Szenarien stehen für einen gegenläufigen Trend. Tabelle 6-2. Liste der Szenarien-Werte Zellen Aktuell Worst Case 1 Worst Case 2 Best Case 1 Best Case 2 B2

12.400 12.400

15.200

12.400

9.900

B3

10.200 13.400

10.200

6.900

10.200

B4

11.500 12.600

13.800

10.700

7.900

B5

5.400

5.400

6.200

5.400

4.600

B6

9.400

9.400

11.000

9.400

6.300

B7

10.400 12.100

13.400

9.300

8.900

Der Bereich B2:B7 erhält den Bereichsnamen Einzelkosten und die Zelle B17 Verkaufspreis. Im Register Daten / Prognose wird die Auswahlliste Was-wäre-wenn-Analyse gewählt. Darin befindet sich der Szenario-Manager, in dem die unterschiedlichen Szenarien durch Hinzufügen und Bearbeiten erstellt werden können (Bild 6-2). Mit der Schaltfläche Hinzufügen öffnet sich das Dialogfenster Szenario hinzufügen. Nach der Eingabe eines Szenario Namens, werden die veränderbaren Zellen angegeben. Dann folgt die Eingabe der Szenario Werte. Nach der Erstellung aller Szenarien wird mit der Schaltfläche Zusammenfassung ein Dialogfenster (Bild 6-3) gezeigt. Es erlaubt die Wahl zwischen einem Arbeitsblatt-Bericht und einer Pivot-Tabelle. Wichtig ist die Angabe der Ergebniszelle(n).

272

|

Analyse-Methoden

Bild 6-2. Szenario-Manager

Bild 6-3. Szenario Bericht bestimmen

Mit der Bestätigung wird ein Szenario Bericht auf einem gesonderten Blatt erstellt (Bild 6-4).

Bild 6-4. Szenario Bericht (farblich verändert)

Eine Marktanalyse mit den Szenarien Werten kann wieder einen erheblichen Einfluss auf das Vorhaben ausüben. Die Erstellung von Szenarien unter VBA ist um ein Vielfaches leichter.

6.1 Integrierte Analyse-Methoden

|

273

Codeliste 6-1. Prozedur erstellt einen Szenario Bericht Sub SzenarienAnalyse() Dim wbkTemp As Workbook Dim wshTemp As Worksheet Dim scnTemp As Scenario Dim vTemp As Variant Dim sName As String Dim iCount As Integer 'Excel-Objekte Set wbkTemp = ThisWorkbook Set wshTemp = wbkTemp.Worksheets("Szenarien Einzelkosten") 'alte Szenarien löschen For Each scnTemp In wshTemp.Scenarios scnTemp.Delete Next scnTemp 'neue Szenarien anlegen For iCount = 1 To 4 sName = Cells(1, 4 + iCount) vTemp = Range(sName) ActiveSheet.Scenarios.Add _ Name:=sName, _ ChangingCells:="Einzelkosten", _ Values:=vTemp, _ Comment:="", _ Locked:=True, _ Hidden:=False Next iCount 'Report erstellen ActiveSheet.Scenarios.CreateSummary _ ReportType:=xlStandardSummary, _ ResultCells:=Range("B16") End Sub

Zur Visualisierung hätte ich gerne das Verbunddiagramm genommen. Leider können dort nur maximal fünf Säulen erstellt werden. Meine Wahl (Codeliste 6-2) fiel daher auf das Liniendiagramm. Es kann deutlich mehr Datenreihen aufnehmen und die Darstellung des Verkaufspreises auf der Sekundärachse ist auch möglich (Bild 6-5).

Bild 6-5. Visualisierte Szenarien

274

|

Analyse-Methoden

Codeliste 6-2. Prozedur visualisiert Szenarien mit einem Liniendiagramm Sub SzenarienDiagramm() Dim wbkTemp As Workbook Dim wshTemp As Worksheet Dim shpTemp As Shape Dim chrTemp As Chart Dim rngDaten As Range Dim iCount As Integer Dim sDaten As String Dim sNum As String 'Excel-Objekte Set wbkTemp = ThisWorkbook Set wshTemp = wbkTemp.Worksheets("Szenariobericht") 'Diagramm erstellen Set shpTemp = wshTemp.Shapes.AddChart2(227, xlLine) Set chrTemp = shpTemp.Chart With chrTemp 'Diagramm und Beschriftung .SetSourceData Source:=Range("D6:H6") .FullSeriesCollection(1).XValues = "=Szenariobericht!D3:H3" .FullSeriesCollection(1).AxisGroup = 1 .HasTitle = True .ChartTitle.Text = "Szenarien" .Axes(xlValue, xlPrimary).HasTitle = True .Axes(xlValue, xlPrimary).AxisTitle.Characters.Text = _ "Kosten / Abteilung" 'weitere Datenreihen For iCount = 2 To 6 sNum = Trim(Str(iCount + 5)) sDaten = "=Szenariobericht!D" & sNum & ":H" & sNum .SeriesCollection.NewSeries .FullSeriesCollection(iCount).Values = sDaten Next iCount 'Verkaufspreis .SeriesCollection.NewSeries With .FullSeriesCollection(7) .Values = "=Szenariobericht!D13:H13" .AxisGroup = 2 With .Format.Line .ForeColor.RGB = RGB(255, 0, 0) .DashStyle = msoLineSysDash End With End With .Axes(xlValue, xlSecondary).TickLabels.NumberFormat = _ "#.##0,00 €" .Axes(xlValue, xlSecondary).HasTitle = True .Axes(xlValue, xlSecondary).AxisTitle.Characters.Text = _ "Verkaufspreis" 'Legende .FullSeriesCollection(1).Name = "=""Entwicklung""" .FullSeriesCollection(2).Name = "=""Material""" .FullSeriesCollection(3).Name = "=""Fertigung""" .FullSeriesCollection(4).Name = "=""Verwaltung""" .FullSeriesCollection(5).Name = "=""Marketing""" .FullSeriesCollection(6).Name = "=""Vertrieb""" .FullSeriesCollection(7).Name = "=""Verkaufspreis""" .SetElement (msoElementLegendRight) End With 'aufräumen Set shpTemp = Nothing

6.1 Integrierte Analyse-Methoden

|

275

Set chrTemp = Nothing Set wbkTemp = Nothing Set wshTemp = Nothing End Sub

6.1.2 Zielwertsuche Im Gegensatz zu den üblichen Analyse-Methoden, die aus bekannten Parameterwerten ein unbekanntes Ergebnis liefern, ist die Zielwertsuche eine Methode, die ausgehend vom Ergebnis nach den erforderlichen Parameterwerten fragt.  2-12-06-02_Zielwertsuche.xlsm Als Beispiel liegt eine Kreditberechnung mit Ratentilgung vor (Bild 6-6). Mit dem vorgesehenen Tilgungsbetrag von 12.000 € wird nicht das optimale Ergebnis erreicht, da am Ende der Laufzeit noch ein Restbetrag von 8.000 € bleibt.

Bild 6-6. Kredit mit vorgegebenem Tilgungsbetrag Tabelle 6-3. Bereichsnamen und Formeln im Tilgungsplan Bereich Name

Bereich Formel

Bereich

Formel

C1

Anfangskapital B8

=Anfangskapital F8

=B8-D8

C2

Endkapital

C8

=B8*Zinssatz

B9

=F8

C3

Zinssatz

D8

=Tilgung

C9:F9

=C8:F8

C4

Laufzeit

E8

=C8+D8

B10:F13 =B9:F9

C5

Tilgung

Um dieses Problem zu lösen, bietet Excel die Methode der Zielwertsuche: x x

276

Die Zelle mit dem letzten Endkapital (F13) markieren Die Zielwertsuche unter dem Register Daten / Prognose mit Was-wäre-wenn-Analyse aufrufen (Bild 6-7)

|

Analyse-Methoden

Bild 6-7. Zielwertsuche

x x

Als Zielwert für die Zielzelle den Wert Null und als veränderbare Zelle den Tilgungsbetrag C5 eintragen Das Ergebnis ist ein Tilgungsbetrag (Bild 6-8), der nach sechs Jahren Laufzeit als Endkapitalwert den Wert Null liefert.

Bild 6-8. Tilgung mit Endkapital Null

Die Zielwertsuche in VBA besteht nur aus einer Anweisung (Codeliste 6-3). Codeliste 6-3. Prozedur führt die Zielwertsuche durch Sub ZielWertSuche() Dim wbkTemp As Dim wshTemp As Dim shpTemp As Dim chrTemp As Dim rngDaten As Dim sDaten As Dim sNum As

Workbook Worksheet Shape Chart Range String String

'Excel-Objekte Set wbkTemp = ThisWorkbook Set wshTemp = wbkTemp.Worksheets("Tilgungsplan") 'Zielwertsuche With wshTemp .Range("F13").Select .Range("F13").GoalSeek Goal:=0, _

6.1 Integrierte Analyse-Methoden

|

277

ChangingCell:=Range("C5") End With 'aufräumen Set wbkTemp = Nothing Set wshTemp = Nothing End Sub

Zinsen- und Tilgungsbeträge lassen sich sehr anschaulich in einem Säulendiagramm darstellen (Bild 6-9). Sie werden markiert und ein gestapeltes Säulendiagramm aufgerufen.

Bild 6-9. Tilgung mit Endkapital Null Codeliste 6-4. Prozedur erstellt ein gestapeltes Säulendiagramm zur Zielwertsuche Sub CreateDiagramm() Dim wbkTemp As Dim wshTemp As Dim shpTemp As Dim chrTemp As Dim rngDaten As Dim sDaten As Dim sNum As

Workbook Worksheet Shape Chart Range String String

'Excel-Objekte Set wbkTemp = ThisWorkbook Set wshTemp = wbkTemp.Worksheets("Tilgungsplan") 'Diagramm erstellen Set shpTemp = wshTemp.Shapes.AddChart2(297, xlColumnStacked) Set chrTemp = shpTemp.Chart With chrTemp 'Diagramm und Beschriftung .SetSourceData Source:=Range("C8:D13") .HasTitle = True .ChartTitle.Text = "Zins- und Tilgungsbeträge" .FullSeriesCollection(1).Name = Range("C7") .FullSeriesCollection(2).Name = Range("D7") .SetElement (msoElementLegendTop) End With Set shpTemp = Nothing Set chrTemp = Nothing Set wbkTemp = Nothing Set wshTemp = Nothing End Sub

278

|

Analyse-Methoden

6.1.3 Datentabellen Das vorangegangene Kapitel hat gezeigt, dass unterschiedliche Werte in nur einer Zelle erhebliche Veränderungen bewirken können. Excel stellt dazu unter der Was-wäre-wennAnalyse die Methode Datentabelle bereit. Mit ihr können die Ergebnisse mehrerer Eingaben gleichzeitig dargestellt werden. Die Methode ist nicht zu verwechseln mit einer Tabelle, wie wir sie unter Kapitel 3.4 definiert haben. Datentabelle mit einer Variablen  2-12-06-03_Datentabelle.xlsm Als Anwendungsbeispiel betrachten wir noch einmal einen Kredit mit gleichbleibenden Zahlungen (Annuitätentilgung) (Bild 6-10).

Bild 6-10. Kreditparameter zur Annuitätentilgung

Die Zahlung lässt sich direkt mit der RMZ-Funktion bestimmen. Tabelle 6-4. Bereichsnamen und Formeln zum Kredit Bereich Name

Bereich Formel

B1

Anzahlung E2

B2

Zinssatz

B3

Laufzeit

B4

Darlehen

=RMZ(@Zinssatz/12;@Laufzeit;-@Darlehen+@Anzahlung)

Die Zahlung habe ich bewusst etwas abseits eingestellt (Bild 6-11), damit wir darum herum eine Datentabelle erstellen können. Denn uns interessieren verschiedene Zinssätze und die sich daraus ergebenden Zahlungen.

Bild 6-11. Berechnung der Zahlung

Natürlich könnten wir die entsprechenden Zinssätze jeweils eintragen und das Ergebnis notieren, doch einfacher wird es mit der Datentabelle. Dort tragen wir alle Zinssätze ein und markieren den Bereich D2:E10, alle Zinssätze zusammen mit der Formel und dem Ergebnisbereich.

6.1 Integrierte Analyse-Methoden

|

279

Unter Register Daten / Prognose wird die Was-wäre-wenn-Analyse aufgerufen und darunter Datentabelle gewählt. Damit erscheint ein Dialogfeld (Bild 6-12), in dem das Eingabefeld Werte aus Spalte: den Bereichsnamen Zinssatz erhält.

Bild 6-12. Anlegen einer Datentabelle

Die Ergebnisse bekommen abschließend das Währungsformat zugeordnet (Bild 6-13).

Bild 6-13. Ergebnisse in der Datentabelle Codeliste 6-5. Prozedur erstellt eine Datentabelle mit einer Variablen Sub Table1Var() Range("D2:E10").Select Selection.Table ColumnInput:=Range("B2") End Sub

Datentabelle mit zwei Variablen War im vorangegangenen Beispiel die Laufzeit fest vorgegeben, so soll sie jetzt ebenfalls als zweite Variable in die Bestimmung der Zahlungen eingehen. Entsprechend erhält die Datentabelle eine zweidimensionale Form (Bild 6-14).

280

|

Analyse-Methoden

Bild 6-14. Datentabelle für zwei Variable

Das Dialogfeld zur Datentabelle erhält die erforderlichen Angaben zum Zeilen- und Spaltenwert. Nach der Eingabebestätigung mit OK werden die Ergebnisse angezeigt, die ebenfalls noch das Währungsformat erhalten (Bild 6-15).

Bild 6-15. Ergebnisse im Datenfeld Codeliste 6-6. Prozedur erstellt eine Datentabelle mit einer Variablen Sub Table2Var() Range("E2:I10").Select Selection.Table _ RowInput:=Range("B3"), _ ColumnInput:=Range("B2") End Sub

Datentabelle mit mehr als zwei Variablen Obwohl Datentabellen für maximal zwei Variable ausgelegt sind, können durch einen Trick auch mehr als zwei verwendet werden. Eine Formel benutzt über die Zelladresse deren Inhalt. Einige Funktionen akzeptieren als Parameter auch Text. In einem Text kann auch mehr als ein Wert stehen, vorausgesetzt, sie sind durch ein Trennzeichen geteilt. Dies kann ein Semikolon sein, ein Schrägstrich oder ein anderes Sonderzeichen. Alle im Text verwendbaren Zeichen sind in einer ASCII-Tabelle durch einen Wert von 0 bis 255 codiert. Die Funktion =ZEICHEN(Codezahl) erstellt aus einer ASCII-Codezahl das zugehörige Zeichen. In der ASCII-Tabelle befinden sich auch Steuerzeichen, die eine Funktionalität besitzen, aber nicht sichtbar sind.

6.1 Integrierte Analyse-Methoden

|

281

Von besonderem Charme ist die Nutzung des LineFeeds (Tasten ALT + ENTER) mit dem ASCII-Codewert 10. Als Beispiel haben wir zwei Werte ″123,45″ und ″34,21″ vorliegen. Wenn wir sie mit diesem Steuerzeichen verbinden und in eine Zelle als Formel schreiben, dann werden sie untereinander dargestellt (Bild 6-16). Vorausgesetzt, die Zelle hat über ihr Kontextmenü unter Zellen formatieren und der Option Zeilenumbruch im Register Ausrichtung die Freigabe zum Zeilenumbruch.

Bild 6-16. Zwei Werte als Text in einer Zelle

Als Anwendungsbeispiel betrachten wir einen Investitionsplan (Bild 6-17), bei dem der Investitionswert über einen bestimmten Zeitraum durch Beträge zurückfließt. Das Besondere an dem Plan ist, dass sich Investition und Rückfluss eine Zelle teilen.

Bild 6-17. Investitionsplan

Zur Bestimmung der Rückflüsse dient eine Liste (Bild 6-18).

Bild 6-18. Bestimmung der Rückflüsse (Zeilen ausgeblendet) Tabelle 6-5. Bereichsnamen und Formeln zur Investition Bereich Name

Formel

B1

Werte

=″-125.000 €″ & ZEICHEN(10) & ″5.000 €″

B2

LZeit

282

|

Analyse-Methoden

A5:A17 Jahr B5:B17 Rückfluss B5

=LINKS(Werte;-1+FINDEN(ZEICHEN(10);Werte))*1

B6:B17

=WENN(Jahr= 3 And Target.Column 0 Then sNum1 = sMkr(1, iMkr) sNum2 = sMkr(2, iMkr) 'Knoten1 vorhanden ? Set objKtn = colKnoten.Item("G_" & sNum1) If objKtn.lPosX = 0 Then 'erstelle Knoten1 Set objKtn = New clsKnoten With objKtn .sTitel = sNum1 .sNum = sNum1 .lPosX = lX .lPosY = lY .Create

9.2 Planungs-Methoden

|

433

End With colKnoten.Add objKtn, "G_" & sNum1 Err.Number = 0 Else 'übernehme x-Position lX = objKtn.lPosX iZeit = Val(objKtn.sZeit) End If Set objKtn = Nothing 'Knoten2 vorhanden? Set objKtn = colKnoten.Item("G_" & sNum2) If objKtn.lPosX = 0 Then Set objKtn = New clsKnoten With objKtn .sTitel = sNum2 .sNum = sNum2 .lPosX = lX + 200 .lPosY = lY .sZeit = iZeit + Val(sMkr(4, iMkr)) .Create End With colKnoten.Add objKtn, "G_" & sNum2 Else iZeit1 = Val(objKtn.sZeit) iZeit2 = iZeit + Val(sMkr(4, iMkr)) If iZeit2 > iZeit1 Then objKtn.sZeit = Str(iZeit2) wshTemp.Shapes("R2_" & sNum2).TextFrame. _ Characters.Text = Str(iZeit2) End If End If Set objKtn = Nothing 'Verbinder Set objLine = New clsLine With objLine .sNum1 = sNum1 .sNum2 = sNum2 .iZeit = Val(sMkr(4, iMkr)) .Create End With sMkr(3, iMkr) = 0 'Verb. bearbeitet 'suche nächste Verb. von Knoten2, wenn vorhanden Do While (iMkr < iMax) And Not (sNum2 = sMkr(1, iMkr)) iMkr = iMkr + 1 Loop Else iMkr = iMkr + 1 End If Loop While iMkr < iMax 'gehe wieder rückwärts bis Verb. nicht bearbeitet lY = lY + 100 Do iDa = 0 iMkr = iMkr - 1 sNum1 = sMkr(1, iMkr) For Each objKtn In colKnoten sNumx = objKtn.sNum If sNumx = sNum1 Then If sMkr(3, iMkr) = 1 Then iDa = iMkr Exit For

434

|

Strategisches Projekt-Controlling

End If End If Next If iDa > 0 Then iMkr = iDa Loop While iMkr > 0 And iDa = 0 Loop While iMkr > 0 'aufräumen Set wbkTemp = Nothing Set wshTemp = Nothing Set objKtn = Nothing Set colKnoten = Nothing End Sub

Für diese Visualisierung benutzen wir ein Objektmodell mit den Klassen Knoten und Linie. Wer in die objektorientierte Programmierung tiefer einsteigen möchte, findet das Beispiel und viele Erläuterungen dazu unter [15]. Codeliste 9-8. Eigene Klasse Knoten im Klassenmodul clsKnoten Public Enum Maße lBreite = 30 lHöhe = 30 End Enum Public sNum As Public sTitel As Public lPosX As Public lPosY As Public sZeit As

String String Long Long String

Sub Create() Dim shpR1 Dim shpR2 Dim shpR3 Dim shpGroup

As As As As

Shape Shape Shape Shape

Set shpR1 = ActiveSheet.Shapes.AddShape _ (1, lPosX, lPosY, 2 * lBreite, lHöhe) With shpR1 .Name = "R1_" & sNum .TextFrame.Characters.Text = sNum .TextFrame.Characters.Font.ColorIndex = 1 .Fill.ForeColor.RGB = RGB(255, 255, 255) End With Set shpR2 = ActiveSheet.Shapes.AddShape _ (1, lPosX, lPosY + lHöhe, lBreite, lHöhe) With shpR2 .Name = "R2_" & sNum .TextFrame.Characters.Text = sZeit .TextFrame.Characters.Font.ColorIndex = 1 .Fill.ForeColor.RGB = RGB(255, 255, 255) End With Set shpR3 = ActiveSheet.Shapes.AddShape _ (1, lPosX + lBreite, lPosY + lHöhe, lBreite, lHöhe) With shpR3 .Name = "R3_" & sNum .TextFrame.Characters.Font.ColorIndex = 1 .Fill.ForeColor.RGB = RGB(255, 255, 255) End With ActiveSheet.Shapes.Range(Array _ (shpR1.Name, shpR2.Name, shpR3.Name)).Select Set shpGroup = Selection.ShapeRange.Group shpGroup.Name = "G_" & sNum

9.2 Planungs-Methoden

|

435

With shpGroup With .Line .DashStyle = 1 .Weight = 0.25 End With With .TextFrame .HorizontalAlignment = xlHAlignCenter .VerticalAlignment = xlVAlignCenter End With End With Set shpR1 = Nothing Set shpR2 = Nothing Set shpR3 = Nothing Set shpGroup = Nothing End Sub

Codeliste 9-9. Eigene Klasse Linie im Klassenmodul clsLinie Public sNum1 Public sNum2 Public iZeit

As String As String As Integer

Sub Create() ActiveSheet.Shapes.AddConnector _ (1, 10, 10, 10, 10).Select Selection.Name = "L_" & sNum1 & "-" & sNum2 Selection.ShapeRange.ConnectorFormat. _ BeginConnect ActiveSheet.Shapes("R1_" & sNum1), 4 Selection.ShapeRange.ConnectorFormat. _ EndConnect ActiveSheet.Shapes("R1_" & sNum2), 2 Selection.ShapeRange.Line.EndArrowheadStyle = 2 'Pfeilgestaltung 'Selection.ShapeRange.Line.EndArrowheadLength = msoArrowheadLong 'Selection.ShapeRange.Line.EndArrowheadWidth = msoArrowheadWide End Sub

9.2.3 Gantt-Diagramm Ein Gantt-Diagramm stellt die Abfolge von Aktivitäten in Form von Balken dar. Die Aktivitäten werden auf der Ordinate untereinander aufgeführt. Die Abszisse ist in der Regel eine Zeitschiene, sodass dort die Dauer der Aktivität von ihrem Start bis zum Ende eingetragen wird (Bild 9-23).

Bild 9-23. Der Aufbau eines Gantt-Diagramms

Durch die Anordnung der Aktivitäten können ebenfalls Abhängigkeiten dargestellt werden.  2-12-09-08_GanttDiagramm.xlsm

436

|

Strategisches Projekt-Controlling

Als Beispiel betrachten wir noch einmal die Aktivitätenliste (Bild 9-24), diesmal mit festen Terminen.

Bild 9-24. Aktivitätenliste

Der Starttermin für die Aktivitäten 2 und 3 wird mit STRG + Punkt als aktuelles Datum eingefügt. Alle anderen Termine ergeben sich nach der Dauer der Aktivität und der Verknüpfung. Zur Visualisierung markieren wir den Bereich A2:B10 und wählen als Diagrammform Gestapelte Balken (Bild 9-25).

Bild 9-25. Starttermine im gestapelten Balkendiagramm

Im nächsten Schritt wird aus dem Kontextmenü des Diagramms die Methode Daten auswählen aufgerufen und eine weitere Datenreihe Dauer hinzugefügt (Bild 9-26). Mit einem Mausklick auf die Datenreihe Starttermin im Diagramm werden die Balkenelemente markiert. Im Kontextmenü wird die Methode Datenreihen formatieren gewählt und im Dialogfenster wird unter der Gruppe Füllung die Option Keine Füllung gewählt (Bild 9-27).

9.2 Planungs-Methoden

|

437

Bild 9-26. Starttermine und Dauer im Balkendiagramm

Bild 9-27. Ausblenden der Starttermin-Balken

Die Datumsachse wird nun enger formatiert, sodass der Bereich die Balken umfasst. Die Zeitachse wird in der Beschriftung markiert und über das Kontextmenü wird die Methode Achse formatieren aufgerufen. Im Dialogfenster werden die Datumswerte als Minimum und Maximum fest eingetragen. Mit einem Mausklick auf die Beschriftung der Aktivitätsachse wird über das Kontextmenü noch einmal die Methode Achse formatieren aufgerufen. Allerdings wird hier im Dialogfenster die Option Kategorien in umgekehrter Reihenfolge ausgewählt (Bild 9-28).

438

|

Strategisches Projekt-Controlling

Bild 9-28. Umstellung der Reihenfolge

Im letzten Schritt wird das Design des Diagramms über das Kontextmenü noch etwas angepasst (Bild 9-29).

Bild 9-29. Gantt-Diagramm

Die Prozedur CreateGanttDiagramm erzeugt das Gantt-Diagramm mit den zuvor beschriebenen Schritten. Codeliste 9-10. Prozedur erstellt ein Gantt-Diagramm Sub GreateGanttDiagramm() Dim wbkTemp As Workbook Dim wshTemp As Worksheet Dim shpTemp As Shape Dim chrTemp As Chart 'Excel-Objekte Set wbkTemp = ThisWorkbook Set wshTemp = wbkTemp.Worksheets("Aktivitäten") 'alle Grafiken auf dem Arbeitsblatt löschen ActiveSheet.DrawingObjects.Delete 'Diagramm Set shpTemp = wshTemp.Shapes.AddChart2(297, xlBarStacked) Set chrTemp = shpTemp.Chart With chrTemp .SetSourceData _

9.2 Planungs-Methoden

|

439

Source:=Range("Aktivitäten!$A$2:$B$10") .HasTitle = False 'zweite Datenreihe Dauer .SeriesCollection.NewSeries .FullSeriesCollection(2).Name = "=""Dauer""" .FullSeriesCollection(2).Values = "=Aktivitäten!$C$2:$C$10" 'erste Datenreihe ausblenden .FullSeriesCollection(1).Format.Fill.Visible = msoFalse 'Datumsachse .Axes(xlValue).Format.Fill.Visible = msoFalse .Axes(xlValue).MajorUnit = 10 .Axes(xlValue).MinimumScale = wshTemp.Cells(2, 2) - 2 .Axes(xlValue).MaximumScale = wshTemp.Cells(10, 4) + 2 .Axes(xlValue).MajorUnit = 2 'Aktivitätsachse .Axes(xlCategory).Select .Axes(xlCategory).ReversePlotOrder = True .Axes(xlValue).Select 'Application.Width = 882 'Application.Height = 666.75 .Axes(xlValue).TickLabels.Orientation = 75 .ChartGroups(1).GapWidth = 10 With .FullSeriesCollection(2).Format.Fill .Visible = msoTrue .ForeColor.RGB = RGB(0, 176, 240) .Transparency = 0 .Solid End With With .FullSeriesCollection(2).Format.Shadow .Type = msoShadow21 .Visible = msoTrue .Style = msoShadowStyleOuterShadow .Blur = 4 .RotateWithShape = msoFalse .ForeColor.RGB = RGB(0, 0, 0) .Transparency = 0.6 .Size = 104 End With .FullSeriesCollection(2).ApplyDataLabels .FullSeriesCollection(2).DataLabels.NumberFormat = "#"" Tage""" .FullSeriesCollection(2).Points(9).DataLabel.NumberFormat = "#"" Tag""" End With 'aufräumen Set wbkTemp = Nothing Set wshTemp = Nothing Set shpTemp = Nothing Set chrTemp = Nothing End Sub

9.2.4 Ressourcenplanung Der Begriff Ressource stammt aus der französischen Sprache (la Ressource) und beschreibt Elemente die zur Durchführung einer Aktivität erforderlich sind. Darunter werden meist Personen und ihre Arbeitszeit, aber auch Betriebsmittel, Rohstoffe, Energiemengen und letztlich auch Finanzen verstanden. Die Zuteilung von Ressourcen wird als Ressourcenallokation bezeichnet. Je nach Einsatzgebiet finden sich Pläne in den unterschiedlichsten Ausprägungen.  2-12-09-09_Datumsfunktionen.xlsm

440

|

Strategisches Projekt-Controlling

In vielen ist die zeitliche Betrachtung ein wichtiger Parameter, sodass Wochen- und Arbeitstage eine große Rolle spielen. Auch hier liefert Excel grundlegende Funktionen. Tabelle 9-4. Liste wichtiger Datums-Funktionen Excel-Funktion

VBA-Anweisung

Anwendung

WOCHENTAG

WEEKDAY

bestimmt aus dem Datumswert den Wochentag als Zahlenwert

ARBEITSTAG

WORKDAY

liefert ein Datum, das von einem Startdatum aus um eine Anzahl Arbeitstage vor oder zurückliegt

NETTOARBEITSTAGE

NETWORKDAYS gibt die Anzahl Arbeitstage in einem Intervall

ARBEITSTAG.INTL

WORKDAY.INTL gibt die fortlaufende Zahl des Datums vor oder nach einer bestimmten Anzahl Arbeitstagen mit benutzerdefinierten Wochenendparametern zurück

NETTOARBEITSTAG. INTL

NETWORKDAYS. gibt die Anzahl der vollen Arbeitstage zwischen zwei Datumsangaben zurück INTL

Syntax zur WOCHENTAG-Funktion: =WOCHENTAG(Datumswert;[Rückgabetyp]) Der Rückgabetyp bestimmt den ersten Tag der Woche und damit den Rückgabewert der Funktion. Tabelle 9-5. Funktionswerte zur Funktion WOCHENTAG Typ

Funktionswerte

1

1 (Sonntag) – 7 (Samstag)

2

1 (Montag) – 7 (Sonntag)

3

0 (Montag) – 6 (Sonntag)

11

1 (Montag) – 7 (Sonntag)

12

1 (Dienstag) – 7 (Montag)

13

1 (Mittwoch) – 7 (Dienstag)

14

1 (Donnerstag) – 7 (Mittwoch)

15

1 (Freitag) – 7 (Donnerstag)

16

1 (Samstag) – 7 (Freitag)

17

1 (Sonntag) – 7 (Samstag)

Aufgabe zur WOCHENTAG-Funktion: Ein Controller soll in einer Datumsliste die Wochenenden farblich kennzeichnen (Bild 9-30).

9.2 Planungs-Methoden

|

441

Bild 9-30. Anwendung der Funktion WOCHENTAG Tabelle 9-6. Bereichsname und Formel in der WOCHENTAG-Anwendung Bereich Bereichsname Formel D1:D6 E1:E6

Liste =WOCHENTAG(Liste;2)

Codeliste 9-11. Prozeduren zur WOCHENTAG-Anwendung Sub NamenVergeben() Call NamenDelete With ActiveWorkbook.Names .Add Name:="Liste", RefersTo:=Range("D1:D6") End With End Sub Sub FormelnSchreiben() Range("E1:E6").FormulaArray = "=WEEKDAY(Liste,2)" End Sub Sub WerteZuweisen() Dim iCount As Integer Dim iOp As Integer For iCount = 1 To 6 iOp = Weekday(Cells(iCount, 4), 2) Cells(iCount, 5) = iOp Next iCount End Sub

Syntax zur ARBEITSTAG-Funktion: =ARBEITSTAG(Anfangsdatum; Tage; [freie Tage]) Darin wird mit Tage die Anzahl der Tage genannt, die nicht an einem Wochenende oder Feiertag liegen. Ein positiver Wert berechnet ein zukünftiges und ein negativer Wert ein zurückliegendes Datum. Freie Tage stellen eine Liste von Datumsangaben dar. Aufgabe zur ARBEITSTAG-Funktion: Ein Controller soll ein Datum bestimmen, das ab einem Startdatum um eine Anzahl Arbeitstage vor bzw. zurück liegt (Bild 9-31).

442

|

Strategisches Projekt-Controlling

Bild 9-31. Anwendung der Funktion ARBEITSTAG Tabelle 9-7. Formel in der ARBEITSTAG-Anwendung Bereich Formel E2

Hinweis

=ARBEITSTAG(C2;D2) Übertragen auf E3:E7

Codeliste 9-12. Prozeduren zur ARBEITSTAG-Anwendung Sub NamenVergeben() Call NamenDelete With ActiveWorkbook.Names .Add Name:="Liste", RefersTo:=Range("D1:D6") End With End Sub Sub FormelnSchreiben() Dim iCount As Integer Dim sOp As String For iCount = 2 To 7 sOp = "=WORKDAY(" & Cells(iCount, 3).Address & _ "," & Cells(iCount, 4).Address & ")" Cells(iCount, 5).Formula = sOp Next iCount End Sub Sub WerteZuweisen() Dim iCount As Integer Dim vDatum As Variant Dim vTage As Variant Dim vOp As Variant For iCount = 2 To 7 vDatum = Cells(iCount, 3) vTage = Cells(iCount, 4) vOp = WorksheetFunction.WorkDay(vDatum, vTage) Cells(iCount, 5) = vOp Next iCount End Sub

Syntax zur NETTOARBEITSTAGE-Funktion: NETTOARBEITSTAGE(Anfangsdatum, Enddatum; [freie Tage]) Gibt die Anzahl der Arbeitstage in einem Zeitintervall zurück. Nicht zu den Arbeitstagen gezählt werden Wochenenden sowie die Tage, die als Ferien (Feiertage) angegeben sind. Aufgabe zur NETTOARBEITSTAGE-Funktion:

9.2 Planungs-Methoden

|

443

Ein Controller muss die Anzahl der Nettoarbeitstage bestimmen, die durch ein Zeitintervall (Starttermin, Endtermin) und die Datumangaben der freien Arbeitstage vorgegeben sind (Bild 9-32).

Bild 9-32. Anwendung der Funktion NETTOARBEITSTAGE Tabelle 9-8. Bereichsname und Formel in der NETTOARBEITSTAGE-Anwendung Bereich Bereichsname Formel

Format

C2:C10 Freie_Tage D2

=NETTOARBEITSTAGE(A2;B2;freie_Tage) # "Tage"

D3:D10

D2 übertragen

Codeliste 9-13. Prozeduren zur NETTOARBEITSTAGE-Anwendung Sub NamenVergeben() Call NamenDelete With ActiveWorkbook.Names .Add Name:="freie_Tage", RefersTo:=Range("C2:C10") End With End Sub Sub FormelnSchreiben() Dim iCount As Integer Dim sOp As String For iCount = 2 To 7 Cells(iCount, 4).FormulaR1C1 = _ "=NETWORKDAYS(RC[-3],RC[-2],freie_Tage)" Next iCount End Sub Sub WerteZuweisen() Dim iCount As Integer Dim vVon As Variant Dim vBis As Variant Dim vOp As Variant For iCount = 2 To 7 vVon = Cells(iCount, 1) vBis = Cells(iCount, 2) vOp = WorksheetFunction.NetworkDays(vVon, vBis, [freie_Tage]) Cells(iCount, 4) = vOp Next iCount End Sub

444

|

Strategisches Projekt-Controlling

9.2.5 Kapazitätsplanung Bei der Kapazitätsplanung geht es darum, die vorhandenen Ressourcen zu einem möglichst hohen Grad auszulasten. Eine Ressource, z. B. eine Maschine oder eine Person, erhält mehrere Aufgaben. Sie ist jedoch nur in der Lage, einen Teil des Aufwandes pro Stunde, pro Tag, etc. zu erledigen.  2-12-09-10_KapazitaetsPlanung.xlsm Als Anwendungsbeispiel betrachten wir eine Abteilung mit acht Aufgaben A – H (Bild 9-33).

Bild 9-33. Formular der Kapazitätsplanung (Zeilen 30-45) ausgeblendet

Da die Funktion ARBEITSTAG Probleme mit der Nutzung von Bereichsnamen hat, ist dieses Beispiel mit Bereichsnamen und Zelladressen in den Formeln aufgebaut. Es gibt somit nur zwei Bereichsnamen. Mithilfe des Offsets lässt sich das aktuelle Datum um Tage verschieben. Die Zeitleiste beginnt dann mit dem ersten aus der Summe bestimmten Tag und es werden lediglich die Arbeitstage dargestellt. Tabelle 9-9. Formeln zur Kapazitätsplanung Bereich

Formel

B3

Aktuelles_Datum

B4

Offset

A11

= WENN(WOCHENTAG(MIN(Aktuelles_Datum+Offset-1);2)=6; MIN(Aktuelles_Datum+Offset+1);

9.2 Planungs-Methoden

|

445

WENN(WOCHENTAG(MIN(Aktuelles_Datum+Offset-1);2)=7; MIN(Aktuelles_Datum+Offset);MIN(Aktuelles_Datum+Offset-1))) A12 x A13:A60

= WENN(WOCHENTAG(A11;2)=5;A11+3;A11+1)

B10 x C10:I10

= B9/$B$2

B11 x B11:I50

= WENN(ODER(B$90; B$7-ARBEITSTAG(B$6;B$8/B$9;2)-2;"")

A11

= WENN(WOCHENTAG(MIN(Aktuelles_Datum+Offset1);2)=6; MIN(Aktuelles_Datum+Offset2);WENN(WOCHENTAG( MIN(Aktuelles_Datum+Offset1);2)=7;MIN(Aktuelles_Datum+ Offset3);MIN(Aktuelles_Datum+Offset-1)))

9.2 Planungs-Methoden

|

447

A12 x A13:A60

= WENN(WOCHENTAG(A11;2)=5;A11+3;A11+1)

B11 x B11:I60

=WENN(ODER(B$80)*((B12-B11)*B$8)+(C12-C11>0)*((C12C11)*C$8) +(D12-D11>0)*((D12-D11)*D$8)+(E12+(F12-F11>0)*((F12E11>0)*((E12-E11)*E$8) +(H12F11)*F$8)+(G12-G11>0)*((G12-G11)*G$8) H11>0)*((H12-H11)*H$8)+(I12-I11>0)*((I12-I11)*I$8)

9.2.7 Kostenplanung Bei der Kostenplanung geht es darum, anfallende Kosten zu bestimmen bzw. laufende Kosten zu überwachen. Eine Kostenüberwachung kann mit ähnlichem Aufbau wie in den beiden vorhergehenden Beispielen aufgebaut werden. Hier wird ein Formular zur Kostenbestimmung besprochen.  2-12-09-12_KostenPlanung.xlsm Im ersten Schritt werden Arbeitsblätter der verschiedenen Ressourcen mit ihren Kostensätzen angelegt. Bild 9-36 zeigt eine vereinfachte Teamliste.

Bild 9-36. Teamliste (Zeilen 5-18 ausgeblendet)

Bild 9-37 zeigt eine vereinfachte Produktionsliste.

Bild 9-37. Produktionsliste (Zeilen 5-18 ausgeblendet)

Bild 9-38 zeigt eine vereinfachte Liste sonstiger Kosten.

448

|

Strategisches Projekt-Controlling

Bild 9-38. Sonstige Kostensätze (Zeilen 5-8 ausgeblendet)

Alle Arbeitsblätter mit Kostensätzen erhalten für den Datenbereich (ohne Überschriften) einen aussagekräftigen Bereichsnamen, in diesem Fall sind es Team, Produktion und Sonstiges. Der eigentliche Kostenplan hat die in Bild 9-39 dargestellte Form.

Bild 9-39. Auszug aus dem Formular der Kostenplanung

In den Spalten A und B werden die Teilaufgaben des Projekts klassifiziert und benannt. Die Spalten C bis I sind zur Bestimmung der Personalkosten eingeteilt. Die Spalten C bis H werden markiert und über das Menüregister Daten und der Gruppe Gliederung mit der Methode Gruppierung zusammengefasst. Damit können die Spalten C bis H aus- bzw. eingeblendet werden. Die Spalte I weißt die Zeilensummen des Spaltenbereichs C:H aus. Während die Zeile 7 zur Aufnahme der Kostennummern dient, ist die Zeile 8 zur Einblendung der Kostensätze vorgesehen.

9.2 Planungs-Methoden

|

449

Tabelle 9-12. Bereichsnamen und Formeln zur Kostenplanung Bereich

Name

A2:C21

Produktion

A2:D21

Team

A2:C11

Sonstiges

Formel

C8 (C8:H8)

=WENN(C7="";"";SVERWEIS(C7;Personal;4))

C6 (C6:H6)

=WENN(C7>0;VERKETTEN(SVERWEIS(C7;Team;3);""; SVERWEIS(C7;Team;2);" "))

I10 (I10:I40)

= SUMMENPRODUKT(C10:H10;C$8:H$8)

Die Teilsummen und die Gesamtsumme der Teilaufgaben bestimmen sich nach der vorgenommenen Einteilung.

450

|

Strategisches Projekt-Controlling

KAPITEL 10

Operatives Projekt-Controlling

Das operative Projekt-Controlling sammelt und analysiert projektbegleitend regelmäßig Daten rund um das gesamte Projektgeschehen (Bild 10-1). Die Daten werden in kurzen regelmäßigen Abständen gesammelt, um ein aktuelles Reporting zu ermöglichen. Plan-Ist-Analysen liefern Vergleiche zwischen Projektfortschritt, gesetzten Terminen und Meilensteinen, zwischen Kostenverbrauch und Kostenplanung. Sie ergeben einen Überblick zur erbrachten Quantität und Qualität.

Bild 10-1. Steuerungsprinzip

Die Reporte bieten wertvolle und wichtige Entscheidungsgrundlagen für das Projektmanagement im Hinblick auf eine mögliche Verkürzung der Projektlaufzeit, der optimalen Verwendung der vorhandenen Ressourcen und der Bestimmung der noch benötigten Kosten bis zum Projektende.

10.1 Organisations-Methoden Es empfiehlt sich, den Aufwand (auch Effort genannt) in einem Projekt sorgfältig abzuwägen und die zur Verfügung stehenden Ressourcen richtig einzusetzen (Bild 10-2). Dazu gibt es die unterschiedlichsten Methoden.

© Springer Fachmedien Wiesbaden GmbH, ein Teil von Springer Nature 2023 H. Nahrstedt, Excel + VBA für Controller, https://doi.org/10.1007/978-3-658-43157-0_10

Bild 10-2. Aufwand in den Projektphasen

10.1.1 Projekt-Tracking Ein zentrales Tool zur Projekt-Kommunikation gilt als Arbeitsplattform für das gesamte Projekt-Team. Das, oft als Projekt-Tracking bezeichnete Tool, verwaltet Aufgaben und deren Prioritäten untereinander, zu erbringende und erbrachte Leistungen, Termine, Kosten, Aufwand der Ressourcen und der zur Durchführung der Aufgabe Verantwortliche im Team. Als Beispiel betrachten wir einen auszugsweisen SafetyCase_Taskplan (Bild 10-3). Um die Übersicht zu behalten, da eine Menge von Spalten erforderlich ist, wird auch hier die Gruppierung angewendet, teilweise sogar als Untergruppierung. Die Anordnung ist diesmal von links nach rechts.  2-12-10-01_ProjektTracking.xlsm

Bild 10-3. Auszug aus einem Entwicklungsplan zum Projekt-Tracking

452

|

Operatives Projekt-Controlling

Aufgeklappt ergeben sich mehrere Teillisten (Bild 10-4).

Bild 10-4. Auszug aus dem Entwicklungsplan mit Planungsdaten

Eine weitere Liste, in die die Werte aus der Entwicklungsliste übertragen werden (im Beispiel nicht ausgeführt) ist der Fortschrittsbericht (Bild 10-5).

Bild 10-5. Auszug aus dem Fortschrittsbericht

In einer solchen Liste werden mit bedingter Formatierung die Werte farblich eingeteilt und per Ampel wichtige Hinweise markiert. Doch hier beginnt bereit die Anpassung an das jeweilige Unternehmen. Auch die Anzahl weiterer Listen zu anderen Aspekten gehört dazu, sodass eine beachtliche Sammlung entsteht.

10.1.2 Kostengang- und Kostensummenlinie Mithilfe der Kostenlinien lassen sich die Kostenverläufe im Projekt sehr gut visualisieren. Sie werden in der Regel auf Gesamtprojektebene eingesetzt, sind aber auch auf Teilprojektebene ein hervorragendes Instrument. Mit einer Kostenganglinie werden monatlich anfallende Kosten im Projekt dargestellt und sie zeigt, welches Budget der Auftraggeber demzufolge zur Verfügung stellen muss. Die Kostensummenlinie ist dagegen eine kumulierte Darstellung der Kostenentwicklung im Projekt. Sie erlaubt den ganzheitlichen Überblick über den Kostenverlauf im Projekt. Werden

10.1 Organisations-Methoden

|

453

beiden Linien als Sollkurven die jeweiligen Istwerte gegenübergestellt, dann zeigt diese Methode ihre wahre Fähigkeit.  2-12-10-02_KostenGangSummenLinien.xlsm Das Anwendungsbeispiel (Bild 10-6) zeigt eine Tabelle mit den erfassten Werten für einen Jahreszeitraum.

Bild 10-06. Kostengang- und Kostensummenwerte Tabelle 10-1. Formeln zur Kostenliste Bereich Formel

Bereich Formel

B4

=B2

D4:M4

C4

=B4+C2 B5

Bereich Formel

C4 übertragen C5

=B5+C3

=B3

C5 übertragen

D5:M5

Die Prozedur CreateKostenlinien erzeugt die Visualisierung der Kostenlinien durch ein Liniendiagramm. Die vorliegende Liste darf keine Tabelle sein. Codeliste 10-1. Prozedur erzeugt Kostengang-Kostensummen-Diagramm Sub CreateKostenlinien() Dim wbkTemp As Workbook Dim wshTemp As Worksheet Dim shpTemp As Shape Dim chrTemp As Chart Set wbkTemp = ThisWorkbook Set wshTemp = wbkTemp.Worksheets("Kostenlinien") wshTemp.DrawingObjects.Delete wshTemp.Range("Kostenlinien!$B$1:$M$2").Select Set shpTemp = wshTemp.Shapes.AddChart2(227, xlLineMarkers) 'Diagramm Set chrTemp = shpTemp.Chart With chrTemp .SetSourceData _ Source:=Range("Kostenlinien!$B$2:$M$2") .FullSeriesCollection(1).Name = "=""Kostengang Soll""" .FullSeriesCollection(1).XValues = "=Kostenlinien!$B$1:$M$1" .SeriesCollection.NewSeries .FullSeriesCollection(2).Name = "=""Kostengang Ist""" .FullSeriesCollection(2).Values = "=Kostenlinien!$B$3:$M$3" .SeriesCollection.NewSeries .FullSeriesCollection(3).Name = "=""Kostensumme Soll""" .FullSeriesCollection(3).Values = "=Kostenlinien!$B$4:$M$4" .SeriesCollection.NewSeries .FullSeriesCollection(4).Name = "=""Kostensumme Ist""" .FullSeriesCollection(4).Values = "=Kostenlinien!$B$5:$M$5" .ChartGroups(1).GapWidth = 20 .HasTitle = True .ChartTitle.Text = "Kostenganglinien & Kostensummenlinien" 'Achsenbeschriftung

454

|

Operatives Projekt-Controlling

.Axes(xlCategory, xlPrimary).HasTitle = True .Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = _ "Zeitraum" .Axes(xlValue, xlPrimary).HasTitle = True .Axes(xlValue, xlPrimary).AxisTitle.Characters.Text = _ "Kosten" .Axes(xlValue).TickLabels.NumberFormat = "#.##0" 'Achsenaufteilung .ChartType = xlColumnClustered .FullSeriesCollection(1).ChartType = xlLine .FullSeriesCollection(1).AxisGroup = 1 .FullSeriesCollection(2).ChartType = xlLine .FullSeriesCollection(2).AxisGroup = 1 .FullSeriesCollection(3).ChartType = xlLine .FullSeriesCollection(3).AxisGroup = 1 .FullSeriesCollection(4).ChartType = xlLine .FullSeriesCollection(4).AxisGroup = 1 .FullSeriesCollection(3).AxisGroup = 2 .FullSeriesCollection(4).AxisGroup = 2 'Legende .SetElement (msoElementLegendBottom) 'Sekundärachse beschriften .SetElement (msoElementSecondaryValueAxisTitleAdjacentToAxis) .Axes(xlValue, xlSecondary).AxisTitle.Text = "Kostensumme" .Axes(xlValue, xlSecondary).TickLabels.NumberFormat = "#.##0" End With 'Diagrammhöhe ändern (in %) shpTemp.ScaleHeight 1.25, msoFalse, msoScaleFromTopLeft 'aufräumen Set wbkTemp = Nothing Set wshTemp = Nothing Set shpTemp = Nothing Set chrTemp = Nothing End Sub

Nachfolgend das erzeugte Diagramm (Bild 10-7).

Bild 10-7. Kostenlinien-Diagramm

10.1 Organisations-Methoden

|

455

Das dargestellte Beispiel zeigt einen typischen Projektverlauf. Am Anfang werden zur Verfügung stehende Mittel nicht vollständig abgerufen, was daran liegen könnte, dass sich das Projektteam noch finden muss und demzufolge noch nicht voll arbeitet. Das rächt sich in der zweiten Projekthälfte, wo die geplanten Budgets (eigentlich oft) deutlich überzogen werden.

10.1.3 Projekt-Finanzplan Die Kosten eines Projekts sollen durch den Auftraggeber (intern oder extern) vollständig getragen werden (Bild 10-8). Ein positiver Ertrag ist (meistens) ein zusätzliches Ziel. Die Kostenentwicklung wird begleitet durch Finanzzugänge mit folgenden Möglichkeiten: x x

Die gesamten Finanzmittel stehen im Voraus zur Verfügung. Die Finanzmittel stehen phasenweise zur Verfügung, sodass die Kosten zu jedem Zeitpunkt gedeckt sind.

Bild 10-8. Finanzierungs-Möglichkeiten

 2-12-10-03_Finanzplan.xlsm Betrachten wir ein einfaches Finanzierungsbeispiel (Bild 10-9), in dem die geschätzten Kosten zu jedem Meilenstein in einer Liste vorliegen. Eine zweite Liste führt die Zahlungstermine auf.

Bild 10-9. Terminplan (getrennt dargestellt)

Der Kostenverlauf im Projekt (Bild 10-10) ist hier ein Polynom.

456

|

Operatives Projekt-Controlling

Bild 10-10. Kostensummenlinie

Es stellt sich nun die Frage, welche Zahlungen mindestens zu den Terminen erfolgen müssen, damit es zu keiner Unterdeckung kommt. Die Lösung erhalten wir durch ein Polynom dritten Grades, das die vorhandene Kostenkurve hinreichend approximiert. ݂ሺ‫ݔ‬ሻ ൌ  ܽ଴ ൅ ܽଵ ‫ ݔ‬൅ ܽଶ ‫ ݔ‬ଶ ൅ ܽଷ ‫ ݔ‬ଷ

(10.1)

Als Lösungsmethode bietet sich die Methode der kleinsten Fehlerquadrate an, wie sie auch der Solver benutzt. Da wir es hier schon mit geschätzten Kosten zu tun haben, genügt auch die Trendlinie der Kostensummenlinie. Dazu wird die Kostensummenlinie markiert und über das Kontextmenü die Methode Trendlinie formatieren aufgerufen. Als Trendlinienoption wählen wir eine polynomische Trendlinie dritten Grades. Mit ein paar Anpassungen wird auch die Formel dargestellt (Bild 10-11).

Bild 10-11. Trendlinie als Polynom dritten Grades

10.1 Organisations-Methoden

|

457

Mit diesem Polynom und den Zahlungsterminen löst die Prozedur CreateKostenlinien das aufgestellte Problem und trägt die Zahlungen mit ins Diagramm ein. Dazu erstellt sie zuerst noch einmal das Kostensummen-Diagramm und bestimmt danach die Parameter der Zahlungsfunktion, aus der sich dann die Zahlungen ergeben. Codeliste 10-2. Prozedur bestimmt die notwendigen Zahlungsbeträge Sub CreateKostenlinien() Dim wbkTemp As Workbook Dim wshTemp As Worksheet Dim shpTemp As Shape Dim chrTemp As Chart Dim lRow As Long Dim lRowX As Long Dim lRowY As Long Dim dFkt As Double Dim dx As Double Dim dx1 As Double Dim vDate As Date Dim vNull As Date Dim sx As String Set wbkTemp = ThisWorkbook Set wshTemp = wbkTemp.Worksheets("Gedeckte Kostensumme") With wshTemp 'Löschung .DrawingObjects.Delete .Range("F2:G50").Clear .Range("D16:D26").Clear 'Abzissenwerte vNull = .Range("C2") For lRow = 2 To 12 vDate = .Cells(lRow, 3) .Cells(lRow, 6) = vDate - vNull Next lRow 'Diagramm .Range("D2:D12").Select Set shpTemp = .Shapes.AddChart2(240, xlXYScatterSmoothNoMarkers) End With Set chrTemp = shpTemp.Chart With chrTemp .SetSourceData _ Source:=Range("D2:D12") .FullSeriesCollection(1).XValues = _ "='Gedeckte Kostensumme'!$F$2:$F$12" .Axes(xlCategory).TickLabels.Orientation = 45 .Axes(xlCategory).MinimumScale = 0 .Axes(xlCategory).MaximumScale = 365 .HasTitle = True .ChartTitle.Text = "Finanzsplan" 'Achsenbeschriftung .Axes(xlCategory, xlPrimary).HasTitle = True .Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = _ "Projekttage" .Axes(xlValue, xlPrimary).HasTitle = True .Axes(xlValue, xlPrimary).AxisTitle.Characters.Text = _ "Summen" .Axes(xlValue, xlPrimary).TickLabels.NumberFormat = "#.##0" 'Bestimmung der Kostenfunktionswerte For lRow = 2 To 12 dx = wshTemp.Cells(lRow, 6) dFkt = f(dx)

458

|

Operatives Projekt-Controlling

wshTemp.Cells(lRow, 7) = dFkt Next lRow 'zeige Kostenfunktion .SeriesCollection.NewSeries .FullSeriesCollection(2).XValues = _ "='Gedeckte Kostensumme'!$F$2:$F$12" .FullSeriesCollection(2).Values = _ "='Gedeckte Kostensumme'!$G$2:$G$12" .ChartArea.Left = 420 .ChartArea.Top = 10 .ChartArea.Height = 300 End With 'Bestimmung der Zahlungswerte With wshTemp lRowX = 16 vDate = .Cells(lRowX, 3) dx1 = vDate - vNull .Cells(lRowX, 6) = dx1 lRowX = lRowX + 1 For lRow = 17 To 26 vDate = .Cells(lRow, 3) dx = vDate - vNull .Cells(lRowX, 6) = dx dFkt = f(dx) If dFkt 0;Abw./Anteil;0)

E2:E12 Ist F2:F12

B8 x D8:F8

=SUMME(B2:B7)

Abw.

Die Prozedur CreateKostenDiagramm erstellt mit den berechneten Abweichungen ein gruppiertes Balkendiagramm. Codeliste 10-4. Prozedur erstellt ein Kosten-Vergleichsdiagramm Sub CreateKostenDiagramm() Dim wbkTemp As Workbook Dim wshTemp As Worksheet Dim shpTemp As Shape Dim chrTemp As Chart Dim lRow As Long 'Excel-Objekte Set wbkTemp = ThisWorkbook Set wshTemp = wbkTemp.Worksheets("Arbeitspaket") 'alle Grafiken auf dem Arbeitsblatt löschen ActiveSheet.DrawingObjects.Delete 'Diagramm Set shpTemp = wshTemp.Shapes.AddChart2(297, xlBarStacked)

10.1 Organisations-Methoden

|

465

Set chrTemp = shpTemp.Chart With chrTemp .SetSourceData Source:=Range("Arbeitspaket!$F$2:$F$12") .Axes(xlCategory).ReversePlotOrder = True .Axes(xlValue).MinimumScale = -5000 .Axes(xlValue).MaximumScale = 3000 .Axes(xlValue).MajorUnit = 2000 .HasTitle = True .ChartTitle.Text = "Kostenvergleich" .FullSeriesCollection(1).XValues = "=Arbeitspaket!$A$3:$A$12" .FullSeriesCollection(1).Select .ChartGroups(1).GapWidth = 10 .FullSeriesCollection(1).Format.Fill.ForeColor.RGB = _ RGB(0, 176, 240) .FullSeriesCollection(1).Format.Shadow.Type = msoShadow21 End With 'aufräumen Set wbkTemp Set wshTemp Set shpTemp Set chrTemp End Sub

= = = =

Nothing Nothing Nothing Nothing

Das erstellte Balken-Diagramm wird entsprechend angepasst (Bild 10-19).

Bild 10-19. AP-Kostenvergleich

10.2 Kontroll-Methoden Damit ein Projekt-Controlling überhaupt erfolgreich stattfinden kann, müssen bestimmte Voraussetzungen gegeben sein. x x x x x

466

|

Ziele müssen klar definiert und messbar sein (SMART-Kriterien). Kosten müssen eindeutig zugeordnet werden können. Kenngrößen müssen zeitlich relevant erfasst und berichtet werden können. Informationen sind für alle Teammitglieder offen. Fehler gehören zum Projekt (Umgangskultur).

Operatives Projekt-Controlling

10.2.1 Meilenstein-Trendanalyse Die Meilenstein-Trendanalyse arbeitet vorwärtsgerichtet und ermöglicht so, Terminverschiebungen rechtzeitig zu visualisieren. Verschiebungen im Projektablauf können vermieden werden. Die Einfachheit macht diese Analyse zu einem beliebten Instrument.  2-12-10-06_MeilensteinTrendAnalyse.xlsm Im Meilensteinplan (Bild 10-20) werden senkrecht die geplanten Meilensteine mit ihren Planterminen aufgeführt. Waagerecht werden die Berichtstermine eingetragen, an denen die Plantermine überprüft und notfalls korrigiert werden. Die korrigierten Termine werden unter dem Berichtstermin vermerkt.

Bild 10-20. MTA-Plan

Die Liste kommt ganz ohne Formeln aus. Visualisieren lässt sie sich mit dem Diagrammtyp Linie mit Datenpunkten. Die Prozedur CreateMTA erstellt die Meilenstein-Trend-Analyse (Bild 10-21). Codeliste 10-5. Prozedur erstellt eine MTA Sub CreateMTA() Dim wbkTemp Dim wshTemp Dim shpTemp Dim chrTemp

As As As As

Workbook Worksheet Shape Chart

'Excel-Objekte Set wbkTemp = ThisWorkbook Set wshTemp = wbkTemp.Worksheets("MTA") 'alle Grafiken auf dem Arbeitsblatt löschen ActiveSheet.DrawingObjects.Delete 'Diagramm Set shpTemp = wshTemp.Shapes.AddChart2(332, xlLineMarkers) Set chrTemp = shpTemp.Chart With chrTemp wshTemp.Range("C3:I3").Select .SetSourceData Source:=Range("MTA!$C$3:$I$3") .FullSeriesCollection(1).XValues = "=MTA!$C$1:$I$1" .FullSeriesCollection(1).Name = "=MTA!$B$3" .FullSeriesCollection(1).Values = "=MTA!$C$3:$I$3" .SeriesCollection.NewSeries

10.2 Kontroll-Methoden

|

467

.FullSeriesCollection(2).Name = "=MTA!$B$4" .FullSeriesCollection(2).Values = "=MTA!$C$4:$I$4" .SeriesCollection.NewSeries .FullSeriesCollection(3).Name = "=MTA!$B$5" .FullSeriesCollection(3).Values = "=MTA!$C$5:$I$5" .SeriesCollection.NewSeries .FullSeriesCollection(4).Name = "=MTA!$B$6" .FullSeriesCollection(4).Values = "=MTA!$C$6:$I$6" .SeriesCollection.NewSeries .FullSeriesCollection(5).Name = "=MTA!$B$7" .FullSeriesCollection(5).Values = "=MTA!$C$7:$I$7" .SeriesCollection.NewSeries .FullSeriesCollection(6).Name = "=MTA!$B$8" .FullSeriesCollection(6).Values = "=MTA!$C$8:$I$8" .SeriesCollection.NewSeries .FullSeriesCollection(7).Name = "=MTA!$B$9" .FullSeriesCollection(7).Values = "=MTA!$C$9:$I$9" .SeriesCollection.NewSeries .FullSeriesCollection(8).Name = "=MTA!$B$10" .FullSeriesCollection(8).Values = "=MTA!$C$10:$I$10" .SeriesCollection.NewSeries .FullSeriesCollection(9).Name = "=MTA!$B$11" .FullSeriesCollection(9).Values = "=MTA!$C$11:$I$11" .HasTitle = True .ChartTitle.Text = "Meilenstein-Trendanalyse" .Axes(xlValue).MinimumScale = 43466 .Axes(xlValue).MaximumScale = 43862 .Axes(xlCategory).Select .Axes(xlCategory).BaseUnit = xlDays .Axes(xlCategory).MajorUnit = 30 .Axes(xlCategory).TickLabelPosition = xlHigh .Axes(xlCategory).TickLabels.Orientation = xlUpward .SetElement (msoElementLegendRight) .ChartArea.Top = 10 .ChartArea.Left = 500 .ChartArea.Width = 400 .ChartArea.Height = 300 End With 'aufräumen Set wbkTemp Set wshTemp Set shpTemp Set chrTemp End Sub

= = = =

Nothing Nothing Nothing Nothing

Aus dem Verlauf der Geraden ergeben sich folgende Aspekte: x x x x

468

|

Waagerechte Trends bedeuten keine Veränderungen zwischen Plan und Ist. Fallende Trends bedeuten, dass der Meilenstein vorzeitig erreicht wird. Steigende Trends bedeuten, dass sich Verzögerungen ergeben. Die Analyse erlaubt weitere Betrachtungen: o Wird der Abstand zwischen den Meilensteinen kleiner, dann verkürzt sich die zur Verfügung stehende Zeit. Dies bedarf einer eindeutigen Klärung. o Eine Meilenstein-Analyse eignet sich durch die komprimierte Darstellung sehr gut für einen Statusreport. o Die Analyse ist ein gutes Informationsmittel im Projektteam.

Operatives Projekt-Controlling

Bild 10-21. MTA-Diagramm

10.2.2 Ressourcen-Trendanalyse Wie schon angedeutet, ist ein Ableger der MTA die Ressourcen-Trendanalyse.  2-12-10-07_RessourcenTrendAnalyse.xlsm Im Ressourcenplan (Bild 10-22) werden wieder die Meilensteine senkrecht aufgeführt, aber statt Termine betrachtet man hier den Ressourcenaufwand in Personen-Monate (PM).

Bild 10-22. RTA-Plan

Mit einer ähnlichen Prozedur wie zuvor ergibt sich daraus die Ressourcen-Trendanalyse. Codeliste 10-6. Prozedur erstellt eine RTA Sub CreateRTA() Dim wbkTemp Dim wshTemp Dim shpTemp Dim chrTemp

As As As As

Workbook Worksheet Shape Chart

'Excel-Objekte

10.2 Kontroll-Methoden

|

469

Set wbkTemp = ThisWorkbook Set wshTemp = wbkTemp.Worksheets("RTA") ActiveSheet.DrawingObjects.Delete 'Diagramm Set shpTemp = wshTemp.Shapes.AddChart2(332, xlLineMarkers) Set chrTemp = shpTemp.Chart With chrTemp wshTemp.Range("C3:G3").Select .SetSourceData Source:=Range("RTA!$C$3:$G$3") .FullSeriesCollection(1).XValues = "=RTA!$C$1:$G$1" .FullSeriesCollection(1).Name = "=RTA!$B$3" .FullSeriesCollection(1).Values = "=RTA!$C$3:$G$3" .SeriesCollection.NewSeries .FullSeriesCollection(2).Name = "=RTA!$B$4" .FullSeriesCollection(2).Values = "=RTA!$C$4:$G$4" .SeriesCollection.NewSeries .FullSeriesCollection(3).Name = "=RTA!$B$5" .FullSeriesCollection(3).Values = "=RTA!$C$5:$G$5" .SeriesCollection.NewSeries .FullSeriesCollection(4).Name = "=RTA!$B$6" .FullSeriesCollection(4).Values = "=RTA!$C$6:$G$6" .SeriesCollection.NewSeries .FullSeriesCollection(5).Name = "=RTA!$B$7" .FullSeriesCollection(5).Values = "=RTA!$C$7:$G$7" .SeriesCollection.NewSeries .FullSeriesCollection(6).Name = "=RTA!$B$8" .FullSeriesCollection(6).Values = "=RTA!$C$8:$G$8" .HasTitle = True .ChartTitle.Text = "Ressourcen-Trendanalyse" .Axes(xlValue).MinimumScale = 100 .Axes(xlCategory).Select .Axes(xlCategory).BaseUnit = xlDays .Axes(xlCategory).MajorUnit = 30 .Axes(xlCategory).TickLabelPosition = xlHigh .Axes(xlCategory).TickLabels.Orientation = xlUpward .SetElement (msoElementLegendRight) .ChartArea.Top = 10 .ChartArea.Left = 400 .ChartArea.Width = 400 .ChartArea.Height = 300 End With Set wbkTemp Set wshTemp Set shpTemp Set chrTemp End Sub

= = = =

Nothing Nothing Nothing Nothing

Das RTA-Diagramm hat den gleichen Aufbau wie das MTA-Diagramm (Bild 10-23).

470

|

Operatives Projekt-Controlling

Bild 10-23. RTA-Diagramm

10.2.3 Kosten-Trendanalyse Natürlich gibt es in der Reihe der Trendanalysen auch die Kostentrendanalyse (Bild 10-24) mit den Kosten als zu bewertendes Element.  2-12-10-08_KostenTrendAnalyse.xlsm

Bild 10-24. KTA-Plan

Mit einer ähnlichen Prozedur wie zuvor ergibt sich daraus die Kosten-Trendanalyse. Codeliste 10-7. Prozedur erstellt eine KTA Sub CreateKTA() Dim wbkTemp Dim wshTemp Dim shpTemp Dim chrTemp

As As As As

Workbook Worksheet Shape Chart

'Excel-Objekte

10.2 Kontroll-Methoden

|

471

Set wbkTemp = ThisWorkbook Set wshTemp = wbkTemp.Worksheets("KTA") 'alle Grafiken auf dem Arbeitsblatt löschen ActiveSheet.DrawingObjects.Delete 'Diagramm Set shpTemp = wshTemp.Shapes.AddChart2(332, xlLineMarkers) Set chrTemp = shpTemp.Chart With chrTemp wshTemp.Range("C3:G3").Select .SetSourceData Source:=Range("KTA!$C$3:$G$3") .FullSeriesCollection(1).XValues = "=KTA!$C$1:$G$1" .FullSeriesCollection(1).Name = "=KTA!$B$3" .FullSeriesCollection(1).Values = "=KTA!$C$3:$G$3" .SeriesCollection.NewSeries .FullSeriesCollection(2).Name = "=KTA!$B$4" .FullSeriesCollection(2).Values = "=KTA!$C$4:$G$4" .SeriesCollection.NewSeries .FullSeriesCollection(3).Name = "=KTA!$B$5" .FullSeriesCollection(3).Values = "=KTA!$C$5:$G$5" .SeriesCollection.NewSeries .FullSeriesCollection(4).Name = "=KTA!$B$6" .FullSeriesCollection(4).Values = "=KTA!$C$6:$G$6" .SeriesCollection.NewSeries .FullSeriesCollection(5).Name = "=KTA!$B$7" .FullSeriesCollection(5).Values = "=KTA!$C$7:$G$7" .SeriesCollection.NewSeries .FullSeriesCollection(6).Name = "=KTA!$B$8" .FullSeriesCollection(6).Values = "=KTA!$C$8:$G$8" .HasTitle = True .ChartTitle.Text = "Kosten-Trendanalyse" .Axes(xlValue).MinimumScale = 20 .Axes(xlCategory).Select .Axes(xlCategory).BaseUnit = xlDays .Axes(xlCategory).MajorUnit = 30 .Axes(xlCategory).TickLabelPosition = xlHigh .Axes(xlCategory).TickLabels.Orientation = xlUpward .SetElement (msoElementLegendRight) .ChartArea.Top = 10 .ChartArea.Left = 400 .ChartArea.Width = 400 .ChartArea.Height = 300 End With 'aufräumen Set wbkTemp Set wshTemp Set shpTemp Set chrTemp End Sub

= = = =

Nothing Nothing Nothing Nothing

Auch das KTA-Diagramm hat einen ähnlichen Aufbau (Bild 10-25).

472

|

Operatives Projekt-Controlling

Bild 10-25. KTA-Diagramm

10.2.4 Kosten-Termin-Diagramm Im Laufe der Zeit sind aus den Trendanalysen die verschiedensten Diagramme entwickelt und wieder verworfen worden.  2-12-10-09_KostenTerminDiagramm.xlsm Eine Methode hat sich bis heute behauptet, das Kosten-Termin-Diagramm (Bild 10-26). Hier finden Plan- und Ist-Kosten mit Meilensteinen zueinander.

Bild 10-26. Plan-Ist-Daten Codeliste 10-8. Prozedur erstellt ein KTD Sub CreateKTD() Dim wbkTemp Dim wshTemp Dim shpTemp Dim chrTemp

As As As As

Workbook Worksheet Shape Chart

'Excel-Objekte Set wbkTemp = ThisWorkbook Set wshTemp = wbkTemp.Worksheets("KTD") 'alle Grafiken auf dem Arbeitsblatt löschen ActiveSheet.DrawingObjects.Delete

10.2 Kontroll-Methoden

|

473

'Diagramm Set shpTemp = wshTemp.Shapes.AddChart2(332, xlLineMarkers) Set chrTemp = shpTemp.Chart With chrTemp wshTemp.Range("B3:F3").Select .SetSourceData Source:=Range("KTD!$B$3:$F$3") .FullSeriesCollection(1).XValues = "=KTD!$B$1:$F$1" .FullSeriesCollection(1).Name = "=KTD!$A$3" .FullSeriesCollection(1).Values = "=KTD!$B$3:$F$3" .SeriesCollection.NewSeries .FullSeriesCollection(2).Name = "=KTD!$A$4" .FullSeriesCollection(2).Values = "=KTD!$B$4:$F$4" .HasTitle = True .ChartTitle.Text = "Kosten-Termin-Diagramm" .Axes(xlValue).MinimumScale = 20 .Axes(xlCategory).Select .Axes(xlCategory).BaseUnit = xlDays .Axes(xlCategory).MajorUnit = 30 .Axes(xlCategory).TickLabelPosition = xlHigh .Axes(xlCategory).TickLabels.Orientation = xlUpward .SetElement (msoElementLegendRight) .ChartArea.Top = 10 .ChartArea.Left = 400 .ChartArea.Width = 400 .ChartArea.Height = 300 End With 'aufräumen Set wbkTemp Set wshTemp Set shpTemp Set chrTemp End Sub

= = = =

Nothing Nothing Nothing Nothing

Auch hier dient die vorherige Prozedur als Vorlage für das Kosten-Termin-Diagramm (Bild 10-27).

Bild 10-27. KT-Diagramm

474

|

Operatives Projekt-Controlling

10.2.5 Earned-Value-Analyse Die Earned-Value-Analyse (kurz EVA), auch Arbeitswert-Analyse, ist ein Ersatz für MTA und KTA. Sie liefert eine intuitiv erfassbare Darstellung des Projektstatus. Nach DIN 69903 ist der Fertigstellungswert (FW) der korrekte deutsche Begriff für EVA.  2-12-10-10_EarnedValueAnalyse.xlsm In einer Liste werden zu den Aufgaben (Tasks) und Berichtsterminen Plan- und Ist-Aufwand gegenübergestellt (Bild 10-28). Der Quotient aus den kumulierten Summen ergibt den Fertigstellungswert.

Bild 10-28. Kostenplan Codeliste 10-9. Prozedur erstellt eine EVA Sub CreateEVA() Dim wbkTemp Dim wshTemp Dim shpTemp Dim chrTemp Dim lRow Dim lCol Dim dSum Dim dKum

As As As As As As As As

Workbook Worksheet Shape Chart Long Long Double Double

'Excel-Objekte Set wbkTemp = ThisWorkbook Set wshTemp = wbkTemp.Worksheets("EVA") With wshTemp

10.2 Kontroll-Methoden

|

475

'Plan-Kosten For lRow = 3 To 8 dSum = 0 For lCol = 3 To 9 dSum = dSum + .Cells(lRow, lCol) Next lCol .Cells(lRow, 2) = dSum Next lRow dKum = 0 For lCol = 3 To 9 dSum = 0 For lRow = 3 To 8 dSum = dSum + .Cells(lRow, lCol) Next lRow .Cells(9, lCol) = dSum dKum = dKum + dSum .Cells(10, lCol) = dKum Next lCol 'Ist-Kosten For lRow = 13 To 18 dSum = 0 For lCol = 3 To 9 dSum = dSum + .Cells(lRow, lCol) Next lCol .Cells(lRow, 2) = dSum Next lRow dKum = 0 For lCol = 3 To 9 dSum = 0 For lRow = 13 To 18 dSum = dSum + .Cells(lRow, lCol) Next lRow .Cells(19, lCol) = dSum dKum = dKum + dSum .Cells(20, lCol) = dKum .Cells(21, lCol) = dKum / .Cells(10, lCol) Next lCol End With 'alle Grafiken auf dem Arbeitsblatt löschen ActiveSheet.DrawingObjects.Delete 'Diagramm Set shpTemp = wshTemp.Shapes.AddChart2(332, xlLineMarkers) Set chrTemp = shpTemp.Chart With chrTemp .SetSourceData Source:=Range("EVA!$C$10:$I$10") .FullSeriesCollection(1).XValues = "=EVA!$C$1:$I$1" .FullSeriesCollection(1).Values = "=EVA!$C$10:$I$10" .SeriesCollection.NewSeries .FullSeriesCollection(2).Values = "=EVA!$C$20:$I$20" .SeriesCollection.NewSeries .FullSeriesCollection(3).Values = "=EVA!$C$21:$I$21" .FullSeriesCollection(1).ChartType = xlLineMarkers .FullSeriesCollection(2).ChartType = xlLineMarkers .FullSeriesCollection(3).ChartType = xlLineMarkers .FullSeriesCollection(3).AxisGroup = 2 .FullSeriesCollection(1).Name = "=""Plan""" .FullSeriesCollection(2).Name = "=""Ist""" .FullSeriesCollection(3).Name = "=""EVA""" .FullSeriesCollection(3).Format.Line _

476

|

Operatives Projekt-Controlling

.ForeColor.RGB = RGB(255, 0, 0) .HasTitle = True .ChartTitle.Text = "Earned-Value-Analyse" .Axes(xlCategory).BaseUnit = xlDays .SetElement (msoElementLegendRight) .ChartArea.Top = 10 .ChartArea.Left = 550 .ChartArea.Width = 400 .ChartArea.Height = 300 End With 'aufräumen Set wbkTemp Set wshTemp Set shpTemp Set chrTemp End Sub

= = = =

Nothing Nothing Nothing Nothing

Die Auswertung übernimmt wieder eine Prozedur, die sowohl die Summen bildet als auch den EVA-Wert bestimmt und ein Diagramm vom Verbundtyp Linien mit Datenpunkten erstellt (Bild 10-29).

Bild 10-29. Earned-Value-Analyse

10.2.6 Leistungsmäßiger Fortschrittsgrad Der leistungsmäßige Fortschrittsgrad gibt an, wie viele Projektaufgaben bereits erfüllt sind. Die Feststellung ist nicht unproblematisch, denn oft lautet die Antwort des Verantwortlichen: Ich bin zu 90 % fertig. Nach mehrfach gleicher Antwort dämmert dann dem Projektleiter, dass er es mit dem berüchtigten 90%-Syndrom zu tun hat. 𝐿𝑒𝑖𝑠𝑡𝑢𝑛𝑔𝑠𝑚äß𝑖𝑔𝑒𝑟 𝐹𝑜𝑟𝑡𝑠𝑐ℎ𝑟𝑖𝑡𝑡𝑠𝑔𝑟𝑎𝑑 =

𝐼𝑠𝑡𝑎𝑢𝑓𝑤𝑎𝑛𝑑∙100 𝑉𝑜𝑟𝑎𝑢𝑠𝑠𝑖𝑐ℎ𝑡𝑙𝑖𝑐ℎ𝑒𝑟 𝐺𝑒𝑠𝑎𝑚𝑡𝑎𝑢𝑓𝑤𝑎𝑛𝑑

(10.2)

10.2 Kontroll-Methoden

|

477

Für eine objektive Betrachtung gibt es mehrere Methoden.  2-12-10-11_Fortschrittsgrad.xlsm Tabelle 10-4. Methoden zur Bestimmung des leistungsmäßigen Fortschrittgrades Methode

Darstellung

FGR = x [%]

Statusschritte

x = 0, x1, x2, … 100

50/50

x  {0, 50, 100}

0/100

x  {0, 100}

Mengen-Proportionalität

x = fertige Menge / Planmenge

Sekundär-Proportionalität

x = der Betrachtungseinheit

Schätzung

x = subjektiv geschätzte Maßnahme

Zeit-Proportionalität

x = abgelaufene Zeit / geplante Zeit

Beispiel zur Methode Statusschritte (Bild 10-30).

Bild 10-30. Statusschritte Tabelle 10-5. Bereichsnamen und Formeln zur Statusschritte Methode Bereich Name Bereich

Formel

Bereich Formel

B2:B7

Plan

F3 x F4:F7 =F2+B3*E3

F8

=F7

C2:C7

Ist

D2:D7

=Plan-Ist

C8

=SUMME(Ist)

D2:D7

Rest

E2:E7

=WENN(Plan>0;Ist/Plan;0) B8

=SUMME(Plan)

F2

=B2*E2

=SUMME(Rest)

478

|

Operatives Projekt-Controlling

D8

führenden

Nachfolgend ein Beispiel zur 50/50 Methode (Bild 10-31).

Bild 10-31. Beispiel zur 50/50-Methode Tabelle 10-6. Bereichsnamen und Formeln zur 50/50 Methode Bereich Name Formel Bereichsnamen und Formeln wie Tabelle 11-5 C2:C7

=WENN(Plan>0;WENN(Ist/Plan=1;1; WENN(Ist/Plan>=0,5;0,5;0));0)

Bei der Methode 50/50 kann es zu einer Überschätzung kommen. Ungenauer, aber einfacher ist die nachfolgende Methode. Nachfolgend ein Beispiel zur 0/100 Methode (Bild 10-32).

Bild 10-32. Beispiel zur 0/100-Methode Tabelle 10-7. Bereichsnamen und Formeln zur 0/100 Methode Bereich Name Formel Bereichsnamen und Formeln wie Tabelle 11-5 C2:C7

=WENN(Plan>0;WENN(Ist/Plan=1;1;0);0)

Bei dieser Methode kommt es verständlicherweise zu Unterschätzungen. Exakte Werte zu jedem Meilenstein liefert die nachfolgende Methode.

10.2 Kontroll-Methoden

|

479

Beispiel zur Step-To-Step-Methode (Bild 10-33):

Bild 10-33. Beispiel zur Step-To-Step-Methode Tabelle 10-8. Bereichsnamen und Formeln zur Step-To-Step-Methode Bereich Name

Bereich Formel

Bereich

Formel

B2:B7

Aufwand C2:C7

=Aufwand/Gesamt D3 x D4:D7 =D2+C3

B8

Gesamt

=C2

D2

Beispiel zur relativen Methode (Bild 10-34):

Bild 10-34. Beispiel zur Relativ-Methode Tabelle 10-9. Bereichsnamen und Formeln zur relativen Methode Bereich Name Bereich Formel

Bereich Formel

B2:B7

Plan

E2:E7

=Ist/(Ist+Rest)

D8

C2:C7

Ist

B8

=SUMME(Plan) E8

D2:D7

Rest

C8

=SUMME(Ist)

=SUMME(Rest) =C8/(C8+D8)

Es ist die genauste Methode und sie kann zu jedem Zeitpunkt durchgeführt werden, doch es sind gute Schätzwerte erforderlich. Die Werte in der Spalte Rest werden nicht errechnet, sondern nach Schätzung des noch folgenden Aufwands eingetragen. Daher ist nicht immer Ist + Rest = Plan.

480

|

Operatives Projekt-Controlling

10.2.7 Fortschrittsgrad Der zeitliche Fortschrittsgrad bestimmt sich analog zum leistungsmäßigen Fertigstellungsgrad: Zeitlicher Fortschrittsgrad =

Istdauer ∙100 Voraussichtliche Gesamtdauer

(10.3)

Durch ihn wird deutlich, ob der Projekt-Zeitplan bis zum Projektende eingehalten werden kann. Entsprechend müssen die zuvor besprochenen Listen angepasst werden. Die voraussichtliche Gesamtdauer in Gleichung 10.3 ergibt sich aus der Formel: Vorauss. Gesamtdauer = IstDauer + vorauss. Restdauer

(10.4)

Die voraussichtliche Restdauer (auch als Time-To-Completion, übersetzt Zeit bis zur Fertigstellung genannt) lässt sich nur aufgrund der noch zu erbringenden Leistungen abschätzen (Bild 10-35), die aber nicht den zum Projektstart geplanten entsprechen müssen, sondern der aktuellen Situation angepasst sind.

Bild 10-35. Voraussichtlicher Endtermin

10.2.8 Reviews Eine der einfachsten und gleichzeitig wichtigsten Methoden zur Fehlervermeidung ist das sogenannte Review. Das Ziel eines Reviews ist die inhaltliche und formale Prüfung eines Dokuments durch eine andere Person. Ein Review-Partner ist immer eine unabhängige, fachlich kompetente und seiner Verantwortung bewusste Person. Geeignete Review-Partner zu finden ist nicht immer einfach. Ja nach dem Inhalt können dies unterschiedliche Personen sein. Sie sollten aber immer über die nötige Fachkompetenz verfügen.

Bild 10-36. Die Wirkung von Reviews

Das nachfolgende einfache Template dient als Entwurf für eigene Reviews (Bild 10-37). Ein solches Template kann viel komplexer ausfallen.

10.2 Kontroll-Methoden

|

481

 2-12-10-12_ReviewTemplate.xlsm

Bild 10-37. Einfacher Entwurf eines Review-Formulars

Reviews werden in verschiedenen Formen durchgeführt: x x x x x

482

|

Reviews (am Ende einer Entwicklungsphase / Meilenstein) prüfen Umfang und Qualität (meist eines Dokuments) Audits sind Reviews der QS zu kritischen Vorgängen Walk-Throughs dienen der Entdeckung von Problemen Peer Reviews sind wie Walk-Throughs und werden von sachkundigen Kollegen (Peers) durchgeführt Inspections sind formale Gruppensitzungen zu einem Dokument, das vom Autor vorgelesen und besprochen wird.

Operatives Projekt-Controlling

LITERATURVERZEICHNIS

Excel + VBA für Controller

[1] Britzelmaier, B.: Controlling, 3. Auflage, Pearson Verlag, 2020 [2] Brühl, R.: Controlling, Vahlen Verlag, 4. Auflage, 2016 [3] Coenenberg, A. G.; Fischer T.M.: Kostenrechnung und Kostenanalyse, Schäfer Poschel Verlag, 9. Auflage, 2016 [4] Deimel, K.; Heupel, T.; Wiltinger, K.: Controlling, Vahlen Verlag, 2. Auflage, 2022 [5] Deimel, K.; Erdmann, G.; Isemann, R.: Kostenrechnung, Pearson Verlag, 1. Auflage, 2017 [6] Ferraro, A.; Russo, M.: Datenanalyse mit Microsoft Power BI und Power Pivot für Excel, dpunkt.verlag, 2018 [7] Fiedler, R.: Controlling von Projekten, 8. Auflage, Vieweg Verlag, 2020 [8] Gadasch, A.: IT-Controlling, Springer Vieweg Verlag, 1. Auflage, 2020 [9] Horvath, P.; Gleich, R.: Controlling, 14. Auflage, Vahlen Verlag, 2019 [10] Jakoby, W.: Projektmanagement für Ingenieure, Springer Vieweg Verlag, 5. Auflage, 2021 [11] Jossè G.: Basiswissen Kostenrechnung, dtv. Verlag, 7. Auflage, 2018 [12] Jung, H.: Controlling, De Gryter Oldenbourg Verlag, 4. Auflage, 2014 [13] Langguth, H.; Hagen, V.; Daum, A.: Controlling, Berliner Wissenschafts-Verlag, 1. Auflage, 2016 [14] Nahrstedt, H.: Algorithmen für Ingenieure, 3. Auflage, Springer Verlag, 2018 [15] Nahrstedt, H.: Die Welt der VBA-Objekte, 2. Auflage, Springer Verlag, 2022 [16] Nahrstedt, H.: Excel + VBA für Ingenieure, 7. Auflage, Springer Verlag, 2023 [17] Nahrstedt, H.: Excel in Perfektion, 4. Auflage, Springer Verlag, 2023 [18] Nahrstedt, H.: Projektmanagement, Vorlesungsskript, FOM Münster, 2016 [19] Schultz, V.: Basiswissen Rechnungswesen, dtv. Verlag, 8. Auflage, 2017

© Springer Fachmedien Wiesbaden GmbH, ein Teil von Springer Nature 2023 H. Nahrstedt, Excel + VBA für Controller, https://doi.org/10.1007/978-3-658-43157-0

[20] Schultz, V.: Controlling, dtv Verlag, 3. Auflage, 2020 [21] Siller, H.; Eschenbach, R.: Controlling Professionell, Schäfer Poeschel Verlag, 3. Auflage, 2019 [22] Steger, J.: Controlling, De Gryter Oldenbourg Verlag, 1. Auflage 2013 [23] Weber, J.; Schäffer, U.: Einführung in das Controlling, Schäfer Poeschel Verlag, 17. Auflage, 2022 [24] Webseite controllingportal.de [25] Webseite controlling-wiki.com/de/index.php/Hauptseite [26] Webseite docs.microsoft.com/de-de/power-bi

484

|

LITERATURVERZEICHNIS

DIAGRAMMVERZEICHNIS

Excel + VBA für Controller

3D-Karte [5] 260 Aktivitätsdiagramm [1] 37 Balkendiagramm [9] 437, 438 Blasendiagramm [2] 109, [8] 386, [9] 413, 416, 418, 422 Dashboard [5] 257, 258, [8] 406 Datenflussdiagramm [1] 35 Fächerdiagramm [4] 223 Flussdiagramm [1] 32, 36 Gantt-Diagramm [9] 439, [10] 464, 466 Gestapeltes Balkendiagramm [2] 98 Gestapeltes Säulendiagramm [6] 278, [7] 362 Getrenntes Säulendiagramm [2] 116 Gruppiertes Säulendiagramm [2] 116, 119, [7] 332, [9] 421 Hierarchiediagramm [9] 429 Histogramm [8] 378 Klassendiagramm [1] 57 Kreisdiagramm [2] 111, [4] 228, [5] 257, [8] 405, 410 Linie mit Datenpunkten [2] 100, 103 Liniendiagramm [6] 274, 285, 290, 293, 306,307, 310, [7] 347, [8] 383, 401 Liniendiagramm [10] 455, 457, 460, 469, 471, 473, 474, 477 Netzdiagramm [2] 120, [4] 232, [7] 320 Netzplan [9] 432

© Springer Fachmedien Wiesbaden GmbH, ein Teil von Springer Nature 2023 H. Nahrstedt, Excel + VBA für Controller, https://doi.org/10.1007/978-3-658-43157-0

Oberflächendiagramm [4] 231 Objektdiagramm [1] 58 Pareto-Diagramm [2] 114, 116, [6] 298, [7] 328 Punktdiagramm [6] 301 Ringdiagramm [8] 394 Säulendiagramm [2] 121, [3] 148, [4] 196, [5] 241, 252, [6] 286, 291 Säulendiagramm [7] 314, 317, 336, [8] 377, 395, 410 Sequenzdiagramm [1] 59 Struktogramm [1] 36, 37 Treemap [4] 230 Verbunddiagramm [7] 339 Vertikales Liniendiagramm [7] 322, [8] 404 Wasserfalldiagramm [7] 340, 342, [8] 378, 398 Zusammengesetzte Datenreihen [2] 105

486

|

DIAGRAMMVERZEICHNIS

FUNKTIONENVERZEICHNIS

Excel + VBA für Controller

Funktion [Kapitel] Seite

Funktion [Kapitel] Seite

ABRUNDEN [3] 180

JETZT [3] 157

ADRESSE [3] 163

KALENDERWOCHE [3] 155

ANZAHL [3] 158

KGRÖSSTE [3] 151

ANZAHL2 [3] 158

KKLEINSTE [3] 152

ARBEITSTAG [9] 442

KORMAT [6] 306

AUFRUNDEN [3] 179

LIA [3] 172

BEREICH.VERSCHIEBEN [3] 134

MAX [3] 137

BW [3] 165

MDET [6] 288

CUBE [5] 264

MIN [3] 136

DATUM [3] 154

MMULT [6] 288

DAX [5] 254

MONAT [3] 153

DBSUMME [3] 141

NBW [3] 171, [7] 369

DIA [3] 173

NETTOARBEITSTAGE [9] 443

EFFEKTIV [7] 358

ODER [3] 133

EINDEUTIG [3] 187

RANDOMIZE [6] 291

FILTER [3] 185, [4] 198

RANG [8] 373

GDA [3] 174

RMZ [3] 164, [7] 361

GDA2 [3] 175

RUNDEN [3] 178

HÄUFIGKEIT [6] 298

SCHÄTZER [2] 106

HEUTE [3] 156

SPALTE [3] 161

INDEX [3] 148

SUMME [3] 138

JAHR [3] 153

SUMMEWENN [3] 139

© Springer Fachmedien Wiesbaden GmbH, ein Teil von Springer Nature 2023 H. Nahrstedt, Excel + VBA für Controller, https://doi.org/10.1007/978-3-658-43157-0

Funktion [Kapitel] Seite

Funktion [Kapitel] Seite

SUMMEWENNS [3] 140

ZÄHLENWENNS [3] 160

SVERWEIS [3] 144

ZEICHEN [6] 281

TAG [3] 153

ZEILE [3] 161

TREND [2] 104

ZINS [3] 167

UND [3] 132

ZINSZ [3] 168

VARIATION [2] 106

ZUFALLSBEREICH [6] 291

VDB [3] 176

ZUFALLSZAHL [6] 291

VERGLEICH [3] 146

ZW [3] 166

VERGLEICH [3] 186

ZZR [3] 169

VERWEIS [3] 143 WENN [3] 130 WOCHENTAG [9] 441 XVERWEIS [3] 145 ZÄHLENWENN [3] 159

488

|

FUNKTIONENVERZEICHNIS

STICHWORTVERZEICHNIS

Excel + VBA für Controller

Arbeiten mit dem VBA-Editor [1] 83 Arbeiten mit Objekten [1] 63 ARBEITSTAG-Funktion [9] 442 Aufgaben des Controllings [2] 91 Aufgaben operatives Controlling [2] 93 Aufgaben Projekt-Controllings [2] 95 Aufgaben Prozess-Controllings [2] 94 Aufgaben strateg. Controlling [2] 92 AUFRUNDEN-Funktion [3] 179 Ausführend bedingte Schleife [1] 31

Bezeichnung [Kapitel] Seite 3D-Karte [5] 260 3D-Oberflächen-Diagramm [4] 230 A ABC-Analyse [8] 373 Abfragen [5] 242 Abfragen aus Dateien [5] 243 Abfragen aus Datenbanken [5] 244 ABRUNDEN-Funktion [3] 180 Abschreibung [7] 351 Abschreibungsfunktionen [3] 172 Abweichungs-Analyse [8] 395 Abweisend bedingte Schleife [1] 31 ADRESSE-Funktion [3] 163 Agile Projektplanung [10] 461 Aktivitätsdiagramm [1] 37 Algorithmus [1] 33 Analyse-Add-Ins installieren [6] 294 Analyse-Methoden [6] 271 Analyse-Methoden, ergänzende [6] 294 Annuitätentilgung [7] 361 ANZAHL2-Funktion [3] 158 ANZAHL-Funktion [3] 158 Application-Object [1] 41

B Balanced Score Card [7] 329 Barwertfunktionen [3] 164 BCG-Matrix [9] 411 Bedingte Auswahl [1] 30 Bedingte Schleifen [1] 31 Bedingte Verzweigung [1] 30 Benchmarking [7] 326 Benutzerdefinierte Ansichten [4] 196 Benutzerdef. Aufzähl-Variable [1] 27 Benutzerdefinierte Datentypen [1] 27 Benutzerdefinierte Funktionen [1] 82 Benutzerdefinierte Gruppierung [4] 215 Benutzerdefinierter Grundriss [5] 262 Berechnungen Bereichsnamen [5] 238

© Springer Fachmedien Wiesbaden GmbH, ein Teil von Springer Nature 2023 H. Nahrstedt, Excel + VBA für Controller, https://doi.org/10.1007/978-3-658-43157-0

Berechnungen mit VBA [5] 239 BEREICH.VERSCHIEBEN [3] 134 Bereichs-Controlling [8] 386 Bereichsnamen [1] 48 Bereichsnamen [3] 125 Bereichsnamen in VBA [3] 128 Beziehungen [5] 233 Beziehungen Pivot-Tabelle [5] 237 Beziehungen n:m [5] 258 Break-Even-Analyse [7] 344 BW-Funktion [3] 165 By Reference [1] 26 By Value [1] 26

Datumsfunktionen [3] 153 DAX in Power Pivot [5] 254 DBSUMME-Funktion [3] 141 Debug.Print [1] 62 Deckungsbeitragsrechnung [7] 340 Definition einer Klasse [1] 60 Destruktor [1] 61 Deterministische Simulation [5] 288 DIA-Funktion [3] 173 Dictionary [1] 69 Direkte Adressierung [1] 46 Direktfenster [1] 6 DoEvents einsetzen [1] 84 Dynam. Amortisationsrechnung [7] 369 Dynam. Investitionsrechnung [7] 365

C Cashflow [7] 351 Cockpit-Tachometer [4] 224 Codefenster teilen [1] 83 Collection [1] 68 CommandBar-Objekte [1] 50 CUBE-Funktionen [5] 264

E Earned-Value-Analyse [10] 475 EFFEKTIV-Funktion [7] 358 Eigene Klassen und Objekte [1] 57 Eigenschaften [1] 6 Eigenschaftsfenster [1] 6 Einfache Zinsrechnung [7] 357 Einfluss-Analyse [9] 421 Einfügen Zellen, Zeilen, Spalten [1] 48 Einstufige DBR [7] 340 Einzelwerte [4] 211 Entity-Relationship-Model [5] 234 Entstehung des Controllings [2] 91 Entstehung von Excel [2] 91 Entwicklungsumgebung [1] 1 Ereignisse [1] 7 Erweiterter Filter [4] 197 Events und eigene Objekte [1] 79 Events und Excel-Objekte [1] 77 Exponentielle Glättung [6] 309 Earned-Value-Analyse [10] 475

D Dashboard [5] 256 Daten filtern [4] 196 Daten konsolidieren [4] 191 Daten transformieren [5] 248 Datenaufbereitung [4] 191 Datenfelder [1] 25 Datenflussdiagramm [1] 35 Datenlisten [1] 25 Datenmodelle [5] 233; [5] 253 Datenmodelle und Tools [5] 241 Datenschnitt und Zeitachse [4] 218 Datenschnitte [4] 201 Datentabelle mit einer Variablen [5] 279 Datentabelle mit zwei Variablen [5] 280 Datentabelle mehr Variable [5] 281 Datentyp Zellinhalt [1] 87 Datentypen [1] 24, [1] 86 Datentyp-Konvertierungen [1] 87

490

|

STICHWORTVERZEICHNIS

F Fächerdiagramm [4] 222 Fehlerbehandlung in Prozeduren [1] 32

Fehlernummer [1] 32 FILTER-Funktion [4] 198 Finanzplan Projekt [10] 456 Find-Methode [1] 49 Focus [1] 21 Formeln [3] 123 Formeln übertragen [3] 124 Formulare [1] 17 Fortschrittsgrad [10] 481 Freier Puffer Netzplan [9] 431 Friend [1] 32 Frühe Bindung [1] 10 Funktionen [1] 23, [3] 129

J JAHR-Funktion [3] 153 JETZT-Funktion [3] 157 K KALENDERWOCHE-Funktion [3] 155 Kapazitätsplanung [9] 445 Kapitalwert-Methode [7] 368 Kennzahlen [7] 322 Kennzahlensysteme [7] 325 Key Performance Indicators [7] 323 KGRÖSSTE-Funktion [3] 151 KKLEINSTE-Funktion [3] 152 Klassenaufteilung [8] 378 Klassendiagramm [1] 57 Kombinieren [5] 254 Konsolidieren in Pivot-Tabelle [4] 220 Konsolidieren von Daten [4] 191 Konstante [1] 24 Konstruktor [1] 61 Kontroll-Methoden [10] 466 Korrelation [6] 301 Korrelationsmatrix VBA [6] 304 Kostenganglinie [10] 453 Kostenplanung [9] 448 Kostenrechnerische Analysen [7] 334 Kostensummenlinie [10] 453 Kosten-Termin-Diagramm [10] 473 Kosten-Trendanalyse [10] 471 Kosten-Vergleichsrechnung [7] 371 Kostenvergleichstabelle [10] 464 Kreditberechnungen [7] 356 Kritischer Pfad [9] 429 Kurzfristige Erfolgsrechnung [7] 348

G Gantt-Diagramm [9] 436 GDA2-Funktion [3] 175 GDA-Funktion [3] 174 Geltungsbereich [1] 32 Gesamtpuffer [9] 432 Gewinn- und Verlustrechnung [7] 336 Grundfunktionen [3] 130 H Haltepunkte [1] 83 Hash-Operator [3] 184 HÄUFIGKEIT-Funktion [6] 298 HEUTE-Funktion [3] 156 Histogramm [6] 295 I INDEX-Funktion [3] 148 Indirekte Adressierung [1] 47 Indizierte Objektvariable [1] 67 Instanzierung von Objekten [1] 61 Integr. Development Environment [1] 1 Interner Zinsfuß [7] 370 Investitionsdaten zusammenst. [7] 366 Investitionsrechnung [7] 364 IT-Controlling [8] 404

L Laden in PivotTable [5] 248 Laden in Tabelle [5] 246 Laufzeitfehler [1] 32 Lebensdauer eines Produkts [8] 381 Lebenszyklus eins Produkts [2] 121

STICHWORTVERZEICHNIS

|

491

Leistungs. Fortschrittsgrad [10] 477 LIA-Funktion [3] 172 Lineare Abschreibung [7] 351 Lineare Optimierung [5] 287 Lokalfenster [1] 6 Löschen von Zellinhalten [1] 48 M Machbarkeitsstudie [2] 108 Makros [1] 13 Marketing-Controlling [8] 402 Marktanalyse [2] 96 Marktbefragung [2] 99 Material-Controlling [8] 386 MAX-Funktion [3] 137 McKinsey-Matrix [9] 414 Mehrstufige DBR [7] 342 Meilenstein-Trendanalyse [10] 467 Menüband-Objekte [1] 49 Methoden [1] 7 MIN-Funktion [3] 136 Module [1] 22 Modus [1] 22 MONAT-Funktion [3] 153 N Nachschüssige Verzinsung [7] 356 Navigator [5] 245 NBW-Funktion [3] 171 NETTOARBEITSTAGE-Fkt. [9] 443 Netz [4] 231 Netzplan [9] 429 Notizzuweisungen [1] 47 Nutzwert-Analyse [9] 418 O Objekte [1] 7 Objekte unter Excel [1] 40 Objektkatalog [1] 5 Objektlisten [1] 8, [1] 67 Objektvariable [1] 8

492

|

STICHWORTVERZEICHNIS

ODER-Funktion [3] 133 On Error [1] 32 OnTime-Funktion [1] 85 Operanden [3] 124 Operatives Projekt-Controlling [10] 451 Operatives Prozess-Controlling [8] 373 Operatoren [1] 28, [3] 124 Optimale Losgröße [8] 398 Option Explicit [1] 2 Optional [1] 27 Optionen [1] 2 P Parameter [1] 26 Parameterlisten [1] 26 Pareto-Prinzip [2] 114 Personal-Controlling [8] 407 Pivot-Diagramme [4] 222 Pivotisieren [5] 255 Pivot-Schema [4] 204 Pivot-Tabellen [4] 204 Planungs-Methoden Projekt [9] 423 Polynomische Trendlinie [10] 457 Populationskenngrößen [6] 299 Power Map [5] 260 Power Pivot [5] 252 Power Query [5] 245 Privat [1] 32 Probabilistische Simulation [5] 290 Produktions-Controlling [8] 395 Produkt-Lebenszyklus [2] 121 Prognoseblatt [5] 284 Projekt [1] 5 Projekt Explorer [1] 5 Projekt-Finanzplan [10] 456 Projektplanung agile [10] 461 Projekt-Strukturplan [9] 423 Projekt-Tracking [10] 452 Prozeduren [1] 23 Prozesskostenrechnung [7] 334

Prozessreife-Bestimmung [7] 311 Prozess-Reporting [7] 332 Pseudozufallszahlen [5] 291 Public [1] 32

Struktogramm [1] 36 Strukturierte Verweise [3] 182 Suchen in Range-Objekten [1] 49 Suchfunktionen [3] 143 SUMME-Funktion [3] 138 Summenfunktionen [3] 138 SUMMEWENN-Funktion [3] 139 SUMMEWENNS-Funktion [3] 140 SVERWEIS-Funktion [3] 144 SWOT-Analyse [7] 318 Syntax von VBA [1] 23 Szenarien [6] 271

R Range-Objekte [1] 45 Regression [6] 301 Relationen [5] 233 Ressourcenplanung [9] 440 Ressourcen-Trendanalyse [10] 469 Reviews [10] 481 Risiko-Portfolio [9] 416 RMZ-Funktion [3] 164 Rückwärtsrechnung Netzplan [9] 431 RUNDEN-Funktion [3] 178 Rundungsfunktionen [3] 177

T Tabellen [3] 181 TAG-Funktion [3] 153 Teilergebnisse [4] 200 Terminplanung [9] 446 Tilgungsrechnung [7] 359 Top-Down-Design [1] 34 Transformieren [5] 255 Treemap-Diagramm [4] 229 Trendanalyse [2] 102, [10] 467

S Satz des Heron [1] 34 Schleifen über Objektlisten [1] 31 Schleifenabbruch [1] 31 Schnittstellen [1] 73 Scrum-Methode [10] 461 Seitenfeld [4] 215 Sequenzdiagramm [1] 59 SMART Methode [2] 117 Softwareschalter [1] 31 Solver [6] 306 SPALTE-Funktion [3] 161 Spalten [1] 46 Spaltenfeld [4] 211 Späte Bindung [1] 10 Standardfunktionen [1] 28 Static [1] 32 Stat. Amortisationsrechnung [7] 367 Stat. Investitionsrechnung [7] 365 Steuerelemente [1] 17 Strateg. Projekt-Controlling [9] 411 Strateg. Prozess-Controlling [7] 311

U Überwachungsfenster [1] 6 UND-Funktion [3] 132 Unterjährige Verzinsung [7] 358 V Variable [1] 24 VBA [1] 1 VBA-Editor [1] 2 VBAProject [1] 5 VDB-Funktion [3] 176 Verbindungen [5] 242 Vererbung [1] 71 VERGLEICH-Funktion [3] 146 Vergleichsrechnung [7] 363 Verteilungen [8] 378 VERWEIS-Funktion [3] 143

STICHWORTVERZEICHNIS

|

493

Visual Basic for Application [1] 1 VMI-Matrix [7] 315 Vorschüssige Verzinsung [7] 356 Vorwärtsrechnung Netzplan [9] 430 W Wait-Funktion [1] 84 WENN-Funktion [3] 130 Wertefeld [4] 209 Wertschöpfungskette [2] 107 Wertzuweisungen [1] 47 Wettbewerbsanalse [7] 320 Windows-Objekte [1] 42 WOCHENTAG-Funktion [9] 441 Workbook-Objekte [1] 43 Worksheet-Objekte [1] 44 X XVERWEIS-Funktion [3] 145 Z ZÄHLENWENN-Funktion [3] 159 ZÄHLENWENNS-Funktion [3] 160

494

|

STICHWORTVERZEICHNIS

Zählfunktionen [3] 157 Zählschleife [1] 31 ZEILE-Funktion [3] 161 Zeilen [1] 46 Zeilenfeld [4] 211 Zeitliche Gruppierung [4] 213 Zellbereiche mit Formeln füllen [3] 124 Zielarten [2] 117 Zielbestimmung im Controlling [2] 96 Ziele definieren [2] 117 Ziele des Controllings [2] 91 Zielgewichtung [2] 110 Zielwertsuche [6] 276 Zinseszinsrechnung [7] 357 ZINS-Funktion [3] 167 Zinsrechnung [7] 356 ZINSZ-Funktion [3] 168 Zweidim. Leistungsmessung [8] 384 ZW-Funktion [3] 166 ZZR-Funktion [3] 170

springer-vieweg.de

Jetzt bestellen: link.springer.com/978-3-658-42112-0

springer-vieweg.de

Jetzt bestellen: link.springer.com/978-3-658-37297-2