Einstieg in VBA mit Excel
Transcription
Einstieg in VBA mit Excel
Kapitel 1 Einführung 1 In diesem Kapitel lernen Sie erste VBA-Makros kennen. Sie erfahren, wie sie aufgebaut sind und wie Sie sie verändern können. Außerdem wird die VBAEntwicklungsumgebung erläutert. Die Abkürzung VBA steht für Visual Basic for Applications. Es handelt sich dabei um die Programmiersprache Visual Basic, mit speziellen Ergänzungen für die verschiedenen Anwendungen in Microsoft Office. VBA Mit Microsoft Excel können sehr viele alltägliche Aufgaben im beruflichen und privaten Bereich bereits gut bewältigt werden. Es gibt jedoch: 왘 Aufgaben, die Sie nur durch zusätzliche Programmierung mit VBA lösen können 왘 Probleme, die durch zusätzliche Programmierung mit VBA schneller gelöst werden können In diesem Buch werden Sie anhand von leicht verständlichen Beispielen erlernen, wie Sie VBA als Ergänzung zu Excel sinnvoll einsetzen. Eigene Übungen (mit Lösungen im Anhang) dienen dazu, Ihren Wissensstand zu testen. Für die Hilfe bei der Erstellung dieses Buches bedanke ich mich beim ganzen Team vom Rheinwerk Verlag, ganz besonders bei Anne Scheibe. 1.1 Was wird besser durch Makros und VBA? Ein einfaches Makro ist nur eine Reihe von Anweisungen, die nacheinander ausgeführt werden. Durch eine solche Anweisung wird in Excel ein bestimmter Vorgang ausgeführt, z. B. eine Zahl in eine Tabellenzelle geschrieben. Die Anweisungen sind in der Sprache VBA geschrieben. VBAProgramme können über einfache Makros weit hinausgehen und komplexe Abläufe steuern. Makro 17 1 1.2 Einführung In der Praxis sieht es häufig so aus, dass es zwei Gruppen von Anwendern gibt: 왘 Benutzern sollen nach dem Aufrufen von Excel nur bestimmte Funktionalitäten zur Verfügung stehen. Ihr Excel kann durch VBA gleichzeitig: Entwickler 왘 Entwickler, also erfahrene Excel-Anwender, die sich mit der Entwicklung von komplexen Excel-Anwendungen befassen – eingeschränkt werden, wodurch es im Idealfall zu weniger Fehlbedienungen kommt Benutzer 왘 Benutzer, also Einsteiger in Excel, die sich nur mit einfachen Themen, z. B. der Dateneingabe und dem Aufruf der Excel-Anwendungen, befassen – erweitert werden, wodurch ihnen spezielle Funktionen und Abläufe zur Verfügung stehen, die über Excel hinausgehen Die Entwickler sind im Auftrag der Benutzer tätig. Die Entwicklung kann in einer anderen Abteilung desselben Unternehmens stattfinden. Es kann sich aber auch um extern entwickelte, d. h. eingekaufte Excel-Anwendungen handeln. 왘 Es sollen vorhandene (von anderen Entwicklern im Unternehmen erstellte oder eingekaufte) Excel-Anwendungen geändert werden. Diese werden zur Bewältigung der laufenden Geschäftsprozesse bereits regelmäßig eingesetzt. Da sich diese Prozesse geändert haben, müssen die Excel-Anwendungen ebensfalls erweitert und angepasst werden. Schneller 왘 weil die Ergebnisse für den Benutzer schneller berechnet werden können Es folgen einige typische Szenarien, die Ihnen zeigen sollen, wozu Sie VBA nutzen können und welche Vorteile sich daraus ergeben: 18 Excel anpassen 1 Anwendungen erweitern Eine schnellere Problemlösung durch VBA ergibt sich: 왘 weil der Entwickler durch die Programmierung mit VBA schneller mit der Entwicklung seiner Excel-Anwendung fertig sein kann Große Datenmengen 왘 Es sollen große Mengen an Daten aus einer Textdatei eingelesen werden. Nur der Aufbau der Daten ist bekannt, nicht aber die Menge. Außerdem sollen, abhängig vom aktuellen Inhalt der Textdatei, nur bestimmte Daten gelesen werden. Nach dem Einlesen sollen die Daten verarbeitet, formatiert, zusammengefasst und zur Verdeutlichung grafisch dargestellt werden. Diagramme 왘 Es soll ein Diagramm aus einer Tabelle erstellt werden. Die aktuelle Größe und der Inhalt der Tabelle sollen die Art des Diagramms und seine Darstellung bestimmen. Dialogfelder MS Office 2016 왘 Benutzer sollen nach dem Aufrufen der Excel-Anwendung ein Dialogfeld vor sich haben. Darin nehmen sie, abhängig von der aktuellen Situation, bestimmte Einstellungen vor, treffen die gewünschte Auswahl der Daten und starten dann deren weitere Verarbeitung. Wiederkehrende Daten 왘 Es ergeben sich regelmäßig (z. B. jede Woche oder jeden Monat) Daten, die auf ähnliche (nicht identische) Art und Weise weiterverarbeitet werden müssen. Schrittweise Bearbeitung 왘 Die Verarbeitung bestimmter Daten ist komplex und muss in mehreren Schritten erfolgen. Mit VBA können Sie die Koordination und die Durchführung der einzelnen Schritte vereinfachen. In diesem Buch sollen verschiedene Möglichkeiten zur Problemlösung mit VBA anhand von Beispielen aus der Praxis gezeigt werden. Es erhebt nicht den Anspruch, alle Bestandteile von VBA (also alle Objekte der Objektbibliothek mit all ihren Eigenschaften und Methoden) aufzulisten und zu erläutern. Dazu gibt es zu viele, und Sie würden schnell den Überblick verlieren. Es wird jedoch eine umfangreiche Auswahl getroffen, die es Ihnen ermöglicht, selbstständig mit VBA zu arbeiten. Bei den Beispielen im Buch wird eher Wert auf Verständlichkeit als auf Komplexität gelegt. Sie sollen schnell den aktuell neuen Aspekt der Programmierung verstehen und nicht durch umfangreiche, komplizierte Beispiele verwirrt werden, in denen sich nur wenig Neues für Sie verbirgt. Verständliche Beispiele 1.2 MS Office 2016 Das Paket MS Office 2016 setzt als Betriebssystem mindestens Windows 7 voraus. Für dieses Buch und die darin gezeigten Abbildungen wurde MS Office 2016 unter Windows 10 eingesetzt. MS Office 2016-Dateien können mit Web-Apps aus dem Office Store erweitert werden. Diese Web-Apps haben Zugriff auf die Daten innerhalb einer Office-Datei. Entwickler können diese Web-Apps mithilfe von Webtechniken (HTML, JavaScript, jQuery, CSS …) programmieren und im Office Store anbieten. In diesem Buch wird nur die Entwicklung von Anwendungen mithilfe von VBA beschrieben. 19 1 1.3 Einführung Mit Makros arbeiten 1.3 Mit Makros arbeiten 1 Zu Beginn erstellen wir ein einfaches Makro. Dieses Makro soll anschließend ausgeführt werden. Hinterher betrachten wir den Code, um einen ersten Blick auf VBA werfen zu können. Schädliche Makros Das Thema Makrosicherheit, also die Sicherheit vor fremden Makros, die schädlichen Code enthalten können, spielt eine große Rolle. Diese Thematik wird in Abschnitt 1.3.5, »Makrosicherheit ändern«, erläutert. Excel-Dateien können seit Excel 2007 sowohl mit als auch ohne Makros gespeichert werden. Darauf wird in Abschnitt 1.3.4, »Makro speichern«, eingegangen. Die in diesem Kapitel erläuterte Bedienung gilt für Excel 2016. Unter Excel 2013, Excel 2010 bzw. Excel 2007 gibt es jeweils leichte Abweichungen in der Bedienung, darauf wird an den entsprechenden Stellen jeweils gesondert hingewiesen. In den Programmversionen vor Excel 2007 gibt es größere Abweichungen in der Bedienung, die in einem eigenen Abschnitt erläutert werden, nämlich in Abschnitt 1.10, »Mit Versionen vor Excel 2007 arbeiten«. Abbildung 1.1 Zelle, deren Inhalt verschoben werden soll 4. Wählen Sie den Menüpunkt Makro aufzeichnen. Es erscheint das Dialogfeld Makro aufzeichnen (siehe Abbildung 1.2). Die meisten Beispiele in diesem Buch laufen auch unter den älteren ExcelVersionen. Falls einzelne Beispiele anders oder gar nicht funktionieren, wird dies an der betreffenden Stelle erläutert. Sämtliche Beispiele finden Sie – getrennt für die Versionen vor und ab Excel 2007 – auch im Downloadpaket zum Buch, das Sie über www.rheinwerk-verlag.de/4015 erreichen. 1.3.1 Makro aufzeichnen Mithilfe der folgenden Beschreibung erstellen Sie ein Makro, um den Inhalt von Zelle A1 nach Zelle C1 zu verschieben. Dazu benötigen Sie natürlich kein VBA. Es dient aber der ersten Verdeutlichung der Abläufe: Makro erstellen 1. Starten Sie Excel 2016. Abbildung 1.2 Makro mit dem Namen »Makro1« 5. Der vorgeschlagene Makroname lautet Makro1. Diesen können Sie beibehalten. 2. Sie haben eine leere Arbeitsmappe (Mappe1) vor sich. Tragen Sie in Zelle A1 einen beliebigen Inhalt (Zahl oder Text) ein (siehe Abbildung 1.1). 6. Betätigen Sie die Schaltfläche OK. Ab jetzt werden alle Aktionen, die Sie ausführen, aufgezeichnet. 3. Betätigen Sie auf der Registerkarte Ansicht den unteren Teil der Schaltfläche Makros, der mit einem Pfeil gekennzeichnet ist. Es klappt ein kleines Untermenü auf. 7. Wählen Sie Zelle A1 aus. 8. Schneiden Sie den Inhalt von Zelle A1 aus. 9. Wählen Sie die Zelle C1 aus. 10. Fügen Sie den Inhalt von Zelle A1 ein. 20 21 1 1.3 Einführung Aufzeichnung beginnt 11. Der Inhalt von Zelle A1 wurde nach Zelle C1 verschoben (siehe Abbildung 1.3). Übung 1 A 12. Klappen Sie in der Registerkarte Ansicht wiederum über den Pfeil auf der Schaltfläche Makros das Menü auf. Tragen Sie eine Zahl oder einen Text in Zelle E3 ein. Zeichnen Sie ein Makro auf, das den Inhalt der Zelle E3 nach Zelle E5 kopiert. Nennen Sie das Makro KopieE3E5. 13. Wählen Sie den Menüpunkt Aufzeichnung beenden. Damit wird die Aufzeichnung Ihrer Aktionen beendet. 14. Hinweis: Speichern Sie die Datei an dieser Stelle noch nicht. Sie haben damit soeben Ihr erstes Makro erfolgreich erstellt. Mit Makros arbeiten 1 1.3.2 Makro ausführen Das soeben erstellte Makro soll nun ausgeführt werden. Gehen Sie dazu wie folgt vor: Makro starten 1. Tragen Sie in Zelle A1 einen beliebigen Inhalt ein (Zahl oder Text). 2. Klappen Sie auf der Registerkarte Ansicht über den Pfeil unten auf der Schaltfläche Makros das Menü auf. 3. Wählen Sie den Menüpunkt Makros anzeigen. 4. Es erscheint das Dialogfeld Makro mit einer Liste der bisher erstellten Makros. Wählen Sie in der Liste das Makro Makro1 aus. 5. Betätigen Sie die Schaltfläche Ausführen. 6. Der Inhalt der Zelle A1 wurde wiederum nach C1 verschoben. Abbildung 1.3 Zellen nach der Verschiebung Symbol zum Aufzeichnen Das Aufzeichnen geht etwas schneller, wenn Sie in der Excel-Oberfläche das entsprechende Symbol in der Statusleiste betätigen (siehe Abbildung 1.4). Damit haben Sie Ihr erstes Makro erfolgreich ausgeführt. Übung 1 B Tragen Sie einen neuen Inhalt in Zelle E3 ein. Führen Sie das Makro KopieE3E5 aus, und überprüfen Sie anhand des Ergebnisses die korrekte Umsetzung. Abbildung 1.4 Symbol zum Starten einer Makro-Aufzeichnung Hinweis Nach Beginn der Aufzeichnung erscheint an der gleichen Stelle das Symbol zum Beenden der Aufzeichnung in der Statusleiste (siehe Abbildung 1.5). Ein Makro sollte einen möglichst sprechenden Namen haben, der etwas über seine Arbeitsweise aussagt. Es kann dann leichter in der Liste der Makros gefunden und ausgewählt werden. Name des Makros 1.3.3 Makro ansehen Abbildung 1.5 Symbol zum Beenden einer Makro-Aufzeichnung 22 Sie können sich den VBA-Code des soeben erstellten Makros ansehen, um einen ersten Eindruck von typischem VBA zu erhalten. Gehen Sie dazu wie folgt vor: VBA-Code 23 1 1.3 Einführung 1. Klappen Sie in der Registerkarte Ansicht über den Pfeil auf der Schaltfläche Makros das Menü auf. 2. Wählen Sie den Menüpunkt Makros anzeigen. 3. Es erscheint das Dialogfeld Makro mit einer Liste der bisher erstellten Makros. Wählen Sie in der Liste das Makro Makro1 aus. 4. Betätigen Sie die Schaltfläche Bearbeiten. Visual Basic Editor Es erscheint der Visual Basic Editor (kurz: VBE), die eigentliche Entwicklungsumgebung. Auf seine einzelnen Elemente wird in Abschnitt 1.4, »Visual Basic Editor (VBE) als Entwicklungsumgebung«, eingegangen. Zunächst ist im rechten Fenster der Code des Makros zu sehen (siehe Abbildung 1.6). 왘 Selection.Cut bedeutet: Der Inhalt der aktuellen Auswahl, also der Inhalt der Zelle A1, wird ausgeschnitten und befindet sich anschließend in der Zwischenablage. Mit Makros arbeiten Cut 1 왘 Range("C1").Select bedeutet: Die Zelle C1 wird ausgewählt, siehe oben. 왘 ActiveSheet.Paste bedeutet: Der Inhalt der Zwischenablage wird in das aktuell aktive Tabellenblatt eingefügt. Paste Der Inhalt der Zelle A1 wurde nach C1 verschoben. Übung 1 C Interpretieren Sie den VBA-Code des Makros KopieE3E5(): Sub KopieE3E5() Range("E3").Select Selection.Copy Range("E5").Select ActiveSheet.Paste End Sub Dieses Makro finden Sie in Mappe1.xlsm, Modul 2. Schließen Sie den VBE über das Menü Datei • Schliessen und zurück zu Microsoft Excel. Es erscheint die Excel-Oberfläche. 1.3.4 Makro speichern Abbildung 1.6 VBA-Code des Makros »Makro1« Es folgt eine kurze Erläuterung der einzelnen Zeilen. Es macht nichts, wenn Sie noch nicht alles genau verstehen. Die einzelnen Code-Elemente werden später ausführlicher erläutert: Sub … End Sub 왘 Der Code des Makros Makro1 ist innerhalb einer Sub-Prozedur zwischen Sub und End Sub notiert. Nach dem Namen eines Makros bzw. einer SubProzedur werden Klammern notiert, die zunächst leer sind. Ihre Bedeutung wird später erläutert. Kommentar 왘 Ein Apostroph dient dazu, eine ganze Zeile bzw. den Rest einer Zeile zu einem Kommentar zu machen. Der Text hinter einem Apostroph dient nur der Erläuterung des VBA-Codes. Er wird nicht ausgeführt. 왘 Range("A1").Select bedeutet: Es wird die Zelle A1 ausgewählt. 24 Excel-Dateien können seit Excel 2007 sowohl mit Makros als auch ohne Makros gespeichert werden. Rufen Sie in Excel 2016 das Menü Datei auf und darin den Menüpunkt Speichern. Auf der rechten Seite wählen Sie die Schaltfläche Durchsuchen. Es erscheint das Dialogfeld Speichern unter. Dateiendung ».xlsx« In Excel 2013 wählen Sie dazu auf der rechten Seite nacheinander die Schaltflächen Computer und Durchsuchen. In Excel 2010 erscheint das Dialogfeld Speichern unter direkt nach Auswahl des Menüpunktes Speichern im Menü Datei. In Excel 2007 erscheint das Dialogfeld Speichern unter nach Auswahl der Schaltfläche Office und des Menüpunktes Speichern. Als Dateityp ist im Dialogfeld Speichern unter angegeben: ExcelArbeitsmappe mit der Dateiendung .xlsx (siehe Abbildung 1.7). 25 1 1.3 Einführung Excel 2016 (ebenso wie die Vorgängerversionen) möchte Sie davor bewahren, möglicherweise schädlichen VBA-Code auszuführen. Unterhalb der Multifunktionsleiste erscheint daher eine Sicherheitswarnung mit dem Hinweis, dass die in dieser Datei enthaltenen Makros deaktiviert wurden (siehe Abbildung 1.10). Mit Makros arbeiten Sicherheitswarnung Abbildung 1.7 Als Arbeitsmappe ohne Makros speichern Falls Sie nun die Schaltfläche Speichern betätigen, erscheint der Hinweis, dass die in dieser Datei enthaltenen Makros bei diesem Dateityp nicht mitgespeichert werden (siehe Abbildung 1.8), also verloren gehen. Abbildung 1.8 Warnung, dass Makros nicht mitgespeichert werden Dateiendung ».xlsm« Zur Speicherung mit Makros sollten Sie daher zunächst die Schaltfläche Nein betätigen. Wählen Sie dann im Dialogfeld Speichern unter als Dateityp die Option Excel-Arbeitsmappe mit Makros (mit der Dateiendung .xlsm) aus und speichern Sie anschließend unter dem gewünschten Namen im gewünschten Verzeichnis, z. B. C:\Temp\Mappe1.xlsm (siehe Abbildung 1.9). Abbildung 1.10 Sicherheitswarnung »Makros wurden deaktiviert.« Diese Reaktion erfolgt aufgrund der folgenden Standardeinstellung für die Makrosicherheit in Excel: Alle Makros mit Benachrichtigung deaktivieren. Falls Sie versuchen, ein Makro auszuführen, erscheint die Information, dass dies nicht möglich ist (siehe Abbildung 1.11). Makros deaktiviert Abbildung 1.11 Hinweis, dass Makro-Ausführung nicht möglich ist Abbildung 1.9 Als Arbeitsmappe mit Makros speichern Nachdem die Datei erfolgreich mit Makros gespeichert wurde, können Sie Excel schließen. Sie haben die Möglichkeit, die in dieser Datei enthaltenen Makros zu aktivieren. Damit wird seit Excel 2010 die Datei in die Liste der vertrauenswürdigen Dokumente aufgenommen. Unter Excel 2007 werden die Makros in dieser Datei damit einmalig aktiviert. Dazu führen Sie Folgendes durch: Makros aktivieren 1. Schließen Sie die Datei. 2. Öffnen Sie sie erneut. 1.3.5 Makrosicherheit ändern Starten Sie Excel erneut. Falls Sie nun die soeben gespeicherte Datei öffnen, stoßen Sie unweigerlich auf das Thema Makrosicherheit. Was bedeutet das? 26 3. Unter Excel 2016 bis Excel 2010 betätigen Sie die Schaltfläche Inhalt aktivieren neben der Sicherheitswarnung (siehe Abbildung 1.10). 4. Unter Excel 2007 betätigen Sie die Schaltfläche Optionen und wählen die Option Diesen Inhalt aktivieren. 27 1 1 1.3 Einführung Mit Makros arbeiten Anschließend verschwindet die Sicherheitswarnung, und Sie können Makros ausführen. Unter Excel 2007 erscheint die Sicherheitswarnung allerdings beim nächsten Öffnen der Datei wieder. Sie können aber auch alle Excel-Dateien in einem Verzeichnis für dauerhaft vertrauenswürdig erklären, siehe Abschnitt 1.3.7, »Makrosicherheit dauerhaft ändern«. 1.3.6 Registerkarte »Entwicklertools« Excel-Optionen Die Registerkarte Entwicklertools bietet weiter gehende Möglichkeiten zur Erstellung und Verwaltung von Makros. Daher sollten Sie sie dauerhaft in Excel einblenden. Unter Excel 2016 bis Excel 2010 rufen Sie dazu das Menü Datei auf und betätigen die Schaltfläche Optionen. Im Dialogfeld Excel-Optionen betätigen Sie die Schaltfläche Menüband anpassen. Auf der rechten Seite markieren Sie die Hauptregisterkarte Entwicklertools (siehe Abbildung 1.12). 1 Abbildung 1.13 Registerkarte »Entwicklertools« 1.3.7 Makrosicherheit dauerhaft ändern Klicken Sie auf der Registerkarte Entwicklertools die Schaltfläche Makrosicherh. an (siehe Abbildung 1.14). Abbildung 1.14 Schaltfläche »Makrosicherh.« Unter Excel 2016 und Excel 2013 öffnet sich anschließend das Dialogfeld Trust Center. Unter Excel 2010 heißt dieses Dialogfeld Sicherheitscenter, unter Excel 2007 Vertrauenscenter. Nach Auswahl der Kategorie Makroeinstellungen bzw. Einstellungen für Makros sehen Sie die Standardeinstellung Alle Makros mit Benachrichtigung deaktivieren (siehe Abbildung 1.15). Außerdem sehen Sie die verschiedenen Möglichkeiten zur Einstellung. Trust Center Abbildung 1.12 Registerkarte »Entwicklertools« einblenden Unter Excel 2007 betätigen Sie die Schaltfläche Office und dort die Schaltfläche Excel-Optionen. In der Kategorie Häufig verwendet aktivieren Sie Entwicklerregisterkarte in der Multifunktionsleiste anzeigen. Entwicklertools Anschließend ist die Registerkarte dauerhaft aktiviert (siehe Abbildung 1.13). Abbildung 1.15 Trust Center 28 29 1 1.4 Einführung Vertrauenswürdige Speicherorte Eigenen Speicherort hinzufügen Die folgende Möglichkeit ist allerdings besser geeignet: Nach Auswahl der Kategorie Vertrauenswürdige Speicherorte sehen Sie eine Liste der vertrauenswürdigen Verzeichnisse. Die Makros in den hier gelisteten Verzeichnissen können immer ausgeführt werden. Falls Sie also in Zukunft alle Ihre Excel-Dateien mit Makros in einem bestimmten Verzeichnis (gegebenenfalls inklusive dessen Unterverzeichnisse) speichern, dann können Sie es zu der Liste hinzufügen. Dazu betätigen Sie die Schaltfläche Neuen Speicherort hinzufügen. Es erscheint ein Dialogfeld, in dem Sie die gewünschten Eingaben vornehmen können (siehe Abbildung 1.16). Visual Basic Editor (VBE) als Entwicklungsumgebung 1.4 Visual Basic Editor (VBE) als Entwicklungsumgebung 1 Es gibt mehrere Wege, den VBE als Entwicklungsumgebung aufzurufen, in der Sie den VBA-Code schreiben. Wie erläutert, gelangen Sie über die Schaltfläche Makros auf der Registerkarte Ansicht oder der Registerkarte Entwicklertools dorthin. Ebenfalls auf der Registerkarte Entwicklertools finden Sie die Schaltfläche Visual Basic zum direkten Aufruf des VBE. Außerdem können Sie den VBE von der Excel-Oberfläche mit der Tastenkombination (Alt) + (F11) aufrufen. Mit der gleichen Tastenkombination können Sie auch wieder vom VBE zur Excel-Oberfläche zurückwechseln. Dies wird in der Praxis häufig durchgeführt. Alt + F11 1.4.1 Menüleiste und Symbolleiste Im oberen Teil des VBE befinden sich eine Menüleiste und die Symbolleiste Voreinstellung. Nützlich für die Programmierung ist ebenfalls die Symbolleiste Bearbeiten, die Sie über das Menü Ansicht • Symbolleisten einblenden können. Beide Symbolleisten sehen Sie in Abbildung 1.18. Symbolleiste »Bearbeiten« Abbildung 1.16 Vertrauenswürdiges Verzeichnis Anschließend ist die Liste der vertrauenswürdigen Speicherorte um ein Element ergänzt (siehe Abbildung 1.17). Abbildung 1.18 Symbolleisten »Voreinstellung« und »Bearbeiten« Vertrauenswürdige Dokumente 30 Abbildung 1.17 Liste der vertrauenswürdigen Verzeichnisse Nehmen Sie zu Beginn bitte eine Voreinstellung vor, die für die VBA-Programmierung wichtig ist: Im Menü Extras • Optionen • Registerkarte Editor setzen Sie ein Häkchen bei Variablendeklaration erforderlich (siehe Abbildung 1.19). Falls Sie nicht mehr sicher sind, welche einzelnen Dokumente Sie bereits außerhalb der vertrauenswürdigen Verzeichnisse als vertrauenswürdig erklärt haben, können Sie nach der Auswahl der Kategorie Vertrauenswürdige Dokumente die Schaltfläche Löschen betätigen. Damit wird die gesamte Liste der vertrauenswürdigen Dokumente gelöscht. Anschließend müssen Sie Ihre Dokumente jeweils beim Öffnen wieder einzeln als vertrauenswürdig erklären. Abbildung 1.19 Einstellung »Variablendeklaration erforderlich« Deklaration erzwingen 31 1 1.4 Einführung Option Explicit Dies sorgt ab dem nächsten Öffnen von Excel dafür, dass in jedem Modul oberhalb des VBA-Codes die Zeile Option Explicit steht und alle Variablen deklariert werden müssen. Damit wird in Ihrem VBA-Code automatisch darauf geachtet, dass Sie alle Variablen explizit deklarieren. Dies kann zur Verminderung von Fehlern und zur Verbesserung der Performance Ihrer Programme beitragen. Variablen dienen der Speicherung von Zahlen, Daten und Texten, die im späteren Verlauf eines Programms noch benötigt werden. Dazu mehr in Kapitel 3, »Grundlagen der Programmierung mit VBA«. 1.4.2 Projekt-Explorer und Fenster »Eigenschaften« Auf der linken Seite des VBE befinden sich der Projekt-Explorer und das Fenster Eigenschaften (siehe Abbildung 1.20). Visual Basic Editor (VBE) als Entwicklungsumgebung 왘 Vorhandene Klassenmodule, wie DieseArbeitsmappe und Tabelle1 bis Tabelle3, also die gesamte Arbeitsmappe und die aktuell vorhandenen Tabellen. Hier kann VBA-Code notiert werden, der beim Eintreten bestimmter Ereignisse, wie z. B. beim Öffnen einer Arbeitsmappe, automatisch ausgeführt wird. Klassenmodul 1 왘 eigene Klassenmodule zur objektorientierten Programmierung, die Sie über das Menü Einfügen • Klassenmodul erzeugen können 왘 UserForms, also eigene Dialogfelder zur komfortablen Programmsteuerung, die sich über das Menü Einfügen • UserForm erzeugen lassen UserForm Für uns sind zunächst nur die eigenen Codemodule wichtig. Die VBA-Beispiele in diesem Buch werden in Codemodulen gespeichert, falls kein anderslautender Hinweis erfolgt. Falls Code in UserForms oder eigenen Klassenmodulen gespeichert wird, so ist dies explizit angegeben. Der VBACode in Klassenmodulen bezieht sich normalerweise nur auf das jeweilige Klassenmodul. Per Doppelklick auf ein Element im Projekt-Explorer wird der VBA-Code des betreffenden Moduls eingeblendet. Übung 1 D Blenden Sie den VBA-Code der verschiedenen Elemente ein. Im Fenster Eigenschaften werden die Eigenschaften des aktuell ausgewählten Moduls bzw. die Eigenschaften des ausgewählten Steuerelements eines eigenen Dialogfeldes aufgelistet. Die Werte dieser Eigenschaften können verändert werden. Ein Modul wird durch einen einfachen Klick im Projekt-Explorer ausgewählt. Zunächst ist das Fenster Eigenschaften für uns nicht wichtig. Eigenschaften und Werte 1.4.3 Codefenster Abbildung 1.20 Projekt-Explorer und Fenster »Eigenschaften« 32 Projekt-Explorer Im Projekt-Explorer werden die Elemente der aktuell geöffneten Dateien angezeigt, in denen Sie mit VBA programmieren können. Dies sind: Modul 왘 Eigene Codemodule, wie z. B. das Modul1, das durch die Aufzeichnung eines Makros automatisch erzeugt wurde. Ein eigenes, leeres Modul kann auch über das Menü Einfügen • Modul erzeugt werden. Auf der rechten Seite des VBE befindet sich das bereits bekannte Codefenster mit dem VBA-Code. Sie können eines der Makros von hier aus direkt ausführen. Setzen Sie dazu den Cursor in die betreffende Prozedur. Anschließend können Sie eine der folgenden Aktionen ausführen: Code ausführen 왘 im Menü Ausführen den Menüpunkt Sub/UserForm ausführen aufrufen 왘 die Taste (F5) betätigen Taste »F5« 33 1 1.5 Einführung 왘 in der Symbolleiste Voreinstellung das Symbol mit dem grünen Pfeil, der nach rechts weist, betätigen (siehe Abbildung 1.21). Abbildung 1.21 Symbol »Sub/UserForm ausführen« (Taste »F5«) Übung 1 E Testen Sie auf diese Weise die beiden vorhandenen Makros. Das Ergebnis sehen Sie natürlich nur in der Excel-Oberfläche. Sie müssen also (z. B. mithilfe der Tastenkombination (Alt) + (F11)) zwischen Excel-Oberfläche und VBE hin- und herwechseln. Zur Erinnerung Ein Apostroph im VBA-Code dient dazu, eine ganze Zeile bzw. den Rest einer Zeile hinter dem Apostroph zu einem Kommentar zu machen. Übung 1 F Fügen Sie Ihren beiden Makros jeweils eine Kommentarzeile hinzu mit dem Text: Dieses Makro wurde von [Ihr Name] erstellt. Testen Sie Ihre Makros erneut. Makrocode verstehen und ändern Zur Erläuterung: 1 왘 Der Code der Makros ist jeweils innerhalb einer Sub-Prozedur zwischen Sub und End Sub notiert. Die einzelnen Zeilen werden der Reihe nach durchlaufen und ausgeführt. Sub … End Sub 왘 Range("A1").Select bedeutet: Für einen (Zell-)Bereich (engl. range) wird etwas durchgeführt. In diesem Fall wird der Bereich ausgewählt (engl. select). Der Bereich umfasst hier nur die Zelle A1. Er kann auch mehrere Zellen umfassen. Range 왘 Selection.Cut bedeutet: Für die vorher getroffene Auswahl (engl. selection) wird etwas durchgeführt. In diesem Fall wird die Auswahl ausgeschnitten (engl. cut). Es wurde also der Inhalt der Zelle A1 ausgeschnitten. Dieser Inhalt befindet sich nun in der Zwischenablage. Cut In dem Makro KopieE3E5() aus der Übung 1 A wird auf ähnliche Art und Weise mit Selection.Copy die vorher getroffene Auswahl in die Zwischenablage kopiert. 왘 Range("C1").Select erklärt sich nun von selbst. 왘 ActiveSheet.Paste bedeutet: Für das aktuell aktive Tabellenblatt (engl. sheet) wird etwas durchgeführt. In diesem Fall wird der Inhalt der Zwischenablage eingefügt (engl. paste). Dies wird an der vorher ausgewählten Stelle (Zelle C1) vorgenommen. Paste Hinweis Mit dem Präfix Active wird immer das aktuell aktive Element bezeichnet, wie z. B. ActiveCell (Zelle), ActiveSheet (Tabellenblatt) oder ActiveWorkbook (Arbeitsmappe). Active… 1.5 Makrocode verstehen und ändern Im nächsten Schritt sollen Sie Ihre eigenen Makros verändern. Dazu müssen wir ihren Code etwas näher betrachten, zunächst am Beispiel des Makros Makro1(): Sub Makro1() Range("A1").Select Selection.Cut Range("C1").Select ActiveSheet.Paste End Sub Durch den Eintrag von D1 statt C1 als Zielzelle können Sie den Code leicht verändern. Anschließend wird der Inhalt der Zelle A1 zur Zelle D1 verschoben. Übung 1 G Verändern Sie das Makro KopieE3E5() aus Übung 1 A (siehe Abschnitt 1.3.1, »Makro aufzeichnen«). Es soll der Inhalt der Zellen E3 bis G3 sowohl in die Zellen E5 bis G5 als auch in die Zellen E10 bis G10 kopiert werden. Nennen Sie das geänderte Makro KopieE3E5Neu(). Listing 1.1 Sub Makro1() in Mappe1.xlsm, Modul 1 34 35 1 1.7 Einführung Relative Verweise verwenden 1 Hinweise dazu: 왘 Ein Zellbereich aus mehreren Zellen wird genau wie in Excel notiert, also z. B. E3:G3. 왘 Für eine Zielangabe reicht die Angabe einer einzelnen Zelle aus. Die weiteren Zellen des kopierten Bereichs werden, wie aus Excel gewohnt, in die Nachbarzellen eingefügt. 왘 Aus der Zwischenablage können beliebig viele Kopien eingefügt werden. Hinweis Aktivieren und selektieren In den genannten Beispielen werden Quellbereiche selektiert und Zielbereiche aktiviert. Dadurch erhält man als VBA-Neuling einen leicht verständlichen Einstieg, weil der Code die gleichen Schritte ausführt wie Benutzer in der Excel-Oberfläche. Abbildung 1.22 Makro einer Schaltfläche zuordnen Anschließend erscheint die Schaltfläche im Bearbeitungsmodus. Klicken Sie einmal neben die Schaltfläche. Anschließend können Sie durch Klick auf die Schaltfläche das Makro ausführen (siehe Abbildung 1.23). Es wird aber mehr Code als notwendig erzeugt. Die Wartung solchen Codes dauert länger, und die Ausführung ist langsamer. Im weiteren Verlauf dieses Buches werden Sie lernen, wie Sie besseren Code erstellen. 1.6 Makro per Schaltfläche ausführen Schaltfläche einfügen Sie können als Entwickler Benutzern das Starten eines Makros erleichtern, indem Sie ihnen eine Schaltfläche (engl. button) zur Verfügung stellen. So können Sie ein übersichtlich zu bedienendes Tabellenblatt mit Daten, Formeln und Programmen vorbereiten. Zur Erzeugung einer Schaltfläche gehen Sie wie folgt vor: 1. Auf der Registerkarte Entwicklertools betätigen Sie die Schaltfläche Einfügen. Abbildung 1.23 Neu eingefügte Schaltfläche Hinweis Sie können eine Schaltfläche nachträglich bearbeiten. Dazu klicken Sie mit der rechten Maustaste auf die Schaltfläche. Dann sind Sie wieder im Bearbeitungsmodus. Sie können nun ihre Größe und Position verändern. Über das Kontextmenü (wiederum erreichbar per Rechtsklick) können Sie ihr ein anderes Makro zuweisen oder den Text auf der Schaltfläche verändern. Schaltfläche bearbeiten 2. Es erscheint eine Sammlung von Steuerelementen. Darin wählen Sie das Symbol links oben: Schaltfläche (Formular-Steuerelement). 3. Platzieren Sie den Mauszeiger an der gewünschten Stelle auf dem Tabellenblatt. Es erscheint ein kleines Kreuz. Drücken Sie die linke Maustaste, halten Sie sie gedrückt, und ziehen Sie die Schaltfläche in der gewünschten Größe auf. Makro und Schaltfläche verbinden 36 4. Es erscheint das Dialogfeld Makro zuweisen (siehe Abbildung 1.22). Suchen Sie das gewünschte Makro heraus, und bestätigen Sie mit OK. 1.7 Relative Verweise verwenden Beim Aufzeichnen der Makros ist Ihnen sicherlich schon die Schaltfläche Relative Verweise verwenden aufgefallen. In früheren Versionen hieß die Schaltfläche Relative Aufzeichnung. Dabei handelt es sich um eine Schaltfläche, die Sie an zwei Stellen betätigen können: 37 1 1.8 Einführung 왘 in dem Menü, das über die Schaltfläche Makros auf der Registerkarte Ansicht erreicht werden kann 왘 auf der Registerkarte Entwicklertools Schalter Absolut aufzeichnen Relativ aufzeichnen Falls dieser Schalter eingeschaltet ist, also optisch hervorgehoben wird, werden die nachfolgenden Makros relativ aufgezeichnet. Bei den bisher erstellten Makros war dieser Schalter nicht eingeschaltet. Diese Makros wurden daher absolut aufgezeichnet: 왘 Absolute Aufzeichnung bedeutet, dass im Makrocode absolute Zellangaben stehen (Beispiel: A1, C1). Bei der Ausführung eines solchen Makros ist es egal, welche Zelle in Excel aktiv ist, denn es wird immer mit den Zellen A1 und C1 gearbeitet. 왘 Relative Aufzeichnung bedeutet, dass im Makrocode relative Zellangaben stehen. Bei der Ausführung eines solchen Makros werden die Aktionen relativ zu der Zelle ausgeführt, die in Excel aktiv ist. Zur Verdeutlichung soll ein Makro aufgezeichnet werden, in dem das Gleiche gemacht wird wie im ersten Beispielmakro: Der Inhalt der Zelle A1 wird nach C1 verschoben. Allerdings wird das Makro relativ aufgezeichnet. Führen Sie folgende Schritte durch: 1. Aktivieren Sie in Excel den Schalter Relative Verweise verwenden bzw. Relative Aufzeichnung. Persönliche Makroarbeitsmappe 왘 ActiveCell.Offset(0, 2).Range("A1").Select: Ausgehend von der aktiven Zelle wird ein Offset (also ein Versatz) ausgewählt. Die Angaben in Klammern stehen für Zeile und Spalte des Versatzes. Es wird also eine Zelle in der gleichen Zeile (Offset-Zeile 0) und zwei Spalten weiter rechts (Offset-Spalte 2) ausgewählt. Falls die aktive Zelle D10 ist, dann wird demnach die Zelle F10 ausgewählt. Offset 1 Zu diesem Versatz wird der Bereich A1 ausgewählt. Dies ist nicht die absolute Zelle A1 des Tabellenblattes, sondern die oberste linke Zelle des Versatzes. Diese Zelle (in der gleichen Zeile, zwei Zellen weiter rechts) wird ausgewählt. 왘 ActiveSheet.Paste: Es geschieht das Gleiche wie bei der absoluten Aufzeichnung, also der Inhalt der Zwischenablage wird eingefügt. Paste Dieses Makro zeigt ein ganz anderes Verhalten als das Makro, das absolut aufgezeichnet wurde. Beide Makro-Aufzeichnungsarten haben ihre Vorteile, je nach Situation. Hinweis Nach dem Schließen und erneuten Öffnen von Excel steht der Schalter immer auf Absolute Aufzeichnung. Sie können während einer Aufzeichnung über den Schalter zwischen relativer und absoluter Aufzeichnung wechseln, falls dies notwendig sein sollte. 2. Tragen Sie in Zelle A1 einen beliebigen Inhalt ein (Zahl oder Text). 3. Wählen Sie die Zelle A1 aus. Übung 1 H 4. Beginnen Sie mit der Aufzeichnung des Makros (Name Makro2). Erstellen Sie ein Makro, das den Inhalt von drei nebeneinanderliegenden, markierten Zellen um zwei Zeilen bzw. um sieben Zeilen nach unten kopiert. Es entspricht dem Makro aus der Übung 1 G (siehe Abschnitt 1.5, »Makrocode verstehen und ändern«), allerdings mit relativer Aufzeichnung. Nennen Sie das Makro RelKopie(). Testen Sie es, und interpretieren Sie den VBA-Code. 5. Schneiden Sie den Inhalt der Zelle A1 aus. 6. Fügen Sie den Inhalt der Zwischenablage in Zelle C1 ein. Der Inhalt der Zelle A1 wurde nach C1 verschoben. 7. Beenden Sie die Makro-Aufzeichnung. Relative Verschiebung Bis hierhin ist noch kein sichtbarer Unterschied aufgetreten. Falls Sie allerdings das Makro ausführen, wird jeweils der Inhalt der aktuell ausgewählten Zelle um zwei Zellen nach rechts verschoben (z. B. von D10 nach F10) und nicht immer der Inhalt der Zelle A1 nach Zelle C1. Die aktive Zelle ist nun der Ausgangspunkt. Betrachten wir den Code: Cut 38 왘 Selection.Cut: Es geschieht das Gleiche wie bei der absoluten Aufzeichnung, also der Inhalt der aktiven Zelle wird ausgeschnitten. Er liegt nun in der Zwischenablage. 1.8 Persönliche Makroarbeitsmappe Die bisher aufgezeichneten Makros wurden in der aktuell aktiven Arbeitsmappe gespeichert. Daher stehen sie nur dort zur Verfügung. Falls Sie bestimmte Makros für den universellen Einsatz immer zur Verfügung haben möchten, sollten Sie sie in der Mappe Persönliche Makroarbeits- Makros überall benutzen 39 1 1.9 Einführung mappe speichern. Dabei handelt es sich um eine Arbeitsmappe, die immer zusammen mit Excel geöffnet wird, sobald sie existiert. Zum Speichern eines Makros in der Mappe Persönliche Makroarbeitsmappe muss beim Aufzeichnen eines Makros im Dialogfeld Makro aufzeichnen der entsprechende Eintrag in der Liste Makro speichern in: ausgewählt werden (siehe Abbildung 1.24). Code schreiben für einfache Ausgaben 1 Übung 1 I Erstellen Sie das gleiche Makro wie in der letzten Übung, der Übung 1 H. Speichern Sie es aber diesmal in der Mappe Persönliche Makroarbeitsmappe. Schließen Sie Excel. Testen Sie das Makro nach dem erneuten Öffnen von Excel in einer beliebigen Arbeitsmappe. 1.9 Code schreiben für einfache Ausgaben Abbildung 1.24 In der Mappe »Persönliche Makroarbeitsmappe« speichern Datei personal.xlsb Nach der Aufzeichnung erscheint ein weiterer Eintrag im Projekt-Explorer des VBE: die Datei personal.xlsb (siehe Abbildung 1.25). Ihr Standardspeicherort ist seit Windows Vista das (eventuell versteckte, d. h. ausgeblendete) Verzeichnis C:\Benutzer\[ Benutzername ]\AppData\Roaming\Microsoft\Excel\XLStart und unter Windows XP C:\Dokumente und Einstellungen\[ Benutzername ]\Anwendungsdaten\Microsoft\Excel\XLStart. In diesem Abschnitt wird erstmalig VBA-Code nicht durch eine Makro-Aufzeichnung, sondern durch Schreiben des Codes in einer eigenen Sub-Prozedur erstellt. Es entsteht also das erste richtige VBA-Programm. Außerdem werden drei Möglichkeiten zur Ausgabe von Ergebnissen oder Kontrollwerten genannt, die häufig in der VBA-Programmierung benutzt werden: Selbst programmieren 왘 in einer Zelle 왘 in einer Nachrichtenbox 왘 im Direktfenster des VBE 1.9.1 Eigene Sub-Prozedur Zunächst zur Erstellung einer eigenen Sub-Prozedur. Wechseln Sie mit den Tasten (Alt) + (F11) zum VBE. Schreiben Sie unterhalb des letzten Makros die folgende Zeile: Sub AusgabeZelle Sobald Sie mit der Taste (¢) die Zeile wechseln, stellen Sie fest, dass der Editor Sie bei der VBA-Programmierung unterstützt (siehe Abbildung 1.26): Unterstützung durch Editor 왘 Am Ende der Zeile werden Klammern angefügt. 왘 Es wird die Zeile mit End Sub erzeugt. Abbildung 1.25 »Persönliche Makroarbeitsmappe« im Projekt-Explorer 왘 Der Cursor steht in der Zeile dazwischen – bereit zur Eingabe Ihres VBACodes. 왘 Es wird eine Trennzeile zwischen den einzelnen Makros erzeugt. Makros immer verfügbar Falls diese Datei verändert wurde, indem z. B. ein Makro hinzugefügt oder geändert wurde, werden Sie bei jedem Schließen von Excel gefragt, ob Sie diese Änderungen speichern möchten. Nach jedem Öffnen von Excel stehen die Makros in dieser Datei zur Verfügung. Abbildung 1.26 Neue eigene Sub-Prozedur 40 41 1 1.9 Einführung Der Editor bietet dem Programmierer umfangreiche weitere Unterstützung, aber dazu später. Prozedurname (…) Hinter dem Namen einer Sub-Prozedur (oder kurz Prozedur) stehen immer Klammern, ebenso wie bei Ihren bisherigen Makros. Diese Klammern sind zunächst leer. Später werden Sie sehen, dass Sie innerhalb der Klammern Aufrufparameter notieren können, die eine Prozedur flexibler machen können. Code schreiben für einfache Ausgaben 1.9.3 In Nachrichtenbox ausgeben 1 Schreiben Sie eine weitere Prozedur mit folgendem Code: Sub AusgabeBox() MsgBox "Hallo" End Sub Listing 1.3 Sub AusgabeBox() in Mappe1.xlsm, Modul 1 1.9.2 In Zelle ausgeben Geben Sie in der Prozedur AusgabeZelle() folgende Codezeile ein: Range("A1").Value = "Hallo" Damit sieht Ihre Prozedur wie folgt aus: Nach dem Aufruf erscheint eine kleine Nachrichtenbox mit dem Text Hallo (siehe Abbildung 1.28). Diese Box wird erst dann geschlossen, wenn der Benutzer die Schaltfläche OK betätigt hat. Anschließend laufen, falls vorhanden, weitere Teile des Programms ab. Sollte der VBE einmal unerwartet keinerlei Reaktion zeigen, wechseln Sie einfach mit (Alt) + (F11) zum Excel-Tabellenblatt: Vielleicht wartet dort eine Nachricht auf Ihre Reaktion. Box schließen Sub AusgabeZelle() Range("A1").Value = "Hallo" End Sub Listing 1.2 Sub AusgabeZelle() in Mappe1.xlsm, Modul 1 Beim Ausführen dieser Prozedur, z. B. mithilfe der Taste (F5), wird der Text Hallo in Zelle A1 ausgegeben (siehe Abbildung 1.27). Abbildung 1.28 In Nachrichtenbox ausgeben Eine solche Nachrichtenbox können Sie u. a. benutzen zur: MsgBox 왘 Kontrollausgabe während der Programmierung Abbildung 1.27 Ergebnis der eigenen Sub-Prozedur 왘 Information des Benutzers bei einem Fehler 왘 Information des Benutzers am Ende eines Programms Eigenschaft »Value« Sie haben bereits gesehen, dass Sie einen Bereich, der eine oder mehrere Zellen umfasst, über Range ansprechen können. Wir haben die Methode Select() aufgerufen, um diesen Bereich auszuwählen. Diesmal wird die Eigenschaft Value mit einem Eigenschaftswert versehen, dem Text Hallo. Über Value erhält die Zelle einen Wert. Hinweis Eine Prozedur sollte einen möglichst sprechenden Namen haben, der etwas über ihre Arbeitsweise aussagt. Außerdem muss der Name innerhalb der Anwendung eindeutig sein. Es darf also kein Prozedurname doppelt vorkommen. 42 Bei MsgBox handelt es sich um eine vorgefertigte Funktion, bei der Sie eine Zeichenkette, z. B. einen Text in Anführungsstrichen, als Aufruf-Parameter notieren müssen. Die Funktion MsgBox() kann allerdings wesentlich mehr, wie Sie in Abschnitt 8.3, »Einfacher Dialog mit dem Benutzer«, sehen werden. Bei längeren Ausgaben wird häufig ein Zeilenumbruch benötigt. Dieser wird über die Konstante vbCrLf bereitgestellt. Ein Beispiel: vbCrLf Sub AusgabeBoxZeilenumbruch() MsgBox "Hallo" & vbCrLf & "Welt" End Sub Listing 1.4 Sub AusgabeBoxZeilenumbruch() in Mappe1.xlsm, Modul 1 43 1 1.10 Einführung Mit Versionen vor Excel 2007 arbeiten Die Ausgabe sehen Sie in Abbildung 1.29. 1 Abbildung 1.30 Im Direktfenster ausgeben Abbildung 1.29 Mit Zeilenumbruch ausgeben Den Namen dieser Konstanten kann man sich leicht merken, denn es handelt sich dabei um ein Relikt aus der Urzeit: In vbCrLf steht das Cr für Carriage Return, den Wagenrücklauf der Schreibmaschine zum Zeilenanfang. Das Lf steht für Line Feed, den Zeilenvorschub. Hinweis Operator »&« Der Operator & dient der Verkettung von Zeichenfolgen. Er wird häufig benötigt, um Ergebnisse anschaulich zusammen mit Text darzustellen. 1.9.4 Im Direktfenster des VBE ausgeben Schreiben Sie eine weitere Prozedur mit folgendem Code: Sub AusgabeKontrolle() Debug.Print "Hallo" End Sub Listing 1.5 Sub AusgabeKontrolle() in Mappe1.xlsm, Modul 1 Debug.Print Nach dem Aufruf erscheint zunächst gar nichts, da das Direktfenster des VBE nicht eingeblendet ist. Zeigen Sie es über das Menü Ansicht • Direktfenster im VBE an. Anschließend sehen Sie die soeben erzeugte Ausgabe (siehe Abbildung 1.30). Das Direktfenster (= Direktbereich) können Sie ebenfalls zur Kontrollausgabe während der Programmierung nutzen. 1.10 Mit Versionen vor Excel 2007 arbeiten Zunächst das Wichtigste: Excel-Dateien werden in den Versionen vor Excel 2007 einheitlich mit der Dateiendung .xls gespeichert, unabhängig davon, ob sie Makros enthalten oder nicht. Die meisten Beispiele in diesem Buch laufen auch unter Versionen vor Excel 2007. Im Downloadpaket zum Buch, das Sie über www.rheinwerk-verlag.de/4015 erreichen, stehen die Dateien daher zusätzlich im xls-Format zur Verfügung. Als Beispiel für das Arbeiten mit den Versionen vor Excel 2007 (genauer Excel 97 bis Excel 2003) soll in diesem Abschnitt Excel 2002 dienen. Es werden nur die Unterschiede zu Excel 2016 erläutert, in Anlehnung an die Reihenfolge der bisherigen Abschnitte. 1.10.1 Makro aufzeichnen Zum Starten einer Aufzeichnung wählen Sie im Menü Extras das Untermenü Makro und darin den Menüpunkt Aufzeichnen. Zum Beenden der Aufzeichnung wählen Sie im Menü Extras das Untermenü Makro und darin den Menüpunkt Aufzeichnung beenden. Nach dem Start einer Aufzeichnung erscheint die kleine Symbolleiste Aufzeichnung beenden. Sollte sie nicht von selbst erscheinen, kann sie auf die übliche Art eingeblendet werden: mit der rechten Maustaste im Bereich der Symbolleisten klicken und das Häkchen vor der betreffenden Symbolleiste setzen. Sie beinhaltet zwei Symbole: 왘 Mit Betätigung des linken Symbols können Sie die Aufzeichnung ebenfalls beenden. 44 45 1 1.10 Einführung 왘 Mit Betätigung des rechten Symbols können Sie auf relative Aufzeichnung umschalten. Diese Einstellung gilt ebenfalls für spätere MakroAufzeichnungen. Mit Versionen vor Excel 2007 arbeiten 1.10.5 Makrosicherheit ändern 1 Beim Öffnen einer Datei, die ein Makro beinhaltet, kommt es darauf an, welche Sicherheitsstufe in Excel eingestellt ist: 왘 Hoch: Die Ausführung von nicht signierten Makros wird abgelehnt. 1.10.2 Makro ausführen Zum Ausführen des Makros wählen Sie im Menü Extras das Untermenü Makro und darin den Menüpunkt Makros. Wählen Sie im Dialogfeld Makro das gewünschte Makro aus, und klicken Sie auf die Schaltfläche Ausführen. 1.10.3 Makro ansehen Zum Ansehen des Makros wählen Sie im Menü Extras das Untermenü Makro und darin den Menüpunkt Makros. Wählen Sie im Dialogfeld Makro das gewünschte Makro aus, und klicken Sie auf die Schaltfläche Bearbeiten. Es erscheint der VBE. Sie können ihn über den Menüpunkt Schließen und zurück zu Microsoft Excel im Menü Datei wieder beenden. 왘 Mittel: Es wird Ihnen die Möglichkeit gegeben, die Makros in dieser Datei einmalig zu aktivieren oder zu deaktivieren. 왘 Niedrig: Die Ausführung von nicht signierten Makros wird generell erlaubt. Zum Ändern der Sicherheitsstufe wählen Sie im Menü Extras das Untermenü Makro und darin den Menüpunkt Sicherheit. Es erscheinen die drei genannten Möglichkeiten. Eine Änderung wird erst beim nächsten Öffnen einer Excel-Datei wirksam. 1.10.6 Symbolleiste »Visual Basic« einblenden Nach dem Einblenden der Symbolleiste Visual Basic haben Sie schnelleren Zugriff auf die wichtigsten Befehle im Zusammenhang mit Makros und der Entwicklung mit Visual Basic. 1.10.4 Makro speichern Wie bereits erwähnt, werden Excel-Dateien in diesen Versionen einheitlich gespeichert, unabhängig davon, ob sie Makros enthalten oder nicht. Zum Speichern der Datei wählen Sie im Menü Datei den Menüpunkt Speichern. Es erscheint das Dialogfeld Speichern unter. Als Dateityp ist Excel-Arbeitsmappe mit der Dateiendung .xls angegeben. Wählen Sie den gewünschten Dateinamen und das gewünschte Verzeichnis aus, und klicken Sie auf die Schaltfläche Speichern. Dateityp ändern Kompatibilitätsprüfung 46 Falls Sie an einem externen PC eine der Excel-Versionen von 2007 bis 2016 zur Verfügung haben und eine dort erstellte Excel-Datei auf Ihrem PC in einer Version vor Excel 2007 haben wollen, rufen Sie auf dem externen PC das Dialogfeld Speichern unter auf, und wählen Sie den Dateityp Excel 97-2003-Arbeitsmappe mit der Dateiendung .xls. Falls sich in der Datei VBA-Code befindet, der nicht unter älteren Excel-Versionen ausgeführt werden kann, erscheint das Dialogfeld Kompatibilitätsprüfung. Darin wird das Problem genauer erläutert. 1.10.7 Visual Basic Editor (VBE) als Entwicklungsumgebung Zum Aufruf des VBE wählen Sie im Menü Extras das Untermenü Makro und darin den Menüpunkt Visual Basic-Editor oder die Tastenkombination (Alt) + (F11). Das Symbol zum Starten eines Makros aus dem Codefenster heraus ist ein grüner Pfeil. Alternativ können Sie das Menü Ausführen (Menüpunkt Sub/UserForm ausführen) oder die Funktionstaste (F5) nutzen. 1.10.8 Persönliche Makroarbeitsmappe verwalten Die Persönliche Makroarbeitsmappe heißt personal.xls, und ihr Standardspeicherort ist seit Windows Vista das (eventuell versteckte, d. h. ausgeblendete) Verzeichnis C:\Benutzer\[Benutzername]\AppData\Roaming\Microsoft\Excel \XLStart und unter XP C:\Dokumente und Einstellungen\[Benutzername] \Anwendungsdaten\Microsoft\Excel\XLStart. 47 Kapitel 2 Grundlagen von Objekten und Ereignissen 2 In diesem Kapitel lernen Sie den Umgang mit den Objekten »Arbeitsmappe«, »Tabellenblatt« und »Zellbereich« mit ihren jeweiligen Eigenschaften, Methoden und Ereignissen kennen. VBA ist eine objektorientierte Sprache, d. h., es wird mit Objekten gearbeitet. Objekte verfügen über Eigenschaften, Methoden und Ereignisse: Objekt 왘 Eigenschaften (Attribute) bestimmen das Aussehen eines Objekts. Ein Tabellenblatt verfügt z. B. über die Eigenschaft Name. Der Wert dieser Eigenschaft ist die Bezeichnung des Tabellenblattes (z. B. Tabelle1). Eigenschaft 왘 Methoden bestimmen die Fähigkeiten eines Objekts. Ein Tabellenblatt verfügt z. B. über die Methode Copy(), d. h., es kann kopiert werden. Methode 왘 Ereignisse bestimmen, was mit dem Objekt passiert. Bei einem Tabellenblatt kann z. B. als Ereignis eine Aktivierung stattfinden. Ereignisse können mit VBA-Code verbunden werden, so dass automatisch weitere Aktionen folgen können. Ereignis In diesem Kapitel werden Ihnen zahlreiche Möglichkeiten von VBA vorgestellt, ohne in die Programmierung mit Variablen, Verzweigungen und Schleifen einsteigen zu müssen. Im folgenden Kapitel werden dann diese wichtigen Elemente der Programmierung erläutert, die die automatisierte Bearbeitung von Excel erheblich verbessern. 2.1 Objekthierarchie und Auflistungen Wie bereits erwähnt, verfügen Objekte über Eigenschaften. Eine Eigenschaft eines Objekts kann wiederum ein Unterobjekt sein, mit eigenen Eigenschaften, Methoden und Ereignissen. Setzen Sie diese Überlegung weiter fort, so erhalten Sie eine Hierarchie von Objekten, ausgehend von einem Hauptobjekt. Hierarchie 49 2 2.2 Grundlagen von Objekten und Ereignissen Application Das Hauptobjekt bei Office-Anwendungen ist Application (engl. für Anwendung). In unserem Fall wird damit das Programm Excel selbst bezeichnet: Workbooks 왘 Eine Eigenschaft des Objekts Application ist die Auflistung Workbooks. Darin befinden sich alle geöffneten Arbeitsmappen, also Excel-Dateien. Worksheets 왘 Eine Eigenschaft einer einzelnen Arbeitsmappe ist die Auflistung Worksheets. Darin befinden sich alle Tabellenblätter einer Arbeitsmappe. Range 왘 Eine Eigenschaft eines einzelnen Tabellenblattes ist das Objekt Range. Darin befinden sich Zellen und Zellbereiche eines Tabellenblattes. Auflistung mit »s« In Excel wird häufig mit Auflistungen gearbeitet, wie z. B. Workbooks oder Worksheets. Es handelt sich dabei um Sammlungen gleichartiger Objekte. Sie sind leicht an der Mehrzahlschreibweise (mit einem s am Ende) erkennbar. Arbeitsmappen bearbeiten Sub MappenZaehlen() MsgBox "Anzahl der Mappen: " & Workbooks.Count End Sub 2 Listing 2.1 Sub MappenZaehlen() in Mappe2.xlsm, Modul 1 Zur Erläuterung: 왘 Es wird der Wert der Eigenschaft Count des Objekts Workbooks ermittelt und mithilfe der Funktion MsgBox() ausgegeben (siehe Abbildung 2.1). Die Überschrift der Nachrichtenbox und die Schaltfläche OK werden ab dieser Abbildung im Buch nicht mehr dargestellt. Count 왘 Zu beachten ist, dass dabei die Persönliche Makroarbeitsmappe mitgezählt wird, falls sie vorhanden ist. Im VBE können Sie sehen, ob es diese Mappe gibt. 2.2 Arbeitsmappen bearbeiten Workbooks Workbook ThisWorkbook Das Objekt Workbooks ist eine Auflistung. In dieser Auflistung befinden sich alle geöffneten Arbeitsmappen, also Excel-Dateien. Abbildung 2.1 Eigenschaft »Count« Das Objekt Workbook (ohne ein s am Ende) steht für eine einzelne Arbeitsmappe. Zur Bearbeitung einer bestimmten Arbeitsmappe gibt es verschiedene Möglichkeiten: 2.2.2 Neue Arbeitsmappe erzeugen 왘 ThisWorkbook: Die Arbeitsmappe mit dem aktuell ausgeführten VBACode. Sie wird im Folgenden auch als diese Arbeitsmappe bezeichnet. 왘 ActiveWorkbook: Die aktuell aktive Arbeitsmappe. Dies muss nicht diese Arbeitsmappe sein. Count Workbooks ("Name") 왘 Workbooks(Index): Index ist die laufende Nummer der Arbeitsmappe innerhalb der Workbooks-Auflistung. Die laufende Nummer einer Auflistung startet immer bei 1 und geht bis zur Nummer des letzten Elements in der Auflistung. Diese letzte Nummer entspricht der Anzahl der Elemente, die Sie bei allen Auflistungen über die Eigenschaft Count ermitteln können. 왘 Workbooks("Name"): Gibt den Namen der Arbeitsmappe als Zeichenkette an (in Anführungszeichen). 2.2.1 Anzahl der Arbeitsmappen ermitteln Zählen 50 Mit folgender Prozedur wird die Anzahl der geöffneten Arbeitsmappen ermittelt: Mit folgender Prozedur wird eine neue Mappe erzeugt und geöffnet. Zur Kontrolle wird die Anzahl der geöffneten Mappen vor und nach dem Erzeugen ausgegeben: Neue Mappe Sub NeueMappe() MsgBox Workbooks.Count Workbooks.Add MsgBox Workbooks.Count End Sub Listing 2.2 Sub NeueMappe() in Mappe2.xlsm, Modul 1 Zur Erläuterung: 왘 Es wird die Methode Add() des Workbooks-Objekts aufgerufen. Dadurch wird eine neue, leere Arbeitsmappe in Excel geöffnet. Diese ist dann die aktive Arbeitsmappe. Add() 왘 Gleichzeitig wird der Auflistung Workbooks ein weiteres Element hinzugefügt, wie Sie an den beiden Ausgaben der Eigenschaft Count (vorher/ nachher) erkennen können. 51 2 2.2 Grundlagen von Objekten und Ereignissen 2.2.3 Vorhandene Arbeitsmappe öffnen Mappe öffnen Mit folgender Prozedur wird eine vorhandene Mappe geöffnet: Sub VorhandeneMappe() Workbooks.Open "C:\Temp\Mappe1.xlsm" End Sub Listing 2.3 Sub VorhandeneMappe() in Mappe2.xlsm, Modul 1 Zur Erläuterung: Open() 왘 Es wird die Methode Open() des Workbooks-Objekts aufgerufen. Dadurch wird die Arbeitsmappe mit dem angegebenen Namen im genannten Verzeichnis geöffnet. Diese ist dann die aktive Arbeitsmappe. 왘 Der Auflistung Workbooks wird ein weiteres Element hinzugefügt. Arbeitsmappen bearbeiten Sub AlleMappenSchliessen() Workbooks.Close End Sub 2 Listing 2.4 Sub AlleMappenSchliessen() in Mappe2.xlsm, Modul 1 Zur Erläuterung: 왘 Es wird die Methode Close() des Objekts Workbooks aufgerufen. Sie schließt alle geöffneten Arbeitsmappen, aber nicht den VBE oder die Excel-Hilfe. Close() 왘 Die Anwendung Excel bleibt weiterhin geöffnet. 왘 Falls ein Benutzer Änderungen in einer Arbeitsmappe vorgenommen hat, wird er gefragt, ob er sie speichern möchte (siehe Abbildung 2.3). 왘 Im Beispiel wurde eine Datei über eine absolute Pfadangabe angesprochen. Sie können auch Dateien mit relativen Pfadangaben und Dateien im gleichen Verzeichnis erreichen, siehe Abschnitt 2.2.10, »Pfad einer Arbeitsmappe ermitteln«. Programmabbruch 왘 Falls die Arbeitsmappe (= Datei) nicht existiert, wird das Programm mit einer Fehlermeldung abgebrochen (siehe Abbildung 2.2). Es kommt zu einem sogenannten Laufzeitfehler. In Kapitel 4, »Fehlerbehandlung«, werden Sie lernen, wie Sie solche Abbrüche vermeiden. Abbildung 2.3 Nachfrage im Anschluss an Dateiänderung 2.2.5 Name einer Arbeitsmappe ermitteln Mit folgender Prozedur wird der Name einer Arbeitsmappe auf zwei Arten ermittelt: Abbildung 2.2 Programmabbruch durch Laufzeitfehler Name der Mappe Sub MappenName() MsgBox "Name: " & ThisWorkbook.Name MsgBox "Name mit Pfad: " & ThisWorkbook.FullName End Sub Listing 2.5 Sub MappenName() in Mappe2.xlsm, Modul 1 Hinweis In den Versionen vor Excel 2007 muss die Dateibezeichnung in der Prozedur wie folgt lauten: Mappe1.xls. 2.2.4 Alle Arbeitsmappen schließen Mappen schließen 52 Zur Erläuterung: 왘 ThisWorkbook verweist immer auf die Arbeitsmappe, in der diese Prozedur steht. Es wird der Wert der Eigenschaft Name ermittelt und ausgegeben. Dies ist der Dateiname der Arbeitsmappe (siehe Abbildung 2.4). Eigenschaft »Name« Mit folgender Prozedur werden alle geöffneten Arbeitsmappen geschlossen: 53 2 2.2 Grundlagen von Objekten und Ereignissen Abbildung 2.4 Eigenschaft »Name« FullName Zusätzlich wird der Wert der Eigenschaft FullName ermittelt und ausgegeben. Dies ist der Dateiname der Arbeitsmappe inklusive vollständiger Pfadangabe (siehe Abbildung 2.5). Abbildung 2.5 Eigenschaft »FullName« 2.2.6 Aktive Arbeitsmappe ermitteln Aktive Mappe Mit folgender Prozedur wird in zwei verschiedenen Situationen der Name der aktiven Arbeitsmappe ermittelt: Arbeitsmappen bearbeiten 왘 Es wird die Methode Close() des Objekts Workbook aufgerufen. Dadurch wird eine einzelne Arbeitsmappe, in diesem Fall die aktive Arbeitsmappe, geschlossen. Danach ist wieder die Arbeitsmappe aktiv, die vor dem Öffnen der gerade geschlossenen Arbeitsmappe aktiv war. Close() 2 왘 Falls Sie eine bestimmte Arbeitsmappe schließen möchten, die Sie über ihren Namen ansprechen, lautet die Anweisung für das vorliegende Beispiel Workbooks("Mappe1.xlsm").Close. Dabei wird kein Pfadname angegeben, siehe auch Abschnitt 2.2.9, »Arbeitsmappe über Index oder Namen auswählen«. 왘 Zur Kontrolle wird wiederum der Name der nun aktiven Arbeitsmappe ausgegeben (siehe Abbildung 2.7). Abbildung 2.7 Wieder aktive Arbeitsmappe nach dem Schließen Hinweis Sub AktiveMappe() Workbooks.Open "C:\Temp\Mappe1.xlsm" MsgBox "Aktiv nach dem Öffnen: " & ActiveWorkbook.Name ActiveWorkbook.Close MsgBox "Aktiv nach dem Schließen: " & ActiveWorkbook.Name End Sub Listing 2.6 Sub AktiveMappe() in Mappe2.xlsm, Modul 1 Zur Erläuterung: 왘 Zunächst wird eine weitere Arbeitsmappe geöffnet. Es wird in diesem Beispiel davon ausgegangen, dass die angegebene Datei existiert. ActiveWorkbook 왘 ActiveWorkbook verweist immer auf die aktuell aktive Arbeitsmappe. Eine Arbeitsmappe ist immer dann aktiv, wenn der Benutzer sie ausgewählt oder der Entwickler sie per Programm aktiviert hat. Eine Arbeitsmappe, die soeben geöffnet wurde, ist automatisch aktiv. 왘 Zur Kontrolle wird der Name der aktiven Arbeitsmappe ausgegeben (siehe Abbildung 2.6). In den Versionen vor Excel 2007 muss die Dateibezeichnung in der Prozedur wie folgt lauten: Mappe3.xls. 2.2.7 Arbeitsmappe aktivieren Mit folgender Prozedur wird eine bereits geöffnete Arbeitsmappe aktiviert. Dies ist dann sinnvoll, wenn mehrere Arbeitsmappen geöffnet sind und Sie sichergehen möchten, anschließend in einer bestimmten Arbeitsmappe weiterzuarbeiten. Sub MappeAktivieren() ThisWorkbook.Activate MsgBox ActiveWorkbook.Name End Sub Listing 2.7 Sub MappeAktivieren() in Mappe2.xlsm, Modul 1 Zur Erläuterung: 왘 Es wird die Methode Activate() des Objekts Workbook aufgerufen. Dadurch wird die angesprochene Arbeitsmappe, in diesem Fall diese Arbeitsmappe, aktiviert. Abbildung 2.6 Aktive Arbeitsmappe nach dem Öffnen 54 Mappe aktivieren Activate() 왘 Zur Kontrolle wird der Name der aktiven Arbeitsmappe ausgegeben. 55 2 2.2 Grundlagen von Objekten und Ereignissen Mappe speichern Arbeitsmappen bearbeiten 2.2.8 Arbeitsmappe speichern 2.2.9 Arbeitsmappe über Index oder Namen auswählen Mit folgender Prozedur wird diese Arbeitsmappe auf zwei verschiedene Arten gespeichert: Mit folgender Prozedur werden bereits geöffnete Arbeitsmappen nacheinander mit zwei verschiedenen Techniken aktiviert: Sub MappeSichern() ThisWorkbook.Save ThisWorkbook.SaveAs "C:\Temp\Mappe2.xlsm" MsgBox "Gesichert: " & ThisWorkbook.Saved End Sub Sub MappeAusListe() Workbooks(1).Activate MsgBox ActiveWorkbook.Name Workbooks("Mappe2.xlsm").Activate MsgBox ActiveWorkbook.Name End Sub Listing 2.8 Sub MappeSichern() in Mappe2.xlsm, Modul 1 Mappe auswählen Listing 2.9 Sub MappeAusListe() in Mappe2.xlsm, Modul 1 Zur Erläuterung: Save() SaveAs() Saved 왘 Es wird die Methode Save() des Objekts Workbook aufgerufen. Dadurch wird diese Arbeitsmappe gespeichert. 왘 Zusätzlich wird die Methode SaveAs() des Objekts Workbook aufgerufen. Dadurch wird diese Arbeitsmappe noch einmal gespeichert, und zwar im Verzeichnis C:\Temp unter dem Namen Mappe2.xlsm. Anschließend arbeiten Sie innerhalb der soeben angelegten Kopie der Mappe (!). 왘 Zur Kontrolle wird der Wert der Eigenschaft Saved ermittelt und ausgegeben. Dabei handelt es sich um einen sogenannten Wahrheitswert, also False (falsch) oder True (wahr). Da die Arbeitsmappe soeben gespeichert wurde, ist der Wert aktuell True (siehe Abbildung 2.8). Nach einer Änderung in der Arbeitsmappe hätte die Eigenschaft den Wert False. Abbildung 2.8 Eigenschaft »Saved« Hinweis Sie können den Wert der Eigenschaft Saved in einer Verzweigung (siehe Abschnitt 3.4, »Verzweigungen«) nutzen. Je nach Wert der Eigenschaft (wahr oder falsch) kann bzw. sollte gespeichert werden. Zur Erläuterung: 왘 Zunächst wird eine geöffnete Arbeitsmappe über den Index ausgewählt. Der Index ist die laufende Nummer der Arbeitsmappe innerhalb der Workbooks-Auflistung, von 1 bis zur Nummer des letzten Elements, die der Anzahl der Elemente der Auflistung entspricht (Eigenschaft Count). Workbooks (Index) 왘 Falls zwei Arbeitsmappen geöffnet sind, können nur die Indizes 1 oder 2 benutzt werden. Wenn Sie einen anderen Index wählen, erfolgt ein Abbruch mit einer Fehlermeldung. Wie erwähnt, werden Sie in Kapitel 4, »Fehlerbehandlung«, lernen, wie Sie solche Abbrüche vermeiden. 왘 Es ist nicht immer einfach, festzustellen, welches gerade die Arbeitsmappe Nummer 1, 2 usw. ist. Daher ist die nachfolgend geschilderte Methode vorzuziehen. 왘 Eine bereits geöffnete Arbeitsmappe wird über ihren Namen (in Anführungszeichen) ausgewählt. Dabei handelt es sich um den reinen Dateinamen, ohne Pfad. Da Sie in Excel nicht gleichzeitig zwei Dateien mit dem gleichen Namen öffnen können, auch wenn sie in unterschiedlichen Verzeichnissen stehen, ist der Name eindeutig. Workbooks ("Name") Hinweis In den Versionen vor Excel 2007 muss die Dateibezeichnung in der Prozedur wie folgt lauten: Mappe2.xls. Hinweis In den Versionen vor Excel 2007 muss die Dateibezeichnung in der Prozedur und in der Erläuterung wie folgt lauten: Mappe2.xls. 56 2.2.10 Pfad einer Arbeitsmappe ermitteln Häufig ist der Zugriff auf Arbeitsmappen im gleichen Verzeichnis oder einem Unterverzeichnis erforderlich. Dazu muss zunächst der Pfad dieser Pfad der Mappe 57 2 2 2.3 Grundlagen von Objekten und Ereignissen Arbeitsmappe (die den VBA-Code enthält) oder der Pfad der aktuellen Arbeitsmappe ermittelt werden. Ein Beispiel, in dem der Pfad von drei verschiedenen Arbeitsmappen ermittelt wird: Sub PfadErmitteln() Workbooks.Open "C:\Temp\Mappe1.xlsm" MsgBox "Mappe1 ist in: " & ActiveWorkbook.Path ActiveWorkbook.Close Tabellenblätter bearbeiten gebene Prozedur PfadErmitteln() befindet. Diese Methode wird häufig benötigt, um sicher zu sein, dass eine Datei geöffnet wird, die im gleichen Verzeichnis steht. Die Arbeitsmappe Mappe1.xlsm wird wieder geschlossen. 2 왘 Zuletzt wird die Arbeitsmappe Test.xlsx geöffnet. Diese steht im Unterverzeichnis Zusatz des Verzeichnisses dieser Arbeitsmappe (siehe Abbildung 2.11). Ihr Name und ihr Pfad werden ausgegeben und dann wird sie wieder geschlossen. MsgBox "Diese Mappe ist in: " & ThisWorkbook.Path Workbooks.Open ThisWorkbook.Path & "\Mappe1.xlsm" ActiveWorkbook.Close Workbooks.Open ThisWorkbook.Path & "\Zusatz\Test.xlsx" MsgBox "Test ist in: " & ActiveWorkbook.Path ActiveWorkbook.Close End Sub Listing 2.10 Sub PfadErmitteln() in Mappe2.xlsm, Modul 1 Abbildung 2.11 Pfad der Mappe »Test« Hinweis In den Versionen vor Excel 2007 müssen die Dateibezeichnungen in den entsprechenden Zeilen der Prozedur und in der Erläuterung wie folgt lauten: Mappe1.xls, erneut Mappe1.xls und Test.xls. Zur Erläuterung: 왘 Zunächst wird die Arbeitsmappe C:\Temp\Mappe1.xlsm geöffnet. Dies ist jetzt die aktive Arbeitsmappe. Ihr Name wird ausgegeben, außerdem der Pfad zu ihrem Verzeichnis, mithilfe der Eigenschaft Path (siehe Abbildung 2.9). Dann wird sie wieder geschlossen. 2.3 Tabellenblätter bearbeiten Das Objekt Worksheets ist eine Auflistung, in der sich alle Tabellenblätter der jeweiligen Arbeitsmappe befinden. Worksheets Zur Bearbeitung eines einzelnen Tabellenblattes gibt es verschiedene Möglichkeiten: Abbildung 2.9 Pfad der Mappe »Mappe1« Path Anschließend wird der Pfad zu dieser Arbeitsmappe ausgegeben, in der sich die oben angegebene Prozedur PfadErmitteln() befindet (siehe Abbildung 2.10). Abbildung 2.10 Pfad »dieser« Mappe 왘 Es wird erneut die Arbeitsmappe Mappe1.xlsm geöffnet. Diese steht im gleichen Verzeichnis wie diese Arbeitsmappe, in der sich die oben ange- 58 왘 ActiveSheet: das aktuell aktive Arbeitsblatt 왘 Worksheets(Index): Index ist die laufende Nummer des Tabellenblattes innerhalb der Worksheets-Auflistung, von 1 bis zur Nummer des letzten Elements, die der Anzahl der Elemente entspricht (Count). 왘 Worksheets("Name"): der Name des Tabellenblattes als Zeichenkette (in Anführungszeichen) Worksheets ("Name") Hinweis In den folgenden Beispielen für den Einsatz von Worksheets wird jeweils vorher diese Arbeitsmappe aktiviert. Dies dient der eindeutigen Zuordnung für den Fall, dass mehrere Arbeitsmappen geöffnet sind. 59 2 2.3 Grundlagen von Objekten und Ereignissen 2.3.1 Tabellenblatt erzeugen Neues Blatt Mit folgender Prozedur wird in dieser Arbeitsmappe ein neues Tabellenblatt erzeugt: Sub NeuesBlatt() ThisWorkbook.Activate MsgBox Worksheets.Count Worksheets.Add ActiveSheet.Name = "Neu" MsgBox Worksheets.Count End Sub Listing 2.11 Sub NeuesBlatt() in Mappe2.xlsm, Modul 2 Zur Erläuterung: Tabellenblätter bearbeiten Sub BlattKopieren() ThisWorkbook.Activate Worksheets("Tabelle1").Copy After:=Worksheets("Tabelle1") ActiveSheet.Name = "Tab1Kopie" End Sub 2 Listing 2.12 Sub BlattKopieren() in Mappe2.xlsm, Modul 2 Zur Erläuterung: 왘 Es wird die Methode Copy() des Objekts Worksheets aufgerufen. Dadurch wird ein Tabellenblatt kopiert. Es wird hinter einem Tabellenblatt in der gleichen Arbeitsmappe eingefügt, und es wird zum aktiven Tabellenblatt (siehe Abbildung 2.13). Beide Tabellenblätter werden über ihren Namen angesprochen. Copy() 왘 Zunächst wird zur Kontrolle die Anzahl der Tabellenblätter dieser Arbeitsmappe (der Wert der Eigenschaft Count des Objekts Worksheets) ermittelt und ausgegeben. Add() 왘 Es wird die Methode Add() des Objekts Worksheets aufgerufen. Dadurch wird ein neues Tabellenblatt erzeugt (siehe Abbildung 2.12). Das neue Tabellenblatt wird dann automatisch zum aktiven Tabellenblatt. 왘 Durch die Angabe von Parametern können Sie genau bestimmen, an welcher Stelle das neue Tabellenblatt eingefügt werden soll, siehe Abschnitt 2.3.2, »Tabellenblatt kopieren«. ActiveSheet 왘 ActiveSheet bezeichnet das aktuell aktive Tabellenblatt. Der Name eines Tabellenblattes kann ermittelt bzw. geändert werden. 왘 Es wird wiederum zur Kontrolle die Anzahl der Tabellenblätter ausgegeben. Sie hat sich erwartungsgemäß um 1 erhöht. Abbildung 2.13 Kopiertes Tabellenblatt Bei After handelt es sich um einen benannten Parameter. Solche Parameter können mithilfe des Operators := (Doppelpunkt und Gleichheitszeichen) angegeben werden. Statt After ist auch Before möglich. Dann wird das Tabellenblatt vor einem anderen Tabellenblatt in der gleichen Arbeitsmappe eingefügt. After, Before 왘 Wird gar kein Parameter angegeben, dann wird eine neue Arbeitsmappe erzeugt, die die Kopie enthält. 왘 Zum Abschluss wird noch der Name des Tabellenblattes geändert. Hinweis Abbildung 2.12 Neu erzeugtes Tabellenblatt Falls eine Methode mehrere Parameter hat, werden häufig benannte Parameter verwendet, siehe Abschnitt 5.3.5, »Benannte Parameter«. Diese Vorgehensweise bietet folgende Vorteile: 왘 Der Parameter kann eindeutig angesprochen werden. 2.3.2 Tabellenblatt kopieren Blatt kopieren 60 Mit folgender Prozedur wird ein Tabellenblatt dieser Arbeitsmappe kopiert: 왘 Nicht alle Parameter, die möglich sind, müssen genannt werden. 왘 Das Programm wird lesbarer. 61 2 2.3 Grundlagen von Objekten und Ereignissen Blatt verschieben 2.3.3 Tabellenblatt verschieben Zur Erläuterung: Mit folgender Prozedur wird ein Tabellenblatt dieser Arbeitsmappe verschoben. Die zugehörige Methode Move() arbeitet sehr ähnlich wie die Methode Copy(): 왘 Es wird die Methode Delete() des Objekts Worksheets zum Löschen eines Tabellenblattes aufgerufen. Seit Excel 2016 erscheint dabei vor dem Löschen keine Warnung mehr. Es könnten also versehentlich Daten gelöscht werden! Sub BlattVerschieben() ThisWorkbook.Activate Worksheets("Tab1Kopie").Move Before:=Worksheets("Tabelle1") End Sub Listing 2.13 Sub BlattVerschieben() in Mappe2.xlsm, Modul 2 Zur Erläuterung: Move() Tabellenblätter bearbeiten 왘 Es wird die Methode Move() des Objekts Worksheets zum Verschieben eines Tabellenblattes aufgerufen. Es wird hinter einem Tabellenblatt in der gleichen Arbeitsmappe eingefügt, und es wird zum aktiven Tabellenblatt (siehe Abbildung 2.14). Delete() 2 왘 Beide Tabellenblätter werden über ihren Namen angesprochen. 2.3.5 Tabellenblatt aktivieren Mit folgender Prozedur werden nacheinander zwei Tabellenblätter dieser Arbeitsmappe aktiviert: Blatt aktivieren Sub BlattAktivieren() ThisWorkbook.Activate Worksheets("Tabelle3").Activate MsgBox ActiveSheet.Name Worksheets("Tabelle1").Activate MsgBox ActiveSheet.Name End Sub Listing 2.15 Sub BlattAktivieren() in Mappe2.xlsm, Modul 2 Abbildung 2.14 Verschobenes Tabellenblatt After, Before Blatt löschen 2.3.4 Tabellenblatt löschen 왘 Es wird die Methode Activate() des Objekts Worksheets zum Aktivieren eines Tabellenblattes aufgerufen. Dies ist dann sinnvoll, wenn Sie sicherstellen möchten, anschließend in einem bestimmten Tabellenblatt weiterzuarbeiten. Aktionen in Zellen oder Bereichen beziehen sich anschließend auf dieses Tabellenblatt. Mit folgender Prozedur werden zwei Tabellenblätter dieser Arbeitsmappe gelöscht: 왘 Zur Kontrolle wird in der Prozedur der Name des jeweils aktiven Tabellenblattes ausgegeben. Statt mit Before hätten wir auch mit After oder ganz ohne Parameter arbeiten können, wie bei Copy(). Sub BlattLoeschen() ThisWorkbook.Activate Worksheets("Neu").Delete Worksheets("Tab1Kopie").Delete End Sub Listing 2.14 Sub BlattLoeschen() in Mappe2.xlsm, Modul 2 62 Zur Erläuterung: Activate() Stellen Sie vor Ausführung der Prozedur sicher, dass die genannten Tabellenblätter in der Mappe existieren. 2.3.6 Tabellenblatt formatieren Die Eigenschaft Cells eines Tabellenblattes bietet die Möglichkeit, alle Zellen eines Tabellenblattes zu formatieren. Es können natürlich auch nur einzelne Zellen oder nur Zellbereiche formatiert werden – dazu mehr ab Abschnitt 2.4.7, »Zahlenformate anwenden«. Cells 63 2 2.3 Grundlagen von Objekten und Ereignissen Alle Zellen Tabellenblätter bearbeiten Nachfolgend werden alle Zellen des Tabellenblattes Tabelle3 mit der Schriftart Arial und der Schriftgröße 10 formatiert. Zur Erläuterung: Sub BlattFormatieren() ThisWorkbook.Activate Worksheets("Tabelle3").Cells.Font.Name = "Arial" Worksheets("Tabelle3").Cells.Font.Size = 10 End Sub 왘 Das aktive Fenster (ActiveWindow) enthält nunmehr dieses Tabellenblatt. ActiveWindow 왘 Die Eigenschaft DisplayGridlines bestimmt den Zustand der Gitternetzlinien (ein/aus). DisplayGridlines 왘 Die Eigenschaft DisplayHeadings bestimmt den Zustand der Zeilen- und Spaltenüberschriften (ein/aus). In Abbildung 2.15 sehen Sie ein Tabellenblatt ohne Gitternetz und Überschriften. DisplayHeadings Listing 2.16 Sub BlattFormatieren() in Mappe2.xlsm, Modul 2 왘 Zunächst wird das gewünschte Tabellenblatt aktiviert. 2 Zur Erläuterung: 왘 Die Eigenschaft Cells bietet Zugriff auf alle Zellen eines Tabellenblattes. Font 왘 Die Eigenschaft Font einer Zelle bestimmt die Schriftarteigenschaften. 왘 Die Untereigenschaften Name und Size dienen der Festlegung des Namens der Schriftart und der Größe der Schrift. Weitere Formatierungsmöglichkeiten erläutert Abschnitt 2.4.9, »Schrifteigenschaften bestimmen«. 왘 An dieser Stelle lässt sich wiederum gut die Objekthierarchie erkennen. Es wird die Untereigenschaft Name der Untereigenschaft Font der Eigenschaft Cells des Tabellenblattes geändert. 2.3.7 Gitternetz, Zeilen- und Spaltenüberschriften Anzeigefenster gestalten Sowohl die feinen Gitternetzlinien der einzelnen Zellen als auch Zeilenund Spaltenüberschriften können ein- oder ausgeblendet werden. Dies sind eigentlich Eigenschaften des Anzeigefensters und nicht des Tabellenblattes. Sie sollen dennoch an dieser Stelle aufgeführt werden, da sie thematisch hierhergehören. Eine Prozedur zum Ausblenden der genannten Objekte: Sub BlattGitternetz() ThisWorkbook.Activate Worksheets("Tabelle3").Activate ActiveWindow.DisplayGridlines = True ActiveWindow.DisplayHeadings = True End Sub Listing 2.17 Sub BlattGitternetz() in Mappe2.xlsm, Modul 2 64 Abbildung 2.15 Tabellenblatt ohne Gitternetz und Überschriften Falls Sie die ausgeblendeten Elemente wieder einblenden wollen, müssen Sie in die Prozedur jeweils True statt False eintragen. 2.3.8 Seite einrichten Vorbereitungen für einen Ausdruck treffen Sie in der Seiteneinrichtung. Die Seiteneinrichtung für ein vorhandenes Tabellenblatt werden Sie vom Tabellenblatt aus ausführen. Für ein neues Tabellenblatt, das erst über eine VBA-Anwendung mit Daten gefüllt werden wird, können Sie dazu die Eigenschaft PageSetup nutzen. In der folgenden Prozedur wird aus den zahlreichen Möglichkeiten eine kleine Auswahl getroffen. PageSetup Hinweis Einige Anweisungen dieser Prozedur, aber auch noch vieler weiterer Prozeduren, sind sehr lang. Zeilen lassen sich mithilfe des Zeichens _ (Unterstrich) in mehrere übersichtliche Programmzeilen zerlegen, siehe Abschnitt 3.1.2, »Zeilen zerlegen«. Zeichen »_« (Unterstrich) 65 2 2.4 Grundlagen von Objekten und Ereignissen Sub BlattSeiteneinrichtung() ThisWorkbook.Activate ' Druckformat Worksheets("Tabelle3").PageSetup.Orientation = xlLandscape ' Gitternetz, Zeilen- und Spaltenüberschriften Worksheets("Tabelle3").PageSetup.PrintGridlines = True Worksheets("Tabelle3").PageSetup.PrintHeadings = True ' Größenänderung Worksheets("Tabelle3").PageSetup.Zoom = False Worksheets("Tabelle3").PageSetup.FitToPagesWide = 1 Worksheets("Tabelle3").PageSetup.FitToPagesTall = 99 ' Horizontale Zentrierung Worksheets("Tabelle3").PageSetup.CenterHorizontally = True ' Kopf- und Fußzeile Worksheets("Tabelle3").PageSetup.LeftHeader = _ "Das ist die Kopfzeile" Worksheets("Tabelle3").PageSetup.CenterFooter = _ "Seite &P von &N" End Sub Auf Zellen und Zellbereiche zugreifen 왘 Falls die Skalierung abhängig von der Seitenzahl ist, wird mit den Eigenschaften FitToPagesWide und FitToPagesTall jeweils eine Seitenanzahl festgelegt. Damit wird angegeben, auf wie vielen Seiten das Tabellenblatt in der Breite (Wide) und in der Höhe (Tall) ausgedruckt wird. FitToPages… 왘 Das Arbeitsblatt kann für den Ausdruck horizontal zentriert (CenterHorizontally = True), aber auch vertikal zentriert (CenterVertically = True) werden. Center… 왘 Den Text und die Anordnung von Kopf- und Fußzeile bestimmen die Eigenschaften …Header und …Footer. Es gibt jeweils die Präfixe Left…, Right… und Center… für die verschiedenen Bereiche. Im vorliegenden Beispiel wurden eine Kopfzeile links und eine Fußzeile zentriert angeordnet. Innerhalb des Textes, der als Zeichenkette zugewiesen wird, können bestimmte Variablen eingesetzt werden. Dabei gibt es u. a. die folgenden Möglichkeiten: Header, Footer 2 – Seitennummer: &P – Seitenanzahl: &N – Druckdatum: &D – Druckuhrzeit: &T – Pfad zum Verzeichnis der Datei: &Z – Dateiname: &F – Tabellenblattname: &A Listing 2.18 Sub BlattSeiteneinrichtung() in Mappe2.xlsm, Modul 2 Zur Erläuterung: Orientation 왘 Die Eigenschaft Orientation bestimmt das Druckformat. Es gibt die Möglichkeiten xlLandscape (Querformat) und xlPortrait (Hochformat). Druckeigenschaften 왘 Ähnlich wie beim Einrichten des Anzeigefensters wird mit den Eigenschaften PrintGridlines und PrintHeadings festgelegt, ob die Gitternetzlinien und die Zeilen- und Spaltenüberschriften ausgedruckt werden sollen oder nicht (True oder False). Zoom 왘 Mit der Eigenschaft Zoom bestimmen Sie den Prozentsatz der Vergrößerung oder Verkleinerung des Tabellenblattes für den Ausdruck. Falls dabei eine Zahl über 100 angegeben wird, wird das Tabellenblatt vergrößert gedruckt. Bei einer Zahl kleiner als 100 wird es verkleinert gedruckt. Der Wert False dient als Vorbereitung für eine Skalierung, die abhängig von der Seitenzahl ist. 66 2.4 Auf Zellen und Zellbereiche zugreifen Mithilfe von Range bzw. Cells haben Sie zahlreiche Möglichkeiten, auf einzelne Zellen oder ganze Zellbereiche eines Tabellenblattes zuzugreifen. Range wurde bereits in Abschnitt 1.3, »Mit Makros arbeiten«, in den Beispielen zur Makroprogrammierung vorgestellt. Die aktuell aktive Zelle zur Bearbeitung wird mit ActiveCell bezeichnet. Range, Cells Hinweis In den folgenden Beispielen für den Einsatz von Range und Cells wird jeweils ein bestimmtes Tabellenblatt in dieser Arbeitsmappe aktiviert. Dies dient der eindeutigen Zuordnung für den Fall, dass vorher eine andere Arbeitsmappe oder ein anderes Tabellenblatt aktiviert ist. 67 2 2.4 Grundlagen von Objekten und Ereignissen 2.4.1 Zellen über das Range-Objekt auswählen Zellbereich Mithilfe des Objekts Range können sowohl zusammenhängende als auch nicht zusammenhängende Zellbereiche ausgewählt werden. Dabei werden ein Buchstabe für die Spalte und eine Nummer für die Zeile angegeben. Einige Möglichkeiten sehen Sie in Tabelle 2.1. Range Beschreibung Range("A3").Select einzelne Zelle Range("A3:F7").Select zusammenhängender Zellbereich Range("A3, C5, E2").Select mehrere nicht zusammenhängende Zellen Range("A8, B2:C4, E2").Select mehrere nicht zusammenhängende Zellen bzw. Zellbereiche Tabelle 2.1 Range-Zellbereiche Ganze Zeile oder Spalte Bei den Zellbereichen kann es sich aber auch um ganze Spalten oder Zeilen handeln, wie Tabelle 2.2 zeigt. Range Beschreibung Range("A:A").Select ganze Spalte Range("C:E").Select mehrere zusammenhängende Spalten Range("B:D, F:F, H:I").Select mehrere nicht zusammenhängende Spalten Range("3:3").Select ganze Zeile Range("3:5").Select mehrere zusammenhängende Zeilen Range("3:5, 8:9, 12:12").Select mehrere nicht zusammenhängende Zeilen Range("A2:B4, 7:8, D:E, G2: H4").Select eine Mischung aus mehreren Möglichkeiten, siehe Abbildung 2.16 Tabelle 2.2 Range, ganze Spalten, ganze Zeilen Beachten Sie, dass auch die beiden letzten Ausdrücke mit Range jeweils in eine Zeile gehören. 68 Auf Zellen und Zellbereiche zugreifen Im letzten Beispiel (siehe Abbildung 2.16) wurden insgesamt vier nicht zusammenhängende Bereiche ausgewählt: zwei rechteckige Bereiche (A2: B4 und G2:H4), zwei ganze Spalten (D und E) und zwei ganze Zeilen (7 und 8). Die aktive Zelle (erkennbar am Rahmen) ist die erste ausgewählte Zelle (A2). Nicht zusammenhängender Bereich 2 Abbildung 2.16 Range("A2:B4, 7:8, D:E, G2:H4").Select Mit folgender Prozedur werden Zellbereiche eines ausgewählten Tabellenblattes selektiert. Anschließend wird jeweils die Adresse der aktiven Zelle ausgegeben: Sub ZellenMitRange() ThisWorkbook.Worksheets("Tabelle1").Activate Range("A2").Select MsgBox ActiveCell.Address Range("C4:G7").Select MsgBox ActiveCell.Address Range("A5, C3:G7").Select MsgBox ActiveCell.Address Range("C3:G7, A5").Select MsgBox ActiveCell.Address Range("C:D").Select MsgBox ActiveCell.Address End Sub Listing 2.19 Sub ZellenMitRange() in Mappe2.xlsm, Modul 3 Zur Erläuterung: 왘 Das Tabellenblatt Tabelle1 dieser Arbeitsmappe wird aktiviert. Aktionen in Zellen oder Bereichen beziehen sich anschließend auf dieses Tabellenblatt. 69 2 2.4 Grundlagen von Objekten und Ereignissen Select() 왘 Es wird die Methode Select() des Objekts Range zum Auswählen von Zellen aufgerufen. ActiveCell 왘 Eine der ausgewählten Zellen ist die aktive Zelle. Diese kann mit ActiveCell angesprochen werden. Falls mehrere Zellen ausgewählt wurden, ist die obere linke Zelle des ersten angegebenen Bereichs aktiv. Address 왘 Allgemein ist Address die Adresse eines Zellbereichs. Hier geht es nur um die Adresse der aktiven Zelle. Reihenfolge 왘 Nacheinander werden in diesem Beispiel ausgegeben: $A$2, $C$4, $A$5, $C$3 und $C$1. Beachten Sie, dass im dritten und vierten Schritt die gleichen Zellen ausgewählt sind, sich aber die aktive Zelle aufgrund der Reihenfolge unterscheidet. Auf Zellen und Zellbereiche zugreifen Zur Erläuterung: 왘 Die Zelle 1, 5 erhält mithilfe der Eigenschaft Value den Wert abc. Sie steht in der Zeile 1 und der Spalte 5, ist also die Zelle E1. 왘 In Verbindung mit dem Objekt Range können aber auch Zellbereiche ausgewählt werden. Hier ist dies der Bereich von Zelle 3, 5 (= E3) bis Zelle 4, 7 (= G4). 2 Range mit Cells 2.4.3 Zellinhalte verschieben oder kopieren Mit folgender Prozedur werden in einem ausgewählten Tabellenblatt: 왘 die Inhalte eines Zellbereichs verschoben 왘 die Inhalte eines anderen Zellbereichs kopiert 2.4.2 Zellen über das Cells-Objekt auswählen Eine Zelle Das Objekt Cells bietet nicht nur die Möglichkeit, alle Zellen eines Tabellenblattes zu erreichen, sondern auch einzelne Zellen oder Zellbereiche auszuwählen. Dabei werden eine Nummer für die Zeile und eine Nummer für die Spalte angegeben. Das Arbeiten mit dem Objekt Cells bietet gegenüber dem Arbeiten mit dem Objekt Range Vorteile bei der Programmierung. Sowohl die Zeilennummer als auch die Spaltennummer können dann mithilfe von Variablen gebildet werden. Mit folgender Prozedur werden Zellbereiche eines ausgewählten Tabellenblattes mit einem Wert versehen (siehe Abbildung 2.17): Sub ZellenMitCells() ThisWorkbook.Worksheets("Tabelle1").Activate Cells(1, 5).Value = "abc" Range(Cells(3, 5), Cells(4, 7)).Value = "xyz" End Sub Listing 2.20 Sub ZellenMitCells() in Mappe2.xlsm, Modul 3 Beides haben Sie bereits in Abschnitt 2.4.1, »Zellen über das Range-Objekt auswählen«, mit Makros durchgeführt. Die hier vorgestellten Methoden umfassen weniger Codezeilen, sind besser zu warten und schneller im Ablauf: Besserer Code Sub ZellinhalteVerschiebenKopieren() ThisWorkbook.Worksheets("Tabelle1").Activate Range("A1:A2").Cut Destination:=Range("C1") Range("A5:A6").Copy Destination:=Range("C5") End Sub Listing 2.21 Sub ZellinhalteVerschiebenKopieren() in Mappe2.xlsm, Modul 3 Zur Erläuterung: 왘 Es wird die Methode Cut() des Objekts Range zum Ausschneiden von Zellen aufgerufen: – Falls ein Ziel mit dem optionalen Parameter Destination angegeben ist, werden die Zellen dorthin verschoben. Cut() Destination – Falls kein Ziel angegeben ist, werden die Zellen in die Zwischenablage verschoben und können an anderer Stelle wieder eingefügt werden. 왘 Es wird die Methode Copy() des Objekts Range zum Kopieren von Zellen aufgerufen. Wie bei der Methode Cut() kann ein Ziel angegeben werden. Ansonsten liegt die Kopie in der Zwischenablage und kann an anderer Stelle wieder eingefügt werden. Abbildung 2.17 Mit dem Befehl »Cells« arbeiten 70 Copy() Den Tabelleninhalt vor Ablauf der Prozedur sehen Sie in Abbildung 2.18. 71 2 2.4 Grundlagen von Objekten und Ereignissen Auf Zellen und Zellbereiche zugreifen 왘 In beiden Fällen wird die Methode PasteSpecial() zum Einfügen spezieller Teile von Zellinhalten aufgerufen. Beim ersten Mal werden nur die Werte eingefügt, beim zweiten Mal nur die Formate. PasteSpecial() 2 Den Tabelleninhalt vor Ablauf der Prozedur sehen Sie in Abbildung 2.20. Abbildung 2.18 Originalinhalte Den Tabelleninhalt nach Ablauf der Prozedur sehen Sie in Abbildung 2.19. Abbildung 2.20 Originalinhalte und -formate Den Tabelleninhalt nach Ablauf der Prozedur sehen Sie in Abbildung 2.21. Abbildung 2.19 Inhalte nach dem Verschieben und Kopieren 2.4.4 Teile von Zellinhalten kopieren Zwischenablage In Abschnitt 2.4.3, »Zellinhalte verschieben oder kopieren«, wurde bereits darauf hingewiesen, dass Zellinhalte auch in die Zwischenablage kopiert werden können. Dies ist von Vorteil, falls Sie nur ausgewählte Teile des Zellinhalts kopieren möchten, z. B. nur die Werte oder nur die Formate. Dies zeigt das folgende Beispiel: Sub TeileKopieren() ThisWorkbook.Worksheets("Tabelle1").Activate Range("A1:A2").Copy Range("C1").PasteSpecial xlPasteValues Range("A5:A6").Copy Range("C5").PasteSpecial xlPasteFormats End Sub Listing 2.22 Sub TeileKopieren() in Mappe2.xlsm, Modul 3 Zur Erläuterung: 왘 Es wird zweimal die Methode Copy() zum Kopieren eines Bereichs in die Zwischenablage aufgerufen. 72 Abbildung 2.21 Inhalte nach dem Kopieren von Werten bzw. Formaten 2.4.5 Zellinhalt löschen Mit folgender Prozedur werden bestimmte Zellinhalte gelöscht: Löschen Sub ZellinhaltLoeschen() ThisWorkbook.Worksheets("Tabelle1").Activate Range("A1:A2").Clear Range("A3:A4").ClearContents Range("A5:A6").ClearFormats End Sub Listing 2.23 Sub ZellinhaltLoeschen() in Mappe2.xlsm, Modul 3 Zur Erläuterung: 왘 Die Methode Clear() des Objekts Range dient dem Löschen von Zellinhalten, inklusive Formatierung und Kommentaren. Clear() 73 2 2.4 Grundlagen von Objekten und Ereignissen ClearContents() 왘 Mithilfe der Methode ClearContents() werden nur die Inhalte gelöscht. Formate und Kommentare bleiben erhalten. ClearFormats() 왘 Die Methode ClearFormats() wird zum Löschen der Formate genutzt. Inhalte und Kommentare bleiben erhalten. Den Tabelleninhalt vor Ablauf der Prozedur sehen Sie in Abbildung 2.22. Auf Zellen und Zellbereiche zugreifen Range("A4").Value = "2016/03/31" Range("A5").Value = "2015/11/10" Range("A6").FormulaLocal = "=A4-A5" 2 ' Zahl Range("A7").Value = 0.125 End Sub Listing 2.24 Sub WerteFormeln() in Mappe2.xlsm, Modul 3 Abbildung 2.24 zeigt das Ergebnis. Abbildung 2.22 Originalinhalte und -formate Den Tabelleninhalt nach Ablauf der Prozedur sehen Sie in Abbildung 2.23. Abbildung 2.24 Werte und Formeln eintragen Zur Erläuterung: Abbildung 2.23 Inhalte nach dem Löschen von Werten und Formaten 2.4.6 Werte und Formeln eintragen Zellinhalte eintragen Mit der nachfolgenden Prozedur werden Zahlen, Datumsangaben, Prozentzahlen und Formeln in die betreffenden Zellen des Tabellenblattes Tabelle2 eingetragen. Stellen Sie sicher, dass es existiert. Sub WerteFormeln() ThisWorkbook.Worksheets("Tabelle2").Activate ' Zahl Range("A1").Value = 5.8 Range("A2").Value = 1629.9 Range("A3").FormulaLocal = "=SUMME(A1:A2)" ' Datum 74 왘 Mithilfe der bereits bekannten Eigenschaft Value wird den Zellen A1 und A2 jeweils ein Zahlenwert zugewiesen. Value 왘 Bei Zahlen mit Nachkommastellen ist ein Punkt statt eines Kommas einzutragen. Punkt statt Komma 왘 Die Formel =SUMME(A1:A2) wird als Wert der Eigenschaft FormulaLocal in der von Excel gewohnten Form (in Deutsch) eingetragen. In der Bearbeitungszeile ist erkennbar, dass der Inhalt der Zelle A3 nach wie vor eine Formel ist. Mehr zu den Formula-Eigenschaften sehen Sie in Abschnitt 8.1, »Formeln zuweisen und lesen«. FormulaLocal 왘 Bei Datumsangaben dürfen die Anführungsstriche nicht fehlen. Es empfiehlt sich, die amerikanische Schreibweise zu benutzen. Dann werden die Werte direkt als Datumsangaben erkannt und formatiert (führende Nullen). Datum 왘 Die Formel =A4-A5 dient der Berechnung der Tagesdifferenz zwischen den beiden Datumsangaben. 왘 Der Inhalt der Zelle A7 ist wiederum ein Zahlenwert. 75 2 2.4 Grundlagen von Objekten und Ereignissen Format angeben Auf Zellen und Zellbereiche zugreifen 2.4.7 Zahlenformate anwenden – € (Euro): Währungszeichen verwenden Mit folgender Prozedur werden die Formate für Zahlen, Datumsangaben und Prozentzahlen in Zellen festgelegt: – % (Prozent): Zahl mit 100 multiplizieren und mit einem Prozentzeichen darstellen Sub ZellformatZahlen() ThisWorkbook.Worksheets("Tabelle2").Activate 왘 Bei Datumsangaben werden im Beispiel die folgenden Zeichen verwendet: 2 Datumsformat – TTTT: Wochentagsname in Deutsch ausschreiben – TT: zwei Ziffern für den Tag im Monat anzeigen ' Zahl Range("A1:A3").NumberFormatLocal = "#.##0,00 €" ' Datum Range("A4:A5").NumberFormatLocal = "TTTT, ""den"" TT. MMMM JJ" Range("A6").NumberFormatLocal = "0 ""Tage""" ' Prozent Range("A7").NumberFormatLocal = "0,00 %" End Sub – MMMM: Monatsname in Deutsch ausschreiben – JJ: zwei Ziffern für das Jahr anzeigen 왘 Eine Besonderheit ist zu beachten: Falls Text (z. B. die Wörter den oder Tage) in das Format integriert wird, ist dieser bekanntlich in Excel in doppelten Anführungsstrichen zu notieren. So kann kein Konflikt mit den standardmäßigen Formatangaben auftreten. Da der Wert der Eigenschaft NumberFormatLocal schon in doppelten Anführungszeichen steht, muss dieser Formatierungstext in zweifachen doppelten Anführungsstrichen stehen. Text im Format Listing 2.25 Sub ZellformatZahlen() in Mappe2.xlsm, Modul 3 2.4.8 Zellen ausrichten Das Ergebnis sehen Sie in Abbildung 2.25. Mit folgender Prozedur werden Zellen auf verschiedene Art und Weise ausgerichtet: Ausrichten Sub ZellformatAusrichtung() ThisWorkbook.Worksheets("Tabelle2").Activate Range("C1").Value = "Hallo" Range("C1").HorizontalAlignment = xlCenter Range("C1").VerticalAlignment = xlTop Abbildung 2.25 Zahlenformate anwenden Zur Erläuterung: NumberFormatLocal 왘 Mithilfe der Eigenschaft NumberFormatLocal können Formate in der von Excel gewohnten Form (in Deutsch) eingetragen werden. Formatierungszeichen 왘 Bei Zahlen, Währungs- oder Prozentangaben werden im Beispiel die folgenden Zeichen verwendet: – #: Ziffer nur anzeigen, falls vorhanden – 0: Ziffer immer anzeigen – , (Komma): Nachkommastelle abtrennen – . (Punkt): Tausenderpunkt setzen 76 Range("C2").Value = "Das ist ein längerer Text" Range("C2").WrapText = True Range("C3").Value = "Hallo" Range("C3:C7").MergeCells = True Range("C3:C7").Orientation = xlVertical Range("C8").Value = "Hallo" Range("C8").Orientation = 45 End Sub Listing 2.26 Sub ZellformatAusrichtung() in Mappe2.xlsm, Modul 3 77 2 2.4 Grundlagen von Objekten und Ereignissen Das Ergebnis ist in Abbildung 2.26 dargestellt. Auf Zellen und Zellbereiche zugreifen 왘 Die einzelnen Zeichen eines Zellinhalts können mithilfe der Eigenschaft Orientation folgendermaßen geschrieben werden: Orientation 2 – übereinander mit dem Wert xlVertical – in einem schrägen Winkel mit einem Zahlenwert zwischen – 90 Grad und + 90 Grad. Der Normalwert ist 0 Grad 2.4.9 Schrifteigenschaften bestimmen Mit folgender Prozedur werden die Schrifteigenschaften von Zellen bestimmt: Abbildung 2.26 Zellen ausrichten Zur Erläuterung: …Alignment 왘 Text wird mithilfe der Eigenschaft HorizontalAlignment und VerticalAlignment ausgerichtet. Zulässige Konstanten sind z. B.: – für die horizontale Ausrichtung xlLeft (linksbündig), xlRight (rechtsbündig), xlCenter (zentriert) und xlJustify (Blocksatz) – für die vertikale Ausrichtung xlBottom (am unteren Rand), xlCenter (vertikal zentriert) und xlTop (am oberen Rand) – Mehr zum Thema Konstanten finden Sie in Abschnitt 3.2.4, »Konstanten und Enumerationen«. WrapText Sub ZellformatSchrift() ThisWorkbook.Worksheets("Tabelle2").Activate Range("C1").Font.Name = "Tahoma" Range("C1").Font.Bold = True Range("C1").Font.Italic = True Range("C1").Font.Underline = True Range("C1").Font.Size = 20 Range("C1").Font.Color = vbRed End Sub Listing 2.27 Sub ZellformatSchrift() in Mappe2.xlsm, Modul 3 Das Ergebnis sehen Sie in Abbildung 2.27. 왘 Die Eigenschaft WrapText bestimmt die Anordnung längerer Texte: – Falls WrapText den Wert True hat, wird der Text innerhalb der Zelle über mehrere Zeilen verteilt. – Falls WrapText den Wert False hat, wird der Text nur in einer Zeile geschrieben, die gegebenenfalls über den rechten Rand der Zelle hinausgeht. MergeCells Schrift 왘 Die Eigenschaft MergeCells bestimmt, ob Zellen miteinander verbunden werden können: Abbildung 2.27 Zellenschrift gestalten Zur Erläuterung: 왘 Die Eigenschaft Font steht für die Formatierung der Schriftart in der Zelle. Sie hat zahlreiche Untereigenschaften, z. B.: Font – Name für den Namen der Schriftart – Wenn MergeCells den Wert True hat, werden die Zellen des genannten Bereichs miteinander verbunden dargestellt. – Bold für das Format Fett (True oder False) – Wenn MergeCells den Wert False hat, werden die Zellen des genannten Bereichs einzeln dargestellt. – Underline für das Attribut Unterstrichen (True oder False) – Italic für das Format Kursiv (True oder False) – Size für die Größe der Schrift – Color für die Farbe der Schrift 78 79 2 2.4 Grundlagen von Objekten und Ereignissen Farbe 왘 Farben können auf verschiedene Art und Weise angegeben werden: – speziell für die Grundfarben mithilfe von Farbkonstanten, siehe Abschnitt 3.2.4, »Konstanten und Enumerationen« RGB() – allgemein mit der Funktion RGB(). Diese Funktion hat drei Parameter, die für Rot-, Grün- und Blauwerte der Farbe stehen, jeweils zwischen 0 und 255. Im vorliegenden Beispiel hätte also die folgende Anweisung dasselbe bewirkt: Range("C1").Font. Color = RGB(255, 0, 0). 2.4.10 Einzelne Zeichen formatieren Zeichenformatierung Auf Zellen und Zellbereiche zugreifen – Die erste Ziffer bestimmt die Stelle, an der die Teilzeichenfolge beginnt. Das erste Zeichen einer Zeichenfolge hat die Nummer 1. 왘 Im ersten Beispiel wird für zwei Zellen die Teilzeichenfolge hinter dem Zeichen x geliefert. Mithilfe der Untereigenschaft Superscript der FontEigenschaft des Textes wird dieses Zeichen hochgestellt. Superscript 왘 Im zweiten Beispiel werden für insgesamt drei Zellen jeweils die beiden Teilzeichenfolgen 38 und 39 geliefert. Mithilfe der Untereigenschaft Subscript der Font-Eigenschaft des Textes werden diese Zeichen tiefgestellt. Subscript Mit folgender Prozedur werden einzelne Zeichen innerhalb von mehreren Zeichenketten formatiert: 2.4.11 Zellbereiche einrahmen Sub EinzelneZeichen() ThisWorkbook.Worksheets("Tabelle2").Activate Mit folgender Prozedur werden verschiedene Zellbereiche ganz oder teilweise eingerahmt: Range("E2").Value = "x2" Range("E3").Value = "x3" Range("E2:E3").Characters(2, 1).Font.Superscript = True Range("E4:E6").Value = "a38 + a39" Range("E4:E6").Characters(2, 2).Font.Subscript = True Range("E4:E6").Characters(8, 2).Font.Subscript = True End Sub Listing 2.28 Sub EinzelneZeichen() in Mappe2.xlsm, Modul 3 Das Ergebnis sehen Sie in Abbildung 2.28. 2 – Die zweite Ziffer bestimmt die Länge der Teilzeichenfolge. Rahmen Sub ZellformatRahmen() ThisWorkbook.Worksheets("Tabelle2").Activate Range("E2:E3").Borders.LineStyle = xlDouble Range("E2:E3").Borders.Weight = xlThick Range("E2:E3").Borders.Color = vbGreen Range("E4:E6").Borders(xlEdgeLeft).Weight = xlThin Range("E4:E6").Borders(xlEdgeRight).Weight = xlThin Range("E4:E6").Borders(xlInsideHorizontal).Weight = xlHairline End Sub Listing 2.29 Sub ZellformatRahmen() in Mappe2.xlsm, Modul 3 Das Ergebnis sehen Sie in Abbildung 2.29. Abbildung 2.28 Einzelne Zeichen formatieren Zur Erläuterung: Characters 80 왘 Die Eigenschaft Characters liefert Teile einer Zeichenfolge. Diese können anschließend separat formatiert werden. Es müssen zwei Werte festgelegt werden: Abbildung 2.29 Zellbereiche einrahmen 81 2 2.4 Grundlagen von Objekten und Ereignissen Auf Zellen und Zellbereiche zugreifen Zur Erläuterung: Borders 왘 Die Eigenschaft Borders dient der Bearbeitung des Rahmens: 2 – Falls nach Borders keine weitere Angabe in Klammern folgt, werden die Eigenschaften für alle Rahmenlinien eingestellt, innen wie außen. Rahmenteile – Es können aber auch die Eigenschaften von ausgewählten Rahmenlinien bestimmt werden. Zulässige Konstanten sind z. B. xlEdgeLeft (linker Rahmen), xlEdgeRight (rechter Rahmen), xlEdgeTop (oberer Rahmen), xlEdgeBottom (unterer Rahmen), xlInsideHorizontal (innere horizontale Zwischenlinien) und xlInsideVertical (innere vertikale Zwischenlinien). – Falls also nur der Außenrahmen eines Zellbereichs eingestellt werden soll, werden die Konstanten genutzt, deren Name mit xlEdge beginnt. LineStyle 왘 Mit der Eigenschaft LineStyle wird die Linienart für den Rahmen festgelegt. Zulässige Konstanten sind z. B. xlContinuous (durchgehende Linie), xlDot (gepunktete Linie) und xlDouble (doppelte Linie). Weight 왘 Die Eigenschaft Weight bestimmt die Stärke des Rahmens. Zulässige Konstanten aus der Enumeration xlBorderWeight sind xlHairline (ganz feine Linie), xlThin (feine Linie), xlMedium (mittelstarke Linie) und xlThick (starke Linie). Mehr zu diesem Thema finden Sie in Abschnitt 3.2.4, »Konstanten und Enumerationen«. Color 왘 Durch die Eigenschaft Color wird die Rahmenfarbe bestimmt. Wie bei allen Farbangaben können Sie mit den Farbkonstanten oder mit der Funktion RGB() arbeiten. Abbildung 2.30 Hintergrundmuster von Zellen gestalten Zur Erläuterung: 왘 Die Eigenschaft Interior dient der Bearbeitung des Innenbereichs einer Zelle. Interior 왘 Sie hat verschiedene Untereigenschaften, u. a. Color für die Innenfarbe. 2.4.13 Zellen einfügen Mit folgender Prozedur werden Zellbereiche in einem ausgewählten Tabellenblatt eingefügt: Zellbereiche einfügen Sub ZelleEinfuegen() ThisWorkbook.Worksheets("Tabelle1").Activate Range("A2:A3").Insert Shift:=xlShiftDown Range("6:7").Insert End Sub Listing 2.31 Sub ZelleEinfuegen() in Mappe2.xlsm, Modul 3 2.4.12 Hintergrundmuster von Zellen gestalten Muster Mit folgender Prozedur wird das Hintergrundmuster der zwei Zellen E3 und E6 gestaltet: 왘 Es wird die Methode Insert() des Objekts Range zum Einfügen von Zellen aufgerufen. Insert() Sub ZellformatMuster() ThisWorkbook.Worksheets("Tabelle2").Activate Range("E2, E6").Interior.Color = vbYellow End Sub 왘 Mithilfe des optionalen Parameters Shift entscheiden Sie, was mit den Nachbarzellen passieren soll. Falls dieser Parameter weggelassen wird, entscheidet Excel anhand der Bereichsform. Shift Listing 2.30 Sub ZellformatMuster() in Mappe2.xlsm, Modul 3 Das Ergebnis sehen Sie in Abbildung 2.30. 82 Zur Erläuterung: 왘 Im ersten Fall werden die unteren Nachbarzellen nach unten verschoben. Dazu dient die Konstante xlShiftDown. Die Konstante xlShiftToRight hätte die rechten Nachbarzellen nach rechts verschoben. 왘 Im zweiten Fall sind ganze Zeilen ausgewählt. Es kann nur eine Verschiebung nach unten stattfinden. Daher macht die Angabe des Parameters Shift keinen Sinn. 83 2 2.4 Grundlagen von Objekten und Ereignissen Den Tabelleninhalt vor Ablauf der Prozedur sehen Sie in Abbildung 2.31. Auf Zellen und Zellbereiche zugreifen Range("A2:A3").Delete Shift:=xlShiftUp End Sub 2 Listing 2.32 Sub ZelleLoeschen() in Mappe2.xlsm, Modul 3 Zur Erläuterung: Abbildung 2.31 Originalstruktur der Tabelle Den Tabelleninhalt nach Ablauf der Prozedur sehen Sie in Abbildung 2.32. 왘 Es wird die Methode Delete() des Objekts Range zum Löschen von Zellen aufgerufen. Delete() 왘 Auch hier gibt es einen optionalen Parameter Shift, mit dem Sie entscheiden, was mit den Nachbarzellen passieren soll. Falls dieser Parameter weggelassen wird, entscheidet Excel wiederum aufgrund der Bereichsform. Shift 왘 Im ersten Fall sind ganze Zeilen ausgewählt. Es kann nur eine Verschiebung (aller Zeilen darunter) nach oben stattfinden. Daher ergibt die Angabe des Parameters Shift keinen Sinn. 왘 Im zweiten Fall werden die unteren Nachbarzellen nach oben verschoben. Dazu dient die Konstante xlShiftUp. Die Konstante xlShiftToLeft hätte die rechten Nachbarzellen nach links verschoben. Abbildung 2.32 Struktur nach dem Einfügen von Zellen und Zeilen Im vorliegenden Beispiel wird durch das Löschen von Zellen und Zeilen das vorherige Einfügen von Zellen und Zeilen rückgängig gemacht. Hinweis Hinweis EntireRow, EntireColumn Die Anweisung Range("A2:A3").EntireRow.Insert würde zwei ganze neue Zeilen vor den Zeilen des angegebenen Bereichs einfügen, hier also vor den Zeilen 2 und 3. Entsprechend würde durch die Anweisung Range("A2:A3").EntireColumn.Insert eine ganze neue Spalte vor der Spalte A eingefügt. Die Anweisung Range("A2:A3").EntireRow.Delete würde die gesamten Zeilen des angegebenen Bereichs löschen, hier also die Zeilen 2 und 3. Entsprechend würde durch die Anweisung Range("A2:A3").EntireColumn.Delete die gesamte Spalte A gelöscht. EntireRow, EntireColumn 2.4.15 Zeilenhöhe und Spaltenbreite 2.4.14 Zellen löschen Löschen Mit folgender Prozedur werden Zellbereiche eines ausgewählten Tabellenblattes gelöscht: Sub ZelleLoeschen() ThisWorkbook.Worksheets("Tabelle1").Activate Range("6:7").Delete 84 Mit folgender Prozedur werden die Höhe bestimmter Zeilen und die Breite bestimmter Spalten eingestellt: Höhe, Breite Sub HoeheBreite() ThisWorkbook.Worksheets("Tabelle2").Activate Range("1:2").RowHeight = 55 85 2 2.4 Grundlagen von Objekten und Ereignissen Range("B:B,D:D").ColumnWidth = 3 End Sub Listing 2.33 Sub HoeheBreite() in Mappe2.xlsm, Modul 3 Das Ergebnis ist in Abbildung 2.33 dargestellt. Auf Zellen und Zellbereiche zugreifen in eine Zelle geschrieben und anschließend wieder gelöscht wurde, ist die Zelle nach wie vor mit dem Datumsformat formatiert. Somit wird sie in den UsedRange einbezogen. Um hier sicherzugehen, könnten Sie (je nach Anwendung) vor dem Einfügen neuer Daten alle Zellen der Tabelle löschen (mit Cells.Delete). 2 Mit folgender Prozedur werden alle Zellen des benutzten Bereichs durch einen roten Rahmen hervorgehoben und gezählt: Sub BenutzterBereich() ThisWorkbook.Worksheets("Tabelle1").Activate ActiveSheet.UsedRange.Borders.Color = vbRed ActiveSheet.UsedRange.Interior.Color = vbYellow MsgBox "Anzahl: " & ActiveSheet.UsedRange.Count End Sub Abbildung 2.33 Zeilenhöhe und Spaltenbreite einstellen Zur Erläuterung: Listing 2.34 Sub BenutzterBereich() in Mappe2.xlsm, Modul 3 Nehmen wir an, es wurden die Zellen in Abbildung 2.34 benutzt. 왘 Als Zellbereich werden die Zeilen 1 und 2 sowie die Spalten B und D ausgewählt. RowHeight ColumnWidth 왘 Die Eigenschaft RowHeight verändert die Zeilenhöhe. 왘 Die Eigenschaft ColumnWidth bestimmt die Spaltenbreite. Hinweis AutoFit(), Columns/Rows Die optimale Einstellung der Zeilenhöhe und der Spaltenbreite lässt sich über die Methode AutoFit() des Unterobjekts Columns bzw. Rows erreichen. Ein Beispiel: Range("G:G").Columns.AutoFit stellt die Breite der Spalte G optimal ein. Range("1:2").Rows.AutoFit stellt die Höhe der Zeilen 1 und 2 optimal ein. Abbildung 2.34 Zellen mit Inhalt Der benutzte Bereich ergibt sich dann wie in Abbildung 2.35. 2.4.16 Benutzten Zellbereich erkennen 86 Benutzter Bereich Eine nützliche Eigenschaft eines Tabellenblattes ist der benutzte Bereich (UsedRange). Damit ist der kleinste zusammenhängende rechteckige Zellbereich gemeint, der alle nicht leeren Zellen umfasst. Nicht leere Zelle Das Problem ist nur: Nicht alle Inhalte einer Zelle können Sie sehen. Auch die Formatierung einer Zelle kann einen Inhalt darstellen. Falls ein Datum Abbildung 2.35 Benutzter Bereich 87 2 2.4 Grundlagen von Objekten und Ereignissen Zur Erläuterung: UsedRange Auf Zellen und Zellbereiche zugreifen Abbildung 2.36 zeigt das Ergebnis. 왘 Mit ActiveSheet.UsedRange werden alle benutzten Zellen des aktiven Tabellenblattes erfasst. 2 왘 Die Eigenschaft Count ergibt für ein Range-Objekt, wie bei Arbeitsmappen oder Tabellenblättern, eine Anzahl, hier 10. 2.4.17 Spezielle Zellen erkennen SpecialCells() Die Methode SpecialCells() ist in der Lage, spezielle Zellen zu erkennen. Anschließend können diese Zellen besonders bearbeitet bzw. hervorgehoben werden. Im folgenden Beispiel werden verschiedene Zellen farblich hervorgehoben bzw. gezählt: 왘 alle Zellen eines Bereichs, die eine Formel enthalten 왘 alle Zellen eines Bereichs, die leer sind 왘 die letzte Zelle eines Bereichs, in diesem Fall des benutzten Bereichs Abbildung 2.36 Spezielle Zellen Sub SpezielleZellen() ThisWorkbook.Worksheets("Tabelle2").Activate Zur Erläuterung: ' Zellen mit Formeln Range("A1:A8").SpecialCells(xlCellTypeFormulas). _ Interior.Color = vbYellow MsgBox "Formeln: " & Range("A1:A9"). _ SpecialCells(xlCellTypeFormulas).Count ' Leere Zellen Range("A1:A8").SpecialCells(xlCellTypeBlanks). _ Interior.Color = vbCyan MsgBox "Leer: " & Range("A1:A8").SpecialCells _ (xlCellTypeBlanks).Count ' Letzte benutzte Zelle ActiveSheet.UsedRange.SpecialCells _ (xlCellTypeLastCell).Interior.Color = vbGreen MsgBox "Letzte Zeile: " & ActiveSheet.UsedRange. _ SpecialCells(xlCellTypeLastCell).Row MsgBox "Letzte Spalte: " & ActiveSheet.UsedRange. _ SpecialCells(xlCellTypeLastCell).Column End Sub 왘 Mithilfe verschiedener Konstanten liefert die Methode SpecialCells() unterschiedliche Bereiche von Zellen zurück. SpecialCells() 왘 Der Typ xlCellTypeFormulas liefert Zellen, die Formeln enthalten. Hier sind dies die Zellen A3 und A6. Zelle mit Formel 왘 Der Typ xlCellTypeBlanks liefert Zellen, die leer sind, hier die Zelle A8. Leere Zelle 왘 Der Typ xlCellTypeLastCell liefert die letzte Zelle eines Bereichs. In diesem Fall ist es der benutzte Bereich (UsedRange). Es handelt sich um die Zelle E8. Letzte Zelle 왘 Mithilfe der Eigenschaften Row und Column können Sie sich die Zeilennummer und die Spaltennummer einer Zelle angeben lassen. In diesem Fall ist es die Zeile und die Spalte der letzten Zelle des benutzten Bereichs. Hinweis Bei einem Zellbereich wird mit den Eigenschaften Row bzw. Column die Nummer der Zeile bzw. der Spalte der aktiven Zelle ausgegeben. Ein Beispiel: Range("A3:B5").Row ergibt 3 und Range("A3:B5").Column ergibt 1. Listing 2.35 Sub SpezielleZellen() in Mappe2.xlsm, Modul 3 88 89 2 2.4 Grundlagen von Objekten und Ereignissen 2.4.18 Versatz mit Offset vornehmen Offset Mit dem Offset für einen Zellbereich bezeichnen Sie einen zweiten Zellbereich, der gegenüber dem Ursprungsbereich versetzt ist. Dieser Bereich ist wiederum ein Range-Objekt. Dieser Versatz kann sowohl in Bezug auf einzelne Zellen als auch in Bezug auf zusammenhängende oder nicht zusammenhängende Zellbereiche angewendet werden. Es folgt ein Beispiel mit Zellbereichen im Tabellenblatt Tabelle3. Stellen Sie vorher sicher, dass es existiert. Auf Zellen und Zellbereiche zugreifen 왘 Ein Offset kann aber auch negativ sein. Dann handelt es sich um Zeilen oberhalb oder um Spalten links vom Ursprungsbereich. Negativer Offset 2 왘 Die drei Offset-Angaben für den ersten Bereich ergeben: – Zelle 4, 3 + Offset 0, 2 = Zelle 4, 5 = Zelle E4 – Zelle 4, 3 + Offset 3, 1 = Zelle 1, 4 = Zelle D1 – Zelle 4, 3 + Offset 2, 1 = Zelle 2, 2 = Zelle B2 Das Ergebnis für den ersten Bereich sehen Sie in Abbildung 2.37. Sub ZellOffset() ThisWorkbook.Worksheets("Tabelle3").Activate ' Offset Cells(4, Cells(4, Cells(4, Cells(4, berechnen 3).Value = "Ber 1" 3).Offset(0, 2).Value = "Off(0,2)" 3).Offset(-3, 1).Value = "Off(-3,1)" 3).Offset(-2, –1).Value = "Off(-2,-1)" Abbildung 2.37 Offset berechnen Den Offset eines Bereichs sehen Sie in Abbildung 2.38. ' Offset eines Bereichs Range("C6:D8,E9").Value = "Ber 2" Range("C6:D8,E9").Offset(4, 0).Value = "Off(4,0)" ' Offset-relative Zellen Cells(4, 3).Offset(0, 2).Range("A2").Value Cells(4, 3).Offset(0, 2).Range("A3").Value Cells(4, 3).Offset(0, 2).Range("B1").Value Cells(4, 3).Offset(0, 2).Range("B2").Value Cells(4, 3).Offset(0, 2).Range("B3").Value End Sub = = = = = "A2" "A3" "B1" "B2" "B3" Listing 2.36 Sub ZellOffset() in Mappe2.xlsm, Modul 3 Offset berechnen: 왘 Ausgangszelle ist die Zelle 4, 3 oder, anders bezeichnet, C4. Zeile, Spalte 왘 Bei einem Offset wird zuerst der Versatz für die Zeile, dann für die Spalte angegeben. 왘 Falls der Ursprungsbereich mit Cells angegeben ist, können Sie den versetzten Bereich leicht ermitteln, indem Sie die Zahlen für die Zeile und die Spalte jeweils addieren. 90 Abbildung 2.38 Offset eines Bereichs 왘 Die Offset-Angabe für den nicht zusammenhängenden Zellbereich ergibt einen gleichartigen Bereich, der um vier Zeilen – Offset(4, 0) – nach unten verschoben ist. Offset-relative Zellen: 왘 Die erste Zelle eines Offsets, egal ob einzelne Zelle oder Zellbereich, wird relativ mit A1 bezeichnet. So können Sie jede Zelle im Offset eindeutig erreichen. Offset-relative Bezeichnung 91 2 2.4 Grundlagen von Objekten und Ereignissen Auf Zellen und Zellbereiche zugreifen 왘 Im Beispiel sind die Zellen A2, A3, B1, B2 und B3 des Offsets besonders hervorgehoben. 2 Die Offset-relativen Zellen sehen Sie in Abbildung 2.39. Abbildung 2.41 Sortierung nach Nummer Zur Erläuterung: 왘 Es wird der angegebene Bereich (A1:C4) sortiert. Abbildung 2.39 Offset-relative Zellen 2.4.19 Zellbereich sortieren Sortieren Die Methode Sort() des Range-Objekts bietet zahlreiche Möglichkeiten, Zellbereiche zu sortieren. Ausgangspunkt soll die Tabelle im Tabellenblatt Tabelle4 sein, die Sie in Abbildung 2.40 sehen. Abbildung 2.40 Tabelle, die sortiert werden soll Diese Tabelle soll auf zwei Arten sortiert werden: 왘 nach Nummer 왘 nach Nachname und Vorname Die oberste Zeile soll als Überschrift erkannt werden, so dass sie nicht einsortiert wird. 왘 Die Methode Sort() hat zahlreiche Parameter. Daher werden die Parameter beim Aufruf am besten einzeln benannt. Sort() 왘 Der Parameter Key1 gibt den Bereich an, in dem der Sortierschlüssel steht. Hier ist dies die dritte Spalte mit der Nummer, also C1:C4. Key1 왘 Der Parameter Order1 bestimmt darüber, ob aufsteigend (xlAscending) oder absteigend (xlDescending) sortiert wird. Da aufsteigende Sortierung der Standard ist, muss der Parameter nicht angegeben werden. Order1 왘 Über den Parameter Header legen Sie fest, ob die oberste Zeile des Bereichs als Überschrift erkannt werden soll. Der Standard ist xlNo. Daher wird hier xlYes angegeben. Falls der Wert xlGuess angegeben wird, entscheidet Excel, ob eine Überschrift vorhanden ist, und reagiert entsprechend. Header Es folgt die Prozedur für die Sortierung nach Nachname und Vorname: Sub SortierenName() ThisWorkbook.Worksheets("Tabelle4").Activate Range("A1:C4").Sort Key1:=Range("A1:A4"), _ Key2:=Range("B1:B4"), Header:=xlYes End Sub Listing 2.38 Sub SortierenName() in Mappe2.xlsm, Modul 4 Zunächst die Prozedur für die Sortierung nach Nummer: Sub SortierenNummer() ThisWorkbook.Worksheets("Tabelle4").Activate Range("A1:C4").Sort Key1:=Range("C1:C4"), Header:=xlYes End Sub Abbildung 2.42 zeigt das Ergebnis. Listing 2.37 Sub SortierenNummer() in Mappe2.xlsm, Modul 4 Das Ergebnis sehen Sie in Abbildung 2.41. 92 Abbildung 2.42 Nach Nachname und Vorname sortieren 93 2 Key2 Zur Erläuterung: 왘 Der Parameter Key2 gibt den Bereich an, in dem der zweite Sortierschlüssel steht. Es wird also zunächst nach der ersten Spalte mit den Nachnamen sortiert und bei gleichem Nachnamen nach der zweiten Spalte mit den Vornamen. 왘 Zunächst werden mithilfe der Methode Clear() eventuell vorhandene alte Sortiereinstellungen aus der Auflistung SortFields der Sortierschlüssel gelöscht. SortFields 왘 Die Methode Add() dient dem Hinzufügen der Bereiche, in denen die Sortierschlüssel stehen, zu der Auflistung SortFields. Add() Mehr als drei Sortierschlüssel Mehr Sortierschlüssel Ereignisprozeduren schreiben Zur Erläuterung: 왘 Es können bis zu drei Sortierschlüssel (Key1 bis Key3) angegeben werden. Eine auf- bzw. absteigende Sortierung wird über die Parameter Order1 bis Order3 bestimmt. 2 왘 Im vorliegenden Beispiel wird zunächst nach den Einträgen im Bereich A1 bis A6 sortiert. Falls es Daten gibt, die in diesem Bereich übereinstimmen, werden diese Daten nach den Einträgen im Bereich B1 bis B6 sortiert usw. Falls Sie mehr als drei Sortierschlüssel benötigen, dann können Sie das Objekt Sort des Tabellenblattes verwenden. Im nachfolgenden Beispiel im Tabellenblatt Tabelle5 werden insgesamt fünf Sortierschlüssel eingesetzt. Diese Möglichkeit gibt es erst seit Excel 2007. Der gewünschte Bereich wird zunächst nach dem ersten Schlüssel sortiert. Falls dabei gleiche Einträge vorliegen, wird nach dem zweiten Schlüssel sortiert usw. 왘 Mithilfe der Methode SetRange() wird der Bereich festgelegt, der sortiert werden soll. Sort() 왘 Die Methode Apply() dient der Ausführung der Sortierung. Apply() Sub SortierenVieleSchlüssel() ThisWorkbook.Worksheets("Tabelle5").Activate Ereignisse sagen etwas darüber aus, was gerade mit einem Objekt passiert. Es können Ereignisse bezüglich Arbeitsmappen, Tabellenblättern oder Zellbereichen stattfinden. Diese können mit VBA-Code verbunden werden, so dass automatisch weitere Aktionen folgen. Ereignis passiert Der VBA-Code von Ereignissen muss in den vorhandenen Klassenmodulen eingetragen werden. Nach Erzeugen einer neuen Arbeitsmappe gibt es bereits die Klassenmodule DieseArbeitsmappe und Tabelle1. In Programmversionen vor Excel 2013 werden neue Arbeitsmappen mit drei Tabellenblättern erzeugt. Daher gibt es hier auch die Klassenmodule Tabelle2 und Tabelle3. Ein Doppelklick auf eines der Klassenmodule im Projekt-Explorer führt dazu, dass das betreffende Codefenster angezeigt wird. Klassenmodul Oberhalb des Codefensters wählen Sie in der linken Liste das Objekt (Workbook oder Worksheet) und anschließend in der rechten Liste das Ereignis aus. Es wird ein leerer Prozedurrahmen angezeigt, in den die Ereignisprozedur geschrieben werden kann. Ereignis auswählen ' Alte Sortiereinstellungen löschen ActiveSheet.Sort.SortFields.Clear ' Insgesamt fünf Sortierschlüssel einstellen ActiveSheet.Sort.SortFields.Add Range("A1:A6") ActiveSheet.Sort.SortFields.Add Range("B1:B6") ActiveSheet.Sort.SortFields.Add Range("C1:C6") ActiveSheet.Sort.SortFields.Add Range("D1:D6") ActiveSheet.Sort.SortFields.Add Range("E1:E6") ' Bereich, der sortiert werden soll ActiveSheet.Sort.SetRange Range("A1:E6") ' Sortierung anwenden = durchführen ActiveSheet.Sort.Apply End Sub Listing 2.39 Sub SortierenVieleSchlüssel() in Mappe2.xlsm, Modul 4 94 2.5 Grundlagen von Objekten und Ereignissen 2.5 Ereignisprozeduren schreiben Noch umfangreicher sind die Möglichkeiten der Ereignisprogrammierung bei eigenen Dialogfeldern. Diese werden in Kapitel 10, »Dialogfelder«, beschrieben. 95 2 2.5 Grundlagen von Objekten und Ereignissen 2.5.1 Arbeitsmappe wird geöffnet Mappe öffnen Mit folgender Prozedur wird beim Öffnen der Arbeitsmappe gleichzeitig eine zweite Arbeitsmappe geöffnet: Private Sub Workbook_Open() MsgBox ActiveWorkbook.Name Workbooks.Open "C:\Temp\Mappe1.xlsm" End Sub Listing 2.40 Sub Workbook_Open() in Mappe2.xlsm, Klassenmodul »DieseArbeitsmappe« Zur Erläuterung: Workbook_Open() 왘 Es wird die Ereignisprozedur Workbook_Open() durchlaufen. 왘 Nach einer Kontrollausgabe wird eine zweite Arbeitsmappe geöffnet. Testen Sie die Prozedur, indem Sie Excel vollständig schließen und anschließend die Arbeitsmappe Mappe2.xlsm öffnen, die die oben angegebene Prozedur enthält. Hinweis In den Versionen vor Excel 2007 muss die Dateibezeichnung in der Prozedur wie folgt lauten: Mappe1.xls. Ereignisprozeduren schreiben möchte. Diese Prozedur umgeht das, weil das Ereignis BeforeClose vor der Nachfrage auftritt. 2 왘 Innerhalb der Prozedur wird die Arbeitsmappe mithilfe der Methode Save() gespeichert. Testen Sie die Prozedur, indem Sie eine Änderung vornehmen und die Arbeitsmappe schließen. 2.5.3 Tabellenblatt wird aktiviert Mit folgender Prozedur in einem Klassenmodul wird nach dem Aktivieren des betreffenden Tabellenblattes (vom Benutzer oder durch VBA-Code) eine Zelle ausgewählt: Blatt aktivieren Private Sub Worksheet_Activate() MsgBox ActiveSheet.Name Range("C5").Select End Sub Listing 2.42 Sub Worksheet_Activate() in Mappe2.xlsm, Klassenmodul «Tabelle1« Zur Erläuterung: 왘 Es wird die Ereignisprozedur Worksheet_Activate() zu einem Tabellenblatt durchlaufen. Worksheet_ Activate() 왘 Nach einer Kontrollausgabe wird eine Zelle ausgewählt. 2.5.2 Arbeitsmappe wird geschlossen Mappe schließen Mit folgender Prozedur im Klassenmodul DieseArbeitsmappe wird eine Arbeitsmappe vor dem Schließen ohne weitere Nachfrage automatisch gespeichert: Private Sub Workbook_BeforeClose(Cancel As Boolean) ThisWorkbook.Save End Sub Listing 2.41 Sub Workbook_BeforeClose() in Mappe2.xlsm, Klassenmodul »DieseArbeitsmappe« 96 2.5.4 Zellbereich wird ausgewählt Mit folgender Prozedur in einem Klassenmodul wird nach der Auswahl eines Zellbereichs in der betreffenden Tabelle die Adresse dieses Zellbereichs ausgegeben: 왘 Es wird die Ereignisprozedur Workbook_BeforeClose() durchlaufen. Private Sub Worksheet_SelectionChange(ByVal Target As Range) MsgBox Target.Address End Sub 왘 Verhalten ohne diese Prozedur: Falls der Benutzer die Arbeitsmappe ändert und schließt, wird er gefragt, ob er die Arbeitsmappe speichern Listing 2.43 Sub Worksheet_SelectionChange() in Mappe2.xlsm, Klassenmodul »Tabelle1« Zur Erläuterung: Workbook_ BeforeClose() Testen Sie die Prozedur, indem Sie zwischen den verschiedenen Tabellenblättern der Arbeitsmappe hin- und herwechseln. Das Ereignis tritt nur ein, falls die Tabelle, in deren Codefenster dieser VBA-Code steht, nicht bereits das aktivierte Tabellenblatt ist. Zelle wechselt 97 2 2.5 Grundlagen von Objekten und Ereignissen Zur Erläuterung: SelectionChange() 왘 Es wird die Ereignisprozedur Worksheet_SelectionChange() zu einem Tabellenblatt durchlaufen. Target 왘 Die Prozedur liefert den ausgewählten Zellbereich als Range über die Objektvariable Target. Weitere Einzelheiten zu Objektvariablen lesen Sie in Abschnitt 6.4, »Mit Objektvariablen arbeiten«. 왘 Für den ausgewählten Zellbereich wird die Eigenschaft Address ausgegeben. Dabei handelt es sich um die absolute Bezeichnung der Zelladresse. Testen Sie die Prozedur, indem Sie verschiedene zusammenhängende bzw. nicht zusammenhängende Zellbereiche (mithilfe der Taste (Strg)) auswählen. Ereignisprozeduren schreiben Logische Variablen werden in Abschnitt 3.2.3, »Datentypen«, noch genauer erläutert. 2 2.5.6 Tabellenblatt wird neu berechnet Mit folgender Prozedur in einem Klassenmodul wird eine Spaltenbreite optimal eingestellt, falls im Tabellenblatt an irgendeiner Stelle eine Neuberechnung stattfand: Neuberechnung Private Sub Worksheet_Calculate() Range("G:G").Columns.AutoFit End Sub Listing 2.45 Sub Worksheet_Calculate() in Mappe2.xlsm, Klassenmodul «Tabelle1« 2.5.5 Zelle wird doppelt angeklickt Doppelklick Mit folgender Prozedur in einem Klassenmodul wird bei einem Doppelklick auf eine Zelle die betreffende Zelle formatiert: Private Sub Worksheet_BeforeDoubleClick _ (ByVal Target As Range, Cancel As Boolean) Target.Interior.Color = vbGreen Target.Borders.LineStyle = xlContinuous Target.Borders.Weight = xlThick Cancel = True End Sub Zur Erläuterung: 왘 Es wird die Ereignisprozedur Worksheet_Calculate() zu einem Tabellenblatt durchlaufen. Dieses Ereignis tritt ein, falls z. B. eine Zelle einen neuen Wert erhalten hat, die in der Berechnungsformel für den Wert einer anderen Zelle vorkommt. Worksheet_ Calculate() 왘 Beispiel: In Zelle G3 steht die Formel =G1+G2. Sobald sich G1 oder G2 ändert, tritt das Ereignis Calculate ein. 왘 Die Spaltenbreite wird in diesem Fall optimal auf die neuen Werte eingestellt. Listing 2.44 Sub Worksheet_BeforeDoubleClick() in Mappe2.xlsm, Klassenmodul «Tabelle1« Zur Erläuterung: BeforeDoubleClick() 왘 Die Ereignisprozedur Worksheet_BeforeDoubleClick() zu einem Tabellenblatt wird durchlaufen. Mit Target wird die Zelle bezeichnet, auf der der Mauszeiger beim Doppelklick steht. 왘 Das Hintergrundmuster und der Rahmen der Zelle werden eingestellt. Cancel 98 왘 Über die logische Variable Cancel können Sie bestimmen, ob das eigentliche Ereignis, hier der Doppelklick, stattfinden soll. Mit Cancel = True wird die weitere Verarbeitung abgebrochen. Es findet nur die Formatierung statt. Mit Cancel = False oder einfach ganz ohne diese Anweisung wird fortgefahren, also der Cursor zur Bearbeitung in die Zelle gesetzt. 99