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

Documents pareils