Dieses Dokument enthält Auszüge aus einer Studienarbeit zum Thema "Excel-Programmierung mit VBA". An einigen Stellen im Text wird auf Kapitelnummern verwiesen, die leider der Konvertierung ins HTML-Format zum Opfer gefallen sind. Ich bitte, diesen Umstand zu entschuldigen und hoffe, dass Ihnen der Text, auch trotz einiger kürzungsbedingter Ungereimtheiten, helfen kann, wenn Sie sich in die VBA-Programmierung einarbeiten wollen.




Grundelemente der Programmiersprache Visual Basic

Funktionen und Prozeduren

Operatoren

Variablen, Konstanten und Felder

Objekte, Eigenschaften und Methoden

Schleifen und Verzweigungen

Vordefinierte Funktionen

Objekte und Programmiertechniken

Zugriff auf Zellen

Zugriff auf Arbeitsmappen, Fenster und Arbeitsblätter

Spezielle Objekte, Eigenschaften und Methoden


Grundelemente der Programmiersprache Visual Basic

In diesem Kapitel wird der Sprachumfang der in Excel 97 enthaltenen Programmier-sprache Visual Basic for Applications (VBA) beschrieben. Es soll dabei nur auf die wichtigsten Schlüsselwörter und Anweisungen eingegangen werden. Weiterführende Elemente von VBA, die hier keine Erwähnung finden oder nur kurz angerissen werden, sind häufig schon in der Online-Hilfe der Excel-IDE enthalten; fehlen gesuchte Begriffe oder Sprachkonstrukte auch dort, soll hiermit auf die entsprechende Fachliteratur verwiesen werden.

...

Zuerst jedoch muß auf einige grundsätzlichen Eigenheiten der Sprache VBA hingewiesen werden:

VBA ist nicht case sensitive, d.h., der Programmierer braucht nicht auf die Groß- oder Kleinschreibung zu achten (außer bei, hier nicht behandelten, API-Befehlen).

Jede Anweisung muß komplett in einer Zeile stehen. Soll über mehrere Zeilen Codiert werden, dann ist als Verbindungszeichen zwischen zwei Zeilen ein Leerzeichen, gefolgt von einem Unterstrich (" _") zu verwenden.

Eine Zeile im VBA-Code braucht keine Zeilenende-Markierung, anders als in C/C++, wo jede Zeile durch ein Semikolon abgeschlossen wird.

 

Funktionen und Prozeduren

Ausführbare Programmanweisungen werden in VB innerhalb von Funktionen und Prozeduren codiert. Beiden ist gemein, daß ihnen Parameter übergeben werden können. Möglich ist die Weitergabe von keinem, einem oder mehreren Parametern, jeweils getrennt durch Kommata.

Während aber die Funktion (Schlüsselwort Function) selbst einen Parameter zurück liefert, ist die (Unter-)Prozedur (Sub) nicht zur Rückgabe von Werten in der Lage.

 

Prozeduren

(Unter-)Prozeduren entsprechen den im C/C++-Sprachumfang enthaltenen Funktionen vom Typ void. Sie werden eingeleitet durch das Schlüsselwort Sub, gefolgt vom Prozedur-namen und den Parametern. Abschließend wird End Sub angefügt (erledigt VBA eigen-ständig, sobald die einleitende Zeile geschrieben wurde):

Sub Prozedurname (Parameter)

‘Code

End Sub

 

Der Parameter muß, wenn eine Spezifizierung des Datentyps der übergebenen Werte erwünscht ist (es kann auch die Default-Einstellung von VBA verwendet werden, dann ist keine weitere Angabe erforderlich; siehe Abschnitt 5.3.3), mit der Angabe des Typs versehen werden:

Sub Prozedurname (Parameter1 As Datentyp1, Parameter2 As Datentyp2[,.])

Zu den in VBA verwendbaren Datentypen siehe Abschnitt 5.3.3

 

Der Aufruf einer Prozedur im Programmcode erfolgt im einfachsten Falle durch:

Prozedurname Parameter1 [,Parameter2,...]

 

Da diese Aneinanderreihung von Prozedur- und Parameternamen eher verwirrend wirken kann, empfiehlt es sich, die Parameter in Klammern zu schreiben. Dann wird allerdings das zusätzliche Schlüsselwort Call nötig. Fehlt es, äußert VBA schon bei der Code-Erstellung eine Fehlermeldung:

Call Prozedur(Parameter)

 

Funktionen

Funktionen entsprechen dem Unterprogramm-Typ function in C/C++. Wie bereits einleitend erwähnt, geben Funktionen an die aufrufenden Programmteile Werte zurück. Der Datentyp des Rückgabeparameters wird, ebenso wie die Typen der zu übergebenden Parameter (siehe Abschnitt über Prozeduren) in der Kopfzeile des Unterprogramms angegeben:

Function Funktionsname(Parameter As Datentyp1) As Datentyp2

‘Anweisungen

End Function

Damit der Wert der Funktion, sprich der Inhalt des Rückgabeparameters, an das aufrufende Unterprogramm zurückgegeben werden kann, muß dieser Wert (welcher Ergebnis einer Berechnung oder eines Vergleichs sein kann) innerhalb der Funktion dem Funktionsnamen zugewiesen werden:

Funktionsname = Wert

Das Gleichheitszeichen dient als Zuweisungsoperator. Zu Operatoren siehe auch Abschnitt 5.3.2.

 

Aufgerufen wird eine Funktion durch eine Zuweisung:

Wert = Funktionsname(Parameter)

 

Unterprogramme vorzeitig verlassen

In manchen Situationen kann es nötig werden, daß Unterprogramme vorzeitig beendet werden, ohne den Programmcode vollständig abzuarbeiten. Dazu kann der Befehl Exit verwendet werden, der zusammen mit der jeweiligen Bezeichnung des Unterprogramms (Sub oder Function) verwendet wird:

Sub Prozedur1()

‘Anweisungen

Exit Sub ‘bei Funktionen: Exit Function

‘Anweisungen

End Sub

 

ByVal, ByRef

Übergabeparameter können einem aufgerufenen Unterprogramm (Prozedur/Funktion) auf zwei Arten vom aufrufenden Programmteil zur Verfügung gestellt werden: Als Kopie des Inhaltes des Parameters (ByVal), oder durch Übergabe des "Originals", d.h. durch Weitergabe der Adresse des Parameters (ByRef).

Im ersten der beiden Fälle kann das aufgerufene Unterprogramm jegliche Veränderungen am Parameter durchführen, ohne daß sich dieses auf das aufrufende Programm auswirkt.

Sub Prozedur1(ByVal Parameter1)

Im zweiten Fall bewirkt eine Veränderung des Inhalts eines Parameters im aufgerufenen Unterprogramm die gleiche Auswirkung auch auf den aufrufenden Programmteil.

Function Funk1(ByRef Parameter1) As Datentyp

Der Aufruf der Prozedur mit dem Parameter ByRef ist die Standardeinstellung in VBA. Ist keines der beiden Schlüsselwörter angegeben, wird immer das Original des Parameters weitergegeben.

Weiterhin ist eine optionale Übergabe von Parametern in VBA möglich. Dazu siehe Fachliteratur.

 

Ereignisprozeduren

Einer besonderen Art von Unterprogrammen gehören die sog. Ereignisprozeduren an. Sie werden ausgelöst (aufgerufen), wenn ein Ereignis wie der Mausklick auf eine Schaltfläche oder das Drücken einer Taste der Tastatur bei dem aktiven Steuerelement auftritt. Ereignisprozeduren sind immer mit Objekten (Steuerelemente) verknüpft; sie sind Teil der Objektklassen, ihre Ausführung wird vom Betriebssystem gesteuert. Erst mit den Ereignisprozeduren ist eine Reaktion von Programmen auf Aktionen des Anwenders möglich. Ereignisprozeduren werden wie Sub-Prozeduren programmiert. Zu erkennen sind sie daran, daß hinter den Namen des Objektes auf einen Unterstrich folgend ein Ereignis (Click, DblClick, MouseDown, KeyPress, etc.) genannt ist,

Zum Beispiel kann beim Mausklick auf die Schaltfläche Button1 die folgende Prozedur ausgenutzt und mit Code belegt werden:

Sub Button1_Click()

Weitere Ereignisprozeduren siehe Online-Hilfe der Excel-IDE.

 

 

Gültigkeitsbereiche von Unterprogrammen

In der bereits vorgestellten Weise definierte Unterprogramme sind nur in dem Bereich gültig, in dem sie codiert wurden. Eine Prozedur, die in einem Modul bzw. im Codebereich eines Formulars erstellt wurde, kann auch nur innerhalb dieses Bereiches aufgerufen werden. Sie ist automatisch vom Typ Private.

Das Schlüsselwort kann auch zusätzlich vor die Unterprogrammart (Sub oder Function) geschrieben werden. VBA erledigt das in vielen Fällen selbst (z.B. bei Erzeugung einer Ereignisprozedur durch Doppelklick auf eine Schaltfläche eines Formulars während der Entwurfsphase, siehe Abschnitt 5.1, IDE):

Private Sub Prozedurname()

Ereignisprozeduren sind immer Private.

 

Wenn die geschriebene Funktion/Prozedur auch von anderen Programmteilen, z.B. aus einem anderen Formular heraus, aufgerufen werden soll, dann muß sie zwingend innerhalb eines Moduls mit dem Schlüsselwort Public erstellt werden (siehe auch: Gültigkeitbereich von Variablen, Abschnitt 5.3.3):

Public Function Funktionsname() As Datentyp

 

 

Operatoren

Mit Hilfe von Operatoren lassen sich, wie auch in anderen Programmiersprachen üblich, Ausdrücke formulieren. Man unterscheidet zwischen Rechenoperatoren, logischen Operatoren und Vergleichsoperatoren, siehe Tabellen der nachfolgenden Abschnitte.

Zur Wertigkeit einzelner Operatoren (Operatorvorrang) siehe Fachliteratur

Eine Sonderstellung nimmt das Gleichheitszeichen (5.3.2.3 Vergleichsoperatoren) ein: Es kann sowohl als Zuweisungsoperator, als auch als Gleichheitsoperator dienen. Damit verhält sich VBA völlig anders als die meisten anderen Programmiersprachen, in denen Zuweisung und Gleichheit durch unterschiedliche Operatoren kenntlich gemacht werden (z.B. in C/C++: Gleichheit "==", Zuweisung "=").

 

Rechenoperatoren

Für Berechnungen in VBA werden die Operatoren der folgenden Tabelle benötigt:

 

Tabelle 5.2: Rechenoperatoren in der Programmiersprache VBA

Operator

Wirkung

+

Addition

-

Subtraktion

*

Multiplikation

/

Division

\

"Ganzzahlige" Division (Ergebnis ist Ganzzahlig)

Mod

Ganzzahliger Rest einer Division

^

Potenzierung

 

Logische Operatoren

Die Boolesche Algebra nimmt eine sehr wichtige Stellung in Programmiersprachen ein. In VBA sind die logischen Operatoren für Boolesche Rechnungen wie folgt definiert:

 

Tabelle 5.3: Logische Operatoren in Visual Basic for Applications

Operator

Ergibt True (wahrer Ausdruck) bei folgenden Konstellationen:

And

Alle verglichenen Ausdrücke müssen wahr sein

Or

Mindestens einer der verglichenen Ausdrücke muß wahr sein

Xor

Ausschließliches "Oder"; nur ein Ausdruck darf wahr sein

Not

Negation; der betrachtete Ausdruck darf nicht wahr sein

 

 

Vergleichsoperatoren

Die Frage nach Gleichheit oder Ungleichheit ist immer wieder in sehr vielen Programmteilen zu finden. Der hauptsächliche Grund dafür ist, daß Vergleiche (Abschnitt 5.3.5) die nicht ohne Vergleichsoperatoren funktionieren, einen wesentlichen Bestandteil von Programmiersprachen darstellen.

 

Tabelle 5.4: Vergleichsoperatoren in VBA

Operator

Wirkung

=

Gleichheit beider Werte

<

Der linke Wert muß kleiner sein als der rechte

<=

Der linke Wert muß kleiner oder gleich dem rechten sein

>

Der linke Wert muß größer sein als der rechte

>=

Der linke Wert muß größer oder gleich dem rechten sein

<>

Der linke Wert muß ungleich dem rechten sein

 

 

Variablen, Konstanten und Felder

Ebenso, wie zum Beispiel in C/C++, werden auch in VBA Variablen, Konstanten und Felder unterschieden. Die vorhandenen Unterschiede sollen in den nächsten drei Teilabschnitten erläutert werden.

 

Variablenarten

Wie andere Programmiersprachen unterscheidet auch VBA bei numerischen Variablen zwischen Variablen für ganzzahlige und für gebrochene Zahlenwerte; weiterhin gibt es Variablen für alphanumerische Texte, für Ja/Nein-Entscheidungen und für das Datum.

Zu den Namen und Eigenschaften der wichtigsten Datentypen siehe folgende Tabelle:

Tabelle 5.5: Die wichtigsten Datentypen in VBA

Variablenart

Name

Speicherbedarf

Wertebereich (ca.)

Universell

Variant

16 Bytes

+ 1 Byte je Zeichen

Jeder Wert

Ganzzahl

Integer

2 Bytes

-32768 bis 32768

Ganzzahl

Long

4 Bytes

- 2 Mrd. bis 2 Mrd.

Fließkommazahl

Single

4 Bytes

+/- 1,4E-45 bis 3,4E38

Fließkommazahl

Double

8 Bytes

+/- 4,9E-324 bis 1,8E308

Boolesch

Boolean

2 Bytes

True oder False

Zeichenfolge

String

1 Byte je Zeichen

Nur vom Speicherplatz begrenzt

 

Weitere Datentypen der Programmiersprache VBA, die hier nicht explizit beschrieben werden sollen, sind z.B. Date, Currency, Byte, Decimal.

Neben den Standard-Datentypen sind selbstdefinierte Datentypen mit Hilfe der Type-Anweisung möglich. Mit ihr kann der Programmierer aus mehreren Standardtypen, ähnlich wie in einem Datenfeld (Abschnitt 5.3.3), die benötigte Variablenform selbst bestimmen (siehe Fachliteratur).

 

Deklaration und Gültigkeitsbereiche von Variablen

Variablen sollten als erste Anweisungen in Prozeduren/Funktionen, d.h. im Deklarations-bereich des Unterprogrammes, folgendermaßen deklariert werden:

Dim VarName As Datentyp

Diese Form der Variablenerzeugung zu Beginn eines Unterprogrammes ist jedoch nur erforderlich, wenn der Code-Bereich mit dem Befehl Option Explicit begonnen wird (was die Sicherheit beim Programmablauf erhöht). Ansonsten kann VBA auch während der Laufzeit an irgendeiner Stelle im Programmcode automatisch Speicherplatz für eine Variable freimachen. Der Datentyp und somit der Speicherplatz der Variablen wird automatisch anhand der Erfordernisse festgelegt:

‘Anweisungen

Var1 = 3 ‘Erzeugung einer Integer-Variablen

Var2 = 3.14 ‘Erzeugung einer Single-Variablen

‘aber:

Var1 = 1.717

‘In Var1 ist jetzt, anders als vorher, eine Single-Variable gespeichert

 

Mit der Dim-Anweisung erzeugte Veränderliche sind nur in dem Bereich gültig, in denen sie definiert wurden. Wenn die Anweisung in einer Prozedur steht, hat sie ihren Gültigkeitsbereich nur lokal in dieser Prozedur. Sollen Variablen auch innerhalb anderer Prozeduren Verwendung finden, dann ist eine Definition außerhalb aller Prozeduren und Funktionen im Code-Bereich des programmierten Formulars (oder der Tabelle) nötig. Dort erzeugte Veränderliche sind in allen Unterprogrammen des Formulars gültig. In diesen Fällen spricht man von generellen Variablen.

Wenn darüber hinaus eine Variable auch in Unterprogrammen anderer Formulare oder Module genutzt werden soll, muß sie in einem Modul (und nur in einem Modul) definiert werden; dann aber wird nicht das Schlüsselwort Dim verwendet, sondern stattdessen Public. Die Variable ist dann global gültig:

Public Var3 As Integer

 

Statt die Variablen mit der Angabe des gewünschten Datentyps zu definieren, kann bei einigen Typen auch ein charakterisierendes Kurzzeichen verwendet werden. Bei Integer-Daten sieht das folgendermaßen aus:

Dim nVar%

 

Die möglichen Kurzzeichen entnehmen Sie der nachfolgenden Tabelle.

Tabelle 5.6: Kurzzeichen der wichtigsten Datentypen

Datentyp

Kurzzeichen

Integer

%

Long

&

Single

!

Double

#

String

$

Diese Kurzzeichen sollten auch im Zusammenhang mit Zahlenangaben verwendet werden. Um einer Variablen vom Typ Double einen Fließkommawert zuzuweisen, müßte man folglich schreiben:

dblVar1 = 3#

Das wird um so wichtiger, wenn z.B. eine Rechenoperation folgender Art durchgeführt werden soll:

Dim lVar1 As Long

lVar1 = 255 * 256 ‘Fehler!

Der obige Fehler tritt auf, weil VBA die Rechnung vor der Zuweisung durchführt; in beiden Variablen erkennt VBA den Typ Integer, mit der Multiplikation wird der Gültigkeitsbereich der Integer-Variable überschritten! Wird eine der beiden Zahlen als Long-Typ definiert, dann tritt der Fehler nicht auf (siehe /1/).

 

Der Datentyp Variant

Eine besondere Position nimmt der Datentyp Variant ein.

Variant ist der Standard-Datentyp in VBA. Wird bei der Definition der Variablen kein anderer Typ angegeben, dann ist die Variable automatisch vom Typ Variant:

Dim VariableX ‘Varible vom Typ Variant

 

Wie der Name schon andeutet, kann einer Variant-Variablen jeder Wert zugewiesen werden, sie passt ihre Art der internen Speicherung automatisch an die Erfordernisse des zu speichernden Wertes an. Soll ein Double-Wert gespeichert werden, so bleibt die gespeicherte Zahl gebrochen rational, bei Integerzahlen werden auch in die Variante keine Nachkommastellen geschrieben. Das ist besonders zu beachten, wenn eine implizite Typumwandlung, die in VBA möglich ist, erreicht werden soll. Wenn eine Double-Zahl einer Integer-Variablen zugewiesen wird, dann werden automatisch die Nachkommastellen abgeschnitten. Beispiel:

Dim n As Integer

N = 3.41 ‘N hat den Inhalt 3

 

Bei Variantvariablen funktioniert die Umwandlung nicht, egal, welchen Wert sie vorher hatte:

Dim V As Variant

V = 3

‘Anweisungen

V = 3.41 ‘in V ist der Double-Wert 3,41 gespeichert.

Die Verwendung einer Varianten ist aber duchaus sinnvoll, wenn nicht im vorhinein bekannt ist, welchen Inhalt sie aufnehmen soll. Denn wenn zum Beispiel eine Funktion eigentlich eine ganze Zahl zurückliefern soll, bei bestimmten Verhältnissen aber einen Text ("Die Berechnung konnte nicht durchgeführt werden"), dann ist eine Variant-Variable die richtige Wahl. Besonders Wertvoll ist sie aber auch, weil sie, ohne Größenangabe bei der Definition, auch ein Feld aufnehmen kann (siehe Literatur).

Um herauszufinden, welche Art von Inhalt die Variante hat, kann man die von VBA bereit-gestellten Funktionen VarType und TypeName benutzen. Erstere liefert als Rückgabewert einen, den Typ charakterisierenden, ganzzahligen numerischen Wert, letztere gibt den Namen des Typs als Text zurück (siehe: Online-Hilfe).

Weiterhin kann, anders als die anderen Variablen, eine Variante auch Objekte aufnehmen (siehe Abschnitt 5.3.4, Objektvariablen)

Eine Variant-Variable kann auch die Zustände Empty (noch überhaupt nicht belegt) und Null annehmen. Null ist die Kennzeichnung für einen nicht belegten Zeiger. Hier können die Funktionen IsEmpty und IsNull zur Ermittlung des Inhalts herangezogen werden. Zur Verwendung von IsEmpty siehe Felder

 

Konstanten

Ebenso wie bei den Variablen gibt es auch bei der Definition von Konstanten verschiedene Gültigkeitsbereiche. Die Definition einer Konstanten in einer Prozedur/Funktion (lokale Gültigkeit) oder einem Formular/Modul (generelle Gültigkeit) sieht folgendermaßen aus:

Const Pi = 3.14

 

Sollen Konstanten global gültig sein, dann muß der Definition das Schlüsselwort Public vorangestellt werden (nur in Modulen möglich):

Public Const Pi = 3.14

 

Neben selbstdefinierten Konstanten bieten sowohl VBA, als auch Excel viele eigene Konstanten an, die z.B. bei der Parameterangabe in Funktionsaufrufen genutzt werden können. Diese Konstanten erkennt man zumeist an den ersten beiden Buchstaben, für VBA-Konstanten ist das "vb...", Excel-eigene erkennt man an "xl..."

Als Beispiele wären zu nennen vbYesNo als Übergabeparameter an den Aufruf eines Meldedialogs (MessageBox, siehe Abschnitt 6.1) oder vbHourglass als Kennzeichnung für einen sanduhrförmigen Mauszeiger. Auflistungen aller vordefinierten Konstanten hält die Online-Hilfedatei der Excel-IDE bereit.

 

Felder

Zum Sprachumfang von VBA gehören auch ein- oder mehrdimensionale Felder.

Mit der folgenden Anweisung können einem Integer-Feld insgesamt 11 (!) Integer-Werte zugewiesen werden:

Dim nFeld(10) As Integer ‘Zählung der Indizes von 0 bis 10

‘(jeweils einschließlich)

‘Zuweisung von Zahlenwerten:

nFeld(1) = 100

nFeld(2) = 200

‘...

Ein zweidimensionales Feld wird folgendermaßen definiert:

Dim nmFeld(1,5) As Long ‘erste Dimension von Index 0 bis 1,

‘zweite von 0 bis 5

 

Will man erreichen, daß die Zählung der Indizes bei von 0 verschiedenen Zahlen beginnt, ist es erlaubt, die Index-Grenzen anzugeben:

Dim nFeld(-5 To 5) As Integer

 

Überaus gut gelungen ist in VBA die dynamische Größenanpassung von Feldern. Ist es erforderlich, daß erst zur Laufzeit des geschriebenen Programms die Größe des Feldes festgelegt wird, etwa weil vorher nicht klar ist, ob ein Feld 10 oder 10000 Werte aufnehmen soll (die Speicherverschwendung bei irrtümlicher Wahl eines sehr großen Feldes wird im unglücklichsten Falle auch zu einer Verlangsamung des Programmablaufs führen), dann wird i.A. folgende Anweisung benutzt:

Dim nFeld() As Long

‘andere Anweisungen

Redim nFeld(10) ‘das Feld nimmt jetzt 11 Zahlenwerte auf

 

Soll zu einem späteren Zeitpunkt noch einmal die Anzahl der Feldelemente erhöht werden, muß, wenn die schon enthaltenen Elemente nicht überschrieben werden sollen, das Schlüsselwort Preserve verwendet werden:

Redim Preserve nFeld(20)

 

Sogar der Datentyp läßt sich im nachhinein noch festlegen (siehe Literatur).

 

Der erste und der letzte verwendete Index des Feldes können mit den Funktionen UBound und LBound erfragt werden. Angewandt auf das letzte Beispiel:

nObergrenze = UBound(nFeld) ‘ nObergrenze hat den Wert 20

Oft muß vor der Zuweisung von Werten zu den Feldelementen heausgefunden werden, ob das Feld überhaupt initialisiert, sprich auf eine (beliebige) Größe festgelegt wurde. Dann kann man sich mit, oft umständlichen, Programmiertricks helfen, oder statt eines Feldes mit festgelegtem Datentyp eine Variant-Variable zur Aufnahme der Werte verwenden. Denn bei der Varianten kann man die von VBA mitgelieferte IsEmpty-Funktion verwenden: Sie gibt zurück, ob das Feld schon einmal mit einer Größe belegt wurde (Rückgabewert False), oder noch nicht benutzt wurde (True).

 

Objekte, Eigenschaften und Methoden

Objekte gehören zum Grundbestandteil einer modernen Programmiersprache. Auch VBA bedient sich der objektorientierten Programmierung.

 

Objekte

Objekte sind integraler Bestandteil moderner, visueller Programmiersprachen. Die Steuerung aller Eigenschaften und Zustände wird in den sog. objektorientierten Sprachen über Objekte geregelt. Objekte sind i.A. die grafisch sichtbaren, "faßbaren" Elemente eines Computerprogramms. Sie haben Attribute wie Namen, Textformatierungen und Größenwerte.

Ebenso, wie es z.B. in Excel die Anwendung selbst, Arbeitsmappen, einzelne Tabellen oder Diagramme gibt, gibt es in der VBA-Entwicklungsumgebung von Excel ein Anwendungsobjekt (Application), Arbeitsmappen-Objekte (Workbooks), Tabellen- und Diagramm-Objekte.

Die Objekte sind hierarchisch gegliedert; zu vielen Objektklassen existieren auch Unter-Klassen. Auch hier greift wieder die Analogie zum Anwendungsprogramm: Die Tabellen sind den Arbeitsmappen untergliedert, den Tabellen selbst gehören die Zellen an.

Eine andere Art von Objekten sind die sog. Auflistungen. Sie sind zu erkennen an einem "s" am Ende des Namens. Die Auflistungen sind eine Art von Objektgruppen, aus deren Mitgliedern einzelne Objekte angesprochen werden können. Zum Beispiel gibt es in Excel eine Gruppe von Tabellenblättern (Sheets), jedes Einzelne Blatt ist Mitglied dieser Gruppe.

 

Eigenschaften

Zugriff auf Objekt-Attribute:

Um auf ein Merkmal eines Objektes, wie zum Beispiel die Aufschrift auf einer Schaltfläche, die Größe eines Fensters oder dessen Farbe, Einfluß nehmen zu können, stehen die Eigenschaften zur Verfügung. Eigenschaften stellen sich dem Programmierer wie Variablen dar, denen die gewünschten Werte zugeordnet werden können. Sie werden in Form einer Zuweisung verwendet.

Um die Eigenschaften eines Programmelementes einstellen zu können, muß im Programmcode das Objekt, das dieses Element repräsentiert, mitsamt seinen übergeordneten Objekten, getrennt durch einen Punkt, angegeben werden:

Objekt.Subobjekt.Eigenschaft = Zugewiesener_Wert

(Um klarer zwischen Objekten und den noch zu erläuternden Methoden und Eigenschaften unterscheiden zu können, wurde in den neueren VBA-Versionen die Trennung durch ein Ausrufezeichen (!) möglich gemacht:

Objekt!Subobjekt.Eigenschaft

Da diese Art der Trennung jedoch in der Literatur nur höchst selten anzutreffen ist, werde ich nicht weiter darauf eingehen, zumal häufig die Grenze zwischen Methoden und Objekten verwischt, und es somit eher zu Programmfehlern kommen kann, wenn versehentlich die falsche Variante gewählt wurde.)

 

Um zum Beispiel die Größe einer Schaltfläche (Command1) auf einem Formular (Form1) einzustellen, sind folgende Anweisungen möglich:

Forms.Form1.Controls.Command1.Height = 100

Forms.Form1.Controls.Command1.Width = 250

 

Viele Objekte, Methoden und Eigenschaften haben ein sog. default object, d.h., dieses muß nicht angegeben werden, wenn Einstellungen an den charakteristischen Merkmalen vorzunehmen sind. So ist im obigen Beispiel die Auflistung Forms das Default-Objekt des Formulars Form1, Command1 hat wiederum als Standard-Objekt die Controls-Auflistung. Somit kann man das Beispiel auch in folgender Form schreiben:

Form1.Command1.Width = 250

 

Wenn die Anweisung im Code-Bereich des Formulars Form1 ausgeführt werden soll (siehe Abschnitt 5.1, IDE), dann kann auch auf die Angabe des Formularnamens Form1 verzichtet werden:

Command1.Width = 250

(Die Einheit, in der hier die Breite und oben die Höhe bemaßt werden, wird in Twips angegeben; 567 Twip entsprechen je nach Bildschirmauflösung etwa einem cm.)

 

Methoden

Eine weitere Möglichkeit, die Merkmale eines VB-Elementes zu beeinflussen, ist die Anwendung von Methoden. Methoden sind zu beschreiben als Prozeduren eines Objektes. Sie werden, oft mit Angabe von Parametern, wie die Eigenschaften den Objekten hintenangestellt. Beispielsweise wird der Fokus (das Element, welches als nächstes eine Eingabe erwartet, hat den Fokus) auf eine Schaltfläche gesetzt mit

Command1.SetFocus()

 

Methoden sind Handlungsanweisungen für ein Objekt, anders als Eigenschaften, die nur eine Zustand beschreiben.

 

Objektvariablen

Um Objekte nicht mitsamt übergeordneten Objekten durch das gesamte Programm "schleppen" zu müssen, besteht in VBA die Möglichkeit, sog. Objektvariablen zu erzeugen. Sie werden wie "normale" Variablen deklariert, aber, anders als Variablen, nicht über einfache Zuweisung, sondern durch Verwendung des Schlüsselwortes Set mit einem Wert belegt. Als Wert wird jedoch nur ein Verweis auf das Objekt in der Variablen gespeichert. Dies ist zu vergleichen mit den Zeigern in der Sprache C/C++.

Beispiel:

Dim C1 As Objekt

Set C1 = Form1.Command1

C1.Height = 100

Wird die Eigenschaft der Objektvariablen geändert, ändert sich auch die entsprechende Eigenschaft des Objektes. Anders als bei numerischen oder String-Variablen, die in dieser Beziehung autark reagieren. Wird eine Zahl-Variable geändert, ist die Änderung nur auf diese einzelne Variable beschränkt.

Auch der Datentyp Variant eignet sich als Objektvariable. Zwar ist dann die Nutzung des Default-Objektes nicht mehr möglich (siehe /1/), der Programmierer wird damit aber um so flexibler, was z.B. die Anzahl vorab definierter Variablen angeht. Bei bestimmten Anwendungen ist die Speicherung eines Objektzeigers in einer Variant-Variablen sogar die einzig zulässige Art. Ob eine Variante einen Zeiger auf ein Objekt enthält, kann mit der Funktion IsObjekt erfragt werden.

Auch eine konkretere Angabe der Objektart ist möglich. So könnte im letzten Beispiel auch Dim C1 As CommandButton stehen. Als Objekttypen erlaubt sind die Namen aller unter VBA verfügbaren Objekte.

 

Die With-Anweisung

Wenn viele Eigenschaften eines Objektes geändert werden sollen, vereinfacht oft die Programmierung einer With-Anweisung den Programmcode. Dabei wird der Objektname nur ein einziges Mal genannt. Die Eigenschaftsänderungen müssen dann, wie im folgenden Beispiel, nur mit einem Punkt beginnend zwischen die ein- und ausleitenden Schlüsselworte geschrieben werden:

With Form1.Command1

.Height = 100

.Width = 250

.SetFocus

End With

 

 

Schleifen und Verzweigungen

Verzweigungen

Verzweigungen gehören zu den elementaren Bestandteilen jeder Programmiersprache. In diesem Kapitel sollen die Select-Case-Verzweigung und die If-Then-Verzweigung beschrieben werden.

 

If-Then-Verzweigung

Eine von zwei Formen der Verzweigung in VBA ist die für nur eine Alternative (einfache Entscheidung) oder wenige Alternativen geeignete If-Then-Struktur.

Der Programmcode kann beispielsweise lauten:

If (Bedingung) Then

'Anweisungen

End If

Hierbei wird der Anweisungsteil nur duchgeführt, wenn die Bedingung als Ergebnis "Wahr" ergibt. Die Anweisung kann auch als In-Line-Code programmiert werden; hier wird auf die Angabe des abschließenden Teils End If verzichtet:

If (Bedingung) Then 'Anweisungen

Bei differierenden Anweisungen, die wahlweise ausgeführt werden, spricht man von echten Alternativen. Ergibt die Bedingung dabei Falsch, wird der Anweisungsteil ausgeführt, der durch das Schlüsselwort Else eingeleitet wird:

If (Bedingung) Then

'Anweisungen

Else

'Anweisungen

End If

Auch diese Verzweigungsart kann In-Line geschrieben werden. Als Trennung zwischen mehreren Anweisungen wird der Doppelpunkt verwendet:

If (Bedingung) Then [Anweisung1: Anweisung2] [Else Anweis1: Anweis2]

Auch sind in VBA Entscheidungen möglich, die abhängig von mehr als einer Bedingung ausgeführt werden sollen. In der Verzweigungsstruktur wird dazu das Wort ElseIf verwendet:

If (Bedingung1) Then

'Anweisungen

ElseIf (Bedingung2) Then

'Anweisungen

Else

'Anweisungen

End If

Select-Case-Verzweigung

Die zweite Art von Verzweigung in VBA ist die Select-Case-Struktur. Sie ist übersichtlicher als die If-Then-Verzweigung, wenn eine größere Zahl von alternativen Möglichkeiten zu unterscheiden sind. Dabei wird jedoch nicht, wie in der vorangegangenen Verzweigung, eine Bedingung auf ihren Wahrheitswert überprüft, sondern es werden explizit Werte mit einer aus dem Programmcode gegebenen Variablen verglichen:

Select Case Variable

Case Variablenwert1

'Anweisungen

Case Variablenwert2, Variablenwert3 [,...]

'Anweisungen

Case Else

'Anweisungen

End Select

 

Schleifen

Schleifen sind eine weitere, in jeder Programmiersprache genutzte Strukturform. Zu Beachten ist, daß die While-Wend-Schleife, welche eigentlich überflüssig ist, nur der Vollständigkeit halber hier erwähnt wird

 

For-Next-Schleife

Um eine einzelne oder mehrere Anweisungen für eine vorgegebene Anzahl von Durchläufen auszuführen, eignet sich die For-Next-Scheife. Sie ist vergleichbar mit der Struktur For(...) der Sprache C/C++:

For i = Anfang To Ende

'Anweisungen

Next

 

Zusätzlich kann eine Schrittweite angegeben werden, die von +1 abweicht, sowie hinter dem Next-Schlüssel die Zählvariable, wodurch auch verschachtelte Strukturen möglich werden:

Dim i As Integer, j As Integer 'Zähler

Dim k As Integer 'Schrittweite

k=2

For i = 0 To 10 Step k

'Anweisungen

For j=10 To 0 Step (k*(-1))

'Anweisungen

Next j

'Anweisungen

Next i

 

Wichtig zu erwähnen ist auch, daß das Herausspringen aus einer For-Next-Schleife, abhängig von einer Bedingung, durch den Zusatz Exit For möglich ist:

If Bedingung Then Exit For

 

Eine Besonderheit: Die For-Next-Schleife bricht nach ununterbrochenen Durchlauf erst ab, wenn die Zählvariable das erste Mal die Abbruchbedingung über-, bzw., bei negativen Schrittweiten, unterschritten hat.

Wenn der Zähler als Grundlage für weitere Programmanweisungen dienen soll (zum Beispiel bei der Überprüfung, ob die Schleife vorzeitig durch Exit For verlassen wurde), muß also bedacht werden, daß im Höchstfalle der Zähler um eine Schrittweite über (bzw. unter) dem Endwert liegt. Beispiel:

For i = 0 To 2

'Anweisungen

Next

'Anweisungen ‘i hat den Wert 3

 

 

While-Wend-Schleife

Eine Schleifenart, die nur noch aus Gründen der Kompatibilität in VBA enthalten ist, ist die While-Wend-Schleife:

While (Bedingung)

'Anweisungen

Wend

 

Do-Loop-Schleifen

Der Nachteil bei der While-Wend-Schleife ist, daß keine Möglichkeit besteht, abhängig von einer Bedingung die Schleife vorzeitig zu verlassen.

Diesen Nachteil hat die Do-Loop-Schleife nicht, hier ist ein Herausspringen mit Exit Do möglich.

Die Do-Loop-Schleife kann als Abweisende und als nicht abweisende Schleife verwendet werden. Desweiteren kann die Abfrage, ob die Bedingung für einen Schleifenlauf besteht, vor dem Durchlauf oder nach einem Durchlauf, also vor dem nächsten, durchgeführt werden. Es stehen also vier mögliche Arten dieser Struktur zur Verfügung.

 

Do-While-Loop-Schleife (abweisend), Abfrage vor Schleifendurchlauf:

Do While (Bedingung)

'Anweisungen

[Exit Do]

'Anweisungen

Loop

 

Do-Loop-While-Schleife (nicht abweisend), Abfrage nach Schleifendurchlauf:

Do

'Anweisungen

[Exit Do]

'Anweisungen

Loop While (Bedingung)

 

Do-Until-Loop-Schleife (abweisend), Abfrage vor Schleifendurchlauf:

Do Until (Bedingung)

'Anweisungen

[Exit Do]

'Anweisungen

Loop

 

Do-Loop-Until-Schleife (nicht abweisend), Abfrage nach Schleifendurchlauf:

Do

'Anweisungen

[Exit Do]

'Anweisungen

Loop Until (Bedingung)

 

 

Vordefinierte Funktionen

VBA liefert in seinem Sprachumfang eine Reihe von vordefinierten Funktionen mit. Diese müssen nicht, wie in C üblich, dem Compiler durch Angabe von Bibliotheken im Kopfabschnitt (header) der Code-Datei "angekündigt" werden, sondern sie gehören zu den Grundelementen der Sprache und sind somit ohne weiteres verwendbar.

 

Typumwandlungsfunktionen

Zu den am häufigsten verwendeten Funktionen zählen die zahlreichen Typumwandlungs-funktionen, die benötigt werden, um Werte eines Zahlentyps ohne Datenverluste in eine Variable eines anderen Typs einschreiben zu können. Die wichtigsten von diesen Typum-wandlungsfunktionen folgen in der nächsten Tabelle.

 

Tabelle 5.7: Typumwandlungsfunktionen

Funktion

Zahlentyp des Rückgabewertes

Bemerkungen

CInt(Ausdruck)

Integer

Der Nachkommaanteil wird gerundet

CLng(Ausdruck)

Long

Der Nachkommaanteil wird gerundet

CSng(Ausdruck)

Single

 

CDbl(Ausdruck)

Double

 

CStr(Ausdruck)

String

 

CVar(Ausdruck)

Variant

 

 

Das erforderliche Argument Ausdruck ist ein Zeichenfolgenausdruck oder ein numerischer Ausdruck.

Um schon vor der Verwendung einer der Funktionen (zur Vermeidung von Fehlern) feststellen zu können, ob es sich bei dem Ausdruck um eine Zeichenfolge handelt, die in eine Zahl umgewandelt werden kann, stellt VBA die Funktion IsNumeric zur Verfügung. Sie liefert den Wert True, wenn eine Umwandlung möglich ist und False, wenn der Ausdruck nicht in eine Zahl umgewandelt werden kann:

boolWert = IsNumeric(Ausdruck)

 

 

String-Funktionen

Gerade, wenn viel mit Text-Variablen gearbeitet wird, werden Funktionen benötigt, die String-Variablen und -Konstanten verarbeiten können. Auch diese gehören in VBA zu den Standard-Sprachelementen.

Right-, Left-, Mid-Funktionen: Diese liefern als Rückgabewerte Strings, deren Länge durch den bzw. die Übergabeparameter festgelegt sind:

Right(String, Laenge)

Gibt einen String zurück, der Teilmenge des übergebenen Strings ist, und mit dessen rechten Ende identisch ist. Beispiel:

Dim strWert As String

strWert = Right("Zeichenfolge",5) 'liefert strWert = "folge"

 

Left(String, Laenge)

Gibt einen String zurück, der Teilmenge des übergebenen Strings ist, und mit dessen linken Ende (seinem Anfang) identisch ist. Beispiel:

strWert = Left("Zeichenfolge",3) 'liefert strWert = "Zei"

 

Mid(String, Start[,Laenge])

Gibt einen String zurück, der Teilmenge des übergebenen Strings ist, und ab der übergebenen Startposition (von Links gezählt) mit diesem identisch ist. Die Länge des Rückgabe-Strings kann außer durch die Startposition auch zusätzlich durch einen optionalen dritten Parameter beeinflußt werden. Beispiel:

strWert = Mid("Zeichenfolge mit Leerzeichen",8,11) 'liefert strWert = "folge mit L"

Die Länge einer Zeichenfolgenkonstanten oder -Variablen kann durch Len(String) ermittelt werden. Zurückgegeben wird eine Integer-Zahl. Beispiel:

Dim z As Integer

z = Len("12346") 'liefert z = 5

 

Um Zeichenketten von etwaigen Leerzeichen am Anfang und/oder am Ende des Strings zu trennen, bietet VBA gleich drei Funktionen an:

LTrim(Zeichenfolge)

Eliminiert Leerzeichen am Stringanfang

 

RTrim(Zeichenfolge)

Eliminiert Leerzeichen am Stringende

 

Trim(Zeichenfolge)

Eliminiert Leerzeichen an beiden Enden der Zeichenkette

Beispiel:

strWert=Trim(" Einige Leerzeichen ") 'liefert strWert = "Einige Leerzeichen"

 

 

Ob sich in einem String eine gesuchte Zeichenkette als Teilmenge befindet, kann durch zwei Funktionen von VBA, InStr und Like, ermittelt werden.

Die InStr-Funktion gibt eine Integer-Zahl an den aufrufenden Codeabschnitt zurück, der angibt, ab welcher Position die gesuchte Zeichenkette mit dem String identisch ist:

InStr([Start, ]Zeichenfolge1, Zeichenfolge2[, Vergleichsart])

Wird der optionale Parameter Start, eine Ganzzahl, an die Funktion übergeben, dann wird erst ab der Position, die mit Start identisch ist, nach der Zeichenfolge gesucht; fehlt er, dann wird der gesamte String durchsucht.

Der ebenfalls optionale Parameter Vergleichsart stellt eine Vorschrift dar, wie die Funktion Groß- und Kleinschreibung, bzw. deutsche Umlaute und das "ß" zu behandeln sind. Bei Vergleichsart=1 werden Groß- und Kleinbuchstaben als gleichwertig behandelt, und z.B. der Umlaut "ö" folgt auf den Vokal "o"; bei Vergleichsart=0 werden beide Zeichenfolgen binär miteinander verglichen, d.h., Großbuchstaben haben eine geringere Wertigkeit (vergl. Ascii-Code) als Kleinbuchstaben. Beispiel:

 

strWert = "Mannschaft wie Flasche leer"

z = InStr( , strWert, "LEER", 1) 'liefert z = 23

z = InStr( , strWert, "LEER", 0) 'liefert z = 0

 

Funktion Nummer zwei hat folgende Syntax:

Ergebnis = Zeichenfolge Like Muster

Die Like-Funktion gibt einen boolschen Wert zurück, der charakterisiert, ob der String vor dem Funktionsnamen mit dem Muster-String nach dem Funktionsnamen identisch (True) ist. Dabei sind auch Platzhalter ("?" für ein Zeichen, "*" für mehrere Zeichen) erlaubt. Beispiel:

Dim booWert As Boolean

strWert = "Meier"

booWert = strWert Like "M*er" 'liefert booWert = True

 

Ebenfalls große Bedeutung für die Programmierung mit VBA hat der Format-Befehl (siehe Online-Hilfe):

Format(Ausdruck[, Format[, firstdayofweek[, firstweekofyear]]])

Beispiele:

Dim Zeit1, Datum1, ZF1

Zeit1 = #17:04:23#

ZF1 = Format(5459.4, "##,##0.00") ' Liefert "5.459,40".

ZF1 = Format(Zeit1, "h:m:s") ' Liefert "17:4:23".

ZF1 = Format(Zeit1, "hh:mm:ss AMPM") ' Liefert "17:04:23".

 

Mathematische Funktionen

In VBA sind ebenfalls schon viele mathematische Funktionen integriert. Da die Verwendung dieser Funktionen i.A. selbsterklärend ist, sollen hier die Funktionen nur in Tabellenform erwähnt werden.

 

Tabelle 5.8: Einige mathematische Funktionen

Funktion

Bedeutung

Abs

Absolutwert

Atn

Arcus Tangens

Cos

Cosinus

Exp

Exponentialfunktion

Log

Logarithmus

Sgn

Signum (Vorzeichen)

Sin

Sinus

Sqr

Wurzel

Tan

Tangens

 

Objekte und Programmiertechniken

Die hauptsächlich auftretende Aufgabe der VBA-Programmierung ist es, in Excel vorhandene Elemente durch den Programmcode eines Makros zu beeinflussen. So greift man in einem umfangreicheren Makro des häufigeren auf Zellen, Spalten, Tabellen und Diagramme zu. Obwohl sicherlich in vielen Anwendungsfällen eigene Dialoge erstellt werden müssen, nimmt deren Programmierzeit in der VBA-Programmierung allgemein nur einen geringen Teil der Gesamtzeit ein. Dieses Kapitel beschäftigt sich daher mit Zugriffstechniken zur Verwendung der zahlreichen Excel-Objekte und Auflistungen.

 

 

Zugriff auf Zellen

Zuerst sollen einige Begriffe erläutert werden: Die aktive Zelle (ActiveCell) ist jene Zelle des Tabellenblattes, die den Zellenzeiger enthält. Wenn man mit der Maus oder den Cursor-Tasten in eine Zelle springt, so wird diese Zelle zur aktiven Zelle, sie wird mit Zahlen oder Text gefüllt, wenn man eine alphanumerische Taste drückt. Ein Bereich (Range) ist eine Gruppe von Zellen. Ein Bereich wird z.B. dazu verwendet, um dem Diagramm-Assistenten die Datenquelle für ein Diagramm mitzuteilen. Eine Auswahl (Selection) liegt vor, wenn ein Bereich ausgewählt (markiert) wurde. Sie ist daran zu erkennen, daß die Zellen der Auswahl dunkel hinterlegt sind.

 

Einzelne Zellen bearbeiten

Um mit einer Eigenschaft bzw. Methode auf eine einzelne Zelle zuzugreifen, hat man eine Vielzahl von Möglichkeiten, die je nach Aufgabe mal besser und mal schlechter geeignet sind.

Zugriff über das Range-Objekt: Wie bereits erwähnt, handelt es sich bei einem Bereich um eine Gruppe von Zellen. Eine einzelne Zelle ist ein Sonderfall des Bereiches. Um eine einzelne Zelle mit einem Range-Objekt zu erreichen, kann folgende Syntax verwendet werden:

Range("A3").Methode

Als Kurzschreibweise ist auch

[A3].Methode

erlaubt.

Eine zweite Möglichkeit wäre, den Umweg über eine Selektion zu gehen. Dabei wird zuerst die Zelle, deren Zellenbezug im vorangegangenen Beispiel der Range-Methode übergeben wurde, ebenfalls unter Zuhilfenahme von Range, selektiert. Anschließend wird die Methode auf das Objekt der Selektion angewandt:

Range("A3").Select

Selection.Methode

Diese Art des Zellenzugriffs eignet sich besonders, wenn schon eine Selektion vorliegt, etwa weil der Programmanwender aus einer Mehrzahl von Zellen eine Zelle auswählen soll, deren Inhalt dann bearbeitet wird.

In Bezug auf Zellen ist die Activate-Methode mit der Select-Methode gleichbedeutend. Das Beispiel könnte also auch lauten:

Range("A3").Activate

ActiveCell.Methode

 

Weiterhin kann eine einzelne Zelle über die Cells-Auflistung angesprochen werden:

Cells(3,1).Methode

Wie man sieht, erwartet Cells statt eines Zeichenkettenparameters (wie Range oder Selection) einen Zellenbezug, der aus zwei Zahlen besteht. Der Vorteil dabei ist, daß man Cells sehr einfach in Schleifen verwenden kann, da die Laufvariablen der Schleifen ohne Umwege in den Parameterbereich eingesetzt werden können. So wird das Bearbeiten mehrerer Zellen einer Zeile oder Spalte vereinfacht. Der Nachteil ist, daß das Cells-Objekt die Parameter in der Form {Zeile, Spalte} erwartet, und nicht wie Range in der Form {Spalte, Zeile}, wodurch eine große Fehlergefahr besteht.

Eine einzelne Zelle kann auch angesprochen werden, indem man einen vorher (über den Menübefehl "Einfügen | Namen") vergebenen Zellennamen ausnutzt:

[Zellenname].Methode

Während alle vorangegangenen Zugriffsmöglichkeiten einen absoluten Zellenbezug benötigen, arbeitet die Offset-Methode mit relativen Angaben:

[A1].Offset(3,1)

Hier begegnet uns wieder die Schreibweise {Zeile, Spalte}, anzugeben als zwei positive natürliche Zahlen.

 

 

Bereiche bearbeiten

Ähnlich wie der Sonderfall der Zellenauswahl bei einer einzelnen Zelle können auch Bereiche selektiert werden. Dabei werden dem Range-Objekt statt einer einzelnen Zelle die "Eckpunkte", genauer gesagt, die Eckzellen eines rechteckigen Bereiches übergeben, voneinander getrennt durch einen Doppelpunkt:

Range("A5:D8").Select

 

Eine ganze Spalte wird selektiert durch

Columns("A:A").Select,

und ein Spaltenbereich durch

Columns("A:F").Select

Sinngemäß gelten beide Zugriffsarten auch für Zeilen. Dort wird allerdings Rows() statt Columns() verwendet.

 

Zugriff auf Arbeitsmappen, Fenster und Arbeitsblätter

Wie bereits im Kapitel 5.3.4 erwähnt, wird die Excel-Anwendung durch ein Application-Objekt repräsentiert, dem alle weiteren Objekte, Methoden und Eigenschaften zur Manipulation der Anwendung untergeordnet sind. Um die nächsten Hierarchieebenen ansprechen zu können, bedient man sich in der VBA-Programmierung für Excel im wesentlichen der Arbeitsmappen, Fenster und Arbeitsblätter.

 

Arbeitsmappen

Mit einem Excel-Makro können nicht nur die Arbeitsmappen (Excel-Dateien) bearbeitet werden, die den gerade abgearbeiteten Code enthalten, der Zugriff ist auch auf andere Arbeitsmappen möglich, sofern diese in die Anwendung geladen wurden. Alle Arbeits-mappen (geöffnet oder nicht) werden dabei durch die Workbooks-Auflistung angesprochen. Zum Beispiel läßt sich eine neue Mappe durch

Workbooks.Add

erzeugen.

Der Zugriff auf die Mappe, deren Code gerade abläuft, ist durch das Objekt ThisWorkbook möglich. Die aktive Arbeitsmappe, d.h. die Mappe, welche momentan den Fokus besitzt, wird durch das ActiveWorkbook-Objekt angesprochen.

 

Fenster

In Excel können mehrere Fenster von einer Arbeitsmappe nebeneinander existieren. Dadurch lassen sich z.B. bei umfangreichen Tabellen die Spaltenüberschriften und die letzten Zeilen gleichzeitig in verschiedenen Fenstern betrachten, was die Lesbarkeit erhöhen kann.

Jeder Arbeitsmappe ist in Excel mindestens ein Fenster zugeordnet, auch wenn es zum Icon verkleinert oder unsichtbar ist. Angesprochen werden die Fenster über die Windows-Methode. Je nachdem, auf welches Objekt - Application oder ein Workbook-Objekt (z.B. ThisWorkbook) - die Methode angewandt wird, kann man alle Fenster oder nur die Fenster der Mappe bearbeiten.

Äquivalent zum Objekt ActiveWorkbook gibt es auch ein ActiveWindow.

 

Arbeitsblätter

Mit Sheets hat man Zugriff auf alle Blätter einer Arbeitsmappe, egal, ob es sich um ein Tabellenblatt, ein Diagramm oder um einen Dialog handelt. Sheets kann sowohl auf Application angewandt werden, wenn der Zugriff auf die Blätter der gerade aktiven Arbeitsmappe gewünscht ist, als auch mit einem Workbook-Objekt, wenn eine bestimmte Mappe bearbeitet werden soll.

Eine Verfeinerung von Sheets stellen im wesentlichen die Auflistungen Worksheets (Zugriff nur auf Tabellenblätter), Charts (Diagramme), und DialogSheets (vom Anwender erstellte Dialoge bzw. Formulare) dar. Letzteres ist nur noch aus Kompatibilitätsgründen in Excel 97 vorhanden; wie im Abschnitt 5.2 erwähnt, geschah in Excel 95 der Zugriff auf einen Dialog anders als in Excel 97, heute wird ein Dialog über seinen Namen angesprochen.

Die aktiven Blätter werden, wie üblich, mit einer Eigenschaft angesprochen, deren Name jeweils mit Active beginnt und mit dem Blatt-Typ schließt (ActiveSheet, ActiveChart, ActiveDialog).

 

 

 

 

Spezielle Objekte, Eigenschaften und Methoden

Soll mit einem Excel-Makro der Inhalt einer Zelle, eines Blattes oder einer Mappe verändert, ausgelesen oder formatiert werden, sind oft zahlreiche Objekte im Spiel, die alle ihre eigenen Methoden und Eigenschaften mitbringen. Bei einfachen Aufgaben kann es daher nützlich sein, die anfallenden Aufgaben zuerst einmal manuell auszuführen und dabei ein Makro aufzunehmen. Das Makro kann dann als Grundlage für den eigenen Programmcode dienen und der Programmierer braucht sich nicht alle Anweisungen zu merken. Besteht Unklarheit über die Funktion eines Begriffes im erzeugten Programmtext, liefert die Excel-Hilfe meistens schnell die Erklärung (Wort markieren oder nur den Cursor darüber setzen, dann die F1-Taste drücken).

Viele Programmzeilen in einem automatisch erzeugten Makro sind allerdings überflüssig für den Programmablauf und verlangsamen somit nur die Ausführungsgeschwindigkeit. Daher ist es häufig sinnvoll, der Programmierer erzeugt den Code von Hand. Die folgenden Abschnitte versuchen, Standardanweisungen für die wichtigsten Anwendungen bei der Excel-Programmierung aufzulisten. Da viele Anweisungen selbsterklärend sind, werde ich die Erläuterungen auf ein minimales Maß begrenzen. Für eine erweiterte Liste siehe z.B. /1/.

 

Umgang mit Arbeitsmappen, Fenstern und Blättern

Bereits im vorangegangenen Kapitel 5.4.2.1 wurde gezeigt, daß mit

Workbooks.Add

eine neue Arbeitsmappe erstellt wird.

Das Speichern der aktuellen Mappe unter einem neuen Namen im selben Verzeichnis, in dem auch die Excel-Anwendung untergebracht ist, geschieht mit:

ActiveWorkbook.SaveAs FileName:=Application.Path & " \TestMappe.xls"

 

Aktivieren einer Arbeitsmappe durch Angabe ihres Namens:

Windows("TestMappe.xls").Activate

(Achtung: Select darf nicht angewandt werden!)

 

Öffnen einer Mappe unter Angabe eines Dateinamens mitsamt Pfad:

Workbooks.Open FileName:="C:\TEMP\AndereMappe.xls"

 

 

Aufruf des Excel-Standarddialogs zum Öffnen einer Datei:

Dateiname = Application.GetOpenFilename

(Die Datei wird nicht geöffnet, sondern nur deren Name ermittelt und in eine Variable geschrieben. Zum Öffnen muß die Open-Methode verwendet werden. Achtung: Bei vorzeitigem Abbruch des Dialogs durch Betätigen der entsprechenden Schaltfläche liefert GetOpenFilename den Wert Null. Darum muß die Dateiname-Variable vom Typ Variant sein.)

Speichern der aktiven Mappe:

ActiveWorkbook.Save

 

Schließen der aktiven Mappe:

ActiveWorkbook.Close

 

Aktivieren einer Tabelle durch Angabe ihres Namens:

Sheets("Tabelle1").Select

 

Umbenennen einer Tabelle:

Sheets("Tabelle1").Name = "NeuerName"

 

Hinzufügen einer neuen Tabelle zur aktiven Arbeitsmappe:

Sheets.Add Type:= xlWorksheet

 

Einfügen einer Kopie der Tabelle3 an erster Stelle aller Arbeitsblätter:

Sheets("Tabelle3").Copy Before:=Sheets(1)

 

Löschen der ausgewählten Arbeitsblätter:

ActiveWindow.SelectedSheets.Delete

 

Aktivieren eines Diagramms, das in einem Tabellenblatt integriert ist:

ActiveSheet.ChartObjects("Diagramm 1").Activate

 

Aktivieren eines Diagrammblattes:

Sheets("Diagramm1").Select

 

Fenster Minimieren, Maximieren oder auf Normalgröße verändern:

ActiveWindow.WindowState = xlMinimized

ActiveWindow.WindowState = xlNormal

ActiveWindow.WindowState = xlMaximized

 

Horizontales und vertikales Teilen eines Fensters (die Zahlen stehen für die Anzahlen von Zeilen oberhalb, bzw. Spalten links neben der Teilungslinien):

ActiveWindow.SplitRow = 10

ActiveWindow.SplitColumn = 2

 

Erzeugen eines neuen Fensters der aktiven Mappe:

ActiveWindow.NewWindow

 

Anordnen aller nicht minimierter Fenster:

Windows.Arrange ArrangeStyle:=xlTiled 'Unterteilt

Windows.Arrange ArrangeStyle:=xlHorizontal 'Untereinander

Windows.Arrange ArrangeStyle:=xlVertical 'Nebeneinander

Windows.Arrange ArrangeStyle:=xlCascade 'Überlappend

 

 

Umgang mit Zellen, Zeilen und Spalten

Einfügen neuer Spalten links neben den selektierten Spalten (die Anzahl der neuen entspricht der Anzahl der ausgewählten Spalten):

Columns("B:C").Select

Selection.Insert Shift:=xlToRight

 

Einfügen neuer Zeilen oberhalb der selektierten Zeile (die Anzahl der neuen entspricht der Anzahl der ausgewählten Zeilen):

Rows("6:6").Select

Selection.Insert Shift:=xlDown

 

Einfügen eines Textes (oder einer Zahl) in eine Zelle:

ActiveCell.FormulaR1C1 = "abcd"

 

Einstellen der Zeilenhöhe und der Spaltenbreite:

Selection.RowHeight = 15

Columns("D:D").ColumnWidth = 20

 

Formatierung des Zellentextes über das Font-Objekt:

Selection.Font.Name = "SansSerif"

Selection.Font.FontStyle = "Bold"

Selection.Font.Size = 16

Selection.Font.Underline = xlUnderlineStyleDouble ‘(Text doppelt

‘unterstrichen)

Anwendung der Summenformel:

ActiveCell.FormulaR1C1 = "=SUM(R[-4]C:R[-1]C)"

‘(Summe der vier Zellen oberhalb der aktiven Zelle)

 

Eingabe einer einfachen eigenen Formel:

ActiveCell.FormulaR1C1 = "=R[3]C[-2]-R[1]C[-2]"

‘(Inhalt der Zelle, die drei Zeilen unterhalb und zwei Spalten links neben der ‘aktiven Zelle liegt, minus dem Inhalt der Zelle an Position [+1,-2])

 

Zahlenformatierung (zwei Nachkommastellen):

Selection.NumberFormat = "0.00"

Zahlenformatierung (Angabe der Zahl mit Tausender-Trennzeichen):

Selection.Style = "Comma"

 

Zahlenformatierung:

Selection.Style = "Percent"

‘(Macht aus einer Zahl eine Prozentzahl)

 

Einfügen einer doppelten, dicken Zellenrahmenlinie unten, in der Farbe blau:

With Selection.Borders(xlEdgeBottom)

.LineStyle = xlDouble

.Weight = xlThick

.ColorIndex = 32

End With

 

Zeilenumbruch in der selektierten Zelle einfügen:

Selection.WrapText = True

 

Inhalte einer Zelle löschen (Formatierung bleibt erhalten):

Selection.ClearContents

 

Formatierung einer Zelle auf den Standard zurückstellen:

Selection.ClearFormats

 

Zelleninhalt kopieren / ausschneiden / einfügen:

Selection.Copy

Selection.Cut

Selection.Paste

 

Textausrichtung mittig / links / rechts über alle Selektierten:

Selection.HorizontalAlignment = xlCenter

Selection.HorizontalAlignment = xlLeft

Selection.HorizontalAlignment = xlRight






ZurückEine Seite zurückblättern Blättern Eine Seite vorblätternVor