VB Startseite

VBA für Excel '97

Man kann davon ausgehen, dass der VBA Befehlssatz abwärtskompatibel ist, d.h. die beschriebenen Lösungen funktionieren auch im Excel 2000. Es besteht lediglich die Möglichkeit, dass manches inzwischen auch anders/ besser gelöst werden kann. Weitergehende Informationen finden sich in der VBA Hilfedatei - man muss aber in etwa wissen wonach man sucht (wer kommt schon auf Interior) und dann noch etwas probieren.

Zugriffsebene:

Datei

gesamte Tabelle

Bereich

Zeilen und Spalten

Zellen

Datei

Für den Dateizugriff wird zuerst die Variable ObjExcelFile verwendet:
Dim ObjExcelFile As Object

Set ObjExcelFile = CreateObject("Excel.Application") Dem Objekt ObjExcelFile wird eine Instanz von Excel zugewiesen.
ObjExcelFile.Workbooks.Open "C:\Exceldateien\Auswertung.xls" In dieser Excel-Instanz wird die Datei "Auswertung.xls" geöffnet. Es wird der Dateiname mit vollständiger Pfadangabe verlangt.
Anzahl = ObjExcelFile.Documents.Count Die Anzahl geöffneter Files wird bestimmt.
Breite = ObjExcelFile.Application.Width Das ist die Tabellenbreite (in diesem Fall das gesamte Window für Excel) in Pixel. Ebenso funktionieren Height, Top und Left.
Breite = ObjExcelFile.Application.UsableWidth Der Name sagt es: die nutzbare Breite der Tabelle in Pixel, das ist wohl etwas weniger als die Gesamtbreite.
ObjExcelFile.WindowState = 1 Damit wird die Fenstergröße festgelegt (0 - normal; 1 - groß; 2 - minimiert). Natürlich kann man für die Ziffern auch erst Konstanten definieren.
ObjExcelFile.Screenupdating = False Die Bildschirmaktualisierung benötigt viel Zeit und führt während der Bearbeitung nur zum Flackern der Anzeige. Es ist deshalb sinnvoll, sie zu Beginn der Prozedur abzuschalten und am Ende mit TRUE wieder einzuschalten.
ObjExcelFile.DisplayAlerts = False Sicherheitabfragen werden abgeschaltet. Das betrifft vor allem speichern (Speichern unter...) und löschen (...Delete).
ObjExcelFile.ActiveWorkbook.SaveCopyAs "abc.xls" Damit wird ein Sicherheitskopie angelegt und gleichzeitig in der alten Datei weitergearbeitet. Auch die Funktionen .Save und .SaveAs arbeiten wie zu erwarten.
ObjExcelFile.ActiveWorkbook.Close 0 So wird die aktuelle Exceldatei geschlossen. Ist keine weitere Exceldatei geöffnet, wird auch Excel beendet. Die zusätzliche 0 unterdrückt die Dialogbox Speichern.
ObjExcelFile.Quit Schließen von Excel (2. Weg statt .Close - nur Quit beendet Excel zuverlässig).
Dim eXc as Object
Set eXc = ObjExcelFile.Worksheets("Statistik")
Das ist ein Unterobjekt für einen bestimmten Bereich - hier ein einzelnes Tabellenblatt. (Das bringt ähnliche Erleichterung wie die WITH-Anweisung.)

nach oben, zur Auswahl

gesamte Tabelle

Eine Datei kann natürlich mehrere Tabellen enthalten, beschränken wir uns aber erst mal auf eine.

Anzahl = ObjExcelFile.Worksheets.Count Die Anzahl der Tabellen im aktiven Dokument wird ermittelt.
ObjExcelFile.Worksheets.Add Eine neue Tabelle wird hinzugefügt. Sie erhält den Focus und ist somit gleichzeitig das ActiveSheet.
ObjExcelFile.Worksheets(1).Name = "Zusammenfassung" Die Tabellenbezeichnung wird festgelegt. Der Name muss eindeutig sein und darf nur eine maximale Länge von 30 Zeichen haben.
ObjExcelFile.ActiveSheet.Copy After:=ObjExcelFile.Worksheets(2) Es gibt viele weitere und komplizierte Verfahren. Hier wird die Tabelle1 kopiert und hinter Tabelle2 eingefügt.
ObjExcelFile.Worksheets("Statistik").Activate So wird eine andere Tabelle aktiviert. Sie kann dann als ActiveSheet aufgerufen werden.
eXc.Range("A1").Sort Key1:=eXc.Columns("D"),  Key2:=eXc.Columns("B"), Header:=1 Damit sortiert man eine Tabelle nach den Spalten D und B. Die Kopfzeile ist von der Sortierung ausgenommen. Die Definition von eXc wurde im Bereich Datei beschrieben.
ObjExcelFile.ActiveSheet.Delete Eine Tabelle wird wieder gelöscht (hier kann man mit ObjExcelFile.DisplayAlerts = False die Rückfrage abschalten).

nach oben, zur Auswahl

Bereich

Viele Anweisungen funktionieren nur in Verbindung mit einem Range. Die Festlegung mit Anfangs- und Endzelle ist auch ganz einfach - wenn da nicht die vielen Sonderfälle und Ausnahmen wären.

Eng verbunden mit dem Range ist auch die Selection - also ein (oder mehrere) markierter Zellbereich.

eXc.Range(eXc.Rows(3), eXc.Rows(8)).Group Ein Bereich von Zeilen wird gruppiert. Das RangeObjekt kann auch anders definiert werden, hier finden Anfangs- und Endzeile Verwendung.
eXc.Outline.SummaryRow = xlAbove Für die Gruppierungen wird die darüber liegende Zeile (mit Summen) als dazugehörig angesehen. Vor diese kommt das Gruppierungssymbol. Achtung: diese Zeile ist nicht mit gruppiert. (Als Standard wird der andere Fall - Summenzeile unter dem Bereich - angenommen.)
eXc.Outline.ShowLevels 1 Nur die erste Gliederungsebene ist sichtbar (also: gruppierte Elemente sind ausgeblendet). Je nach Gruppierungstiefe kann man mit 2 oder höher wieder alles einblenden.
eXc.Range("A1:A10").Item("A1").FillDown Autoausfüllen des Bereichs von A1 bis A10 mit dem Inhalt der Zelle A1. Die Schreibweise ist zwar schön kurz, aber leider statisch: Soll statt der Angabe "A1" eine Variable verwendet werden, hilft nur eine Schreibweise wie im nächsten Beispiel (.Cells(1,1)).
eXc.Range(eXc.Cells(2,3), eXc.Cells(5,8)).Activate
eXc.UsedRange.Select
Der mit Activate bestimmte Bereich kann als UsedRange angesprochen werden. Im Beispiel wird er markiert.
Worksheets("Tabelle1").Range("B2").WrapText = True In der Zelle B2 soll der Text umgebrochen werden - die Ausgabe erfolgt dann mehrzeilig.

Einer der Sonderfälle findet sich im Bereich Tabelle beim Sortieren eines ganzen Blattes: Dort wird mit Range("A1") die ganze Tabelle bezeichnet.

nach oben, zur Auswahl

Zeilen und Spalten

Der Rest der Beispiele behandelt Formatierungsbefehle. Ob diese über einen Bereich, eine Zeile/ Spalte oder nur für eine einzelne Zelle angewendet werden, ist dabei unwichtig.

ObjExcelFile.Worksheets(1).Columns("A").ColumnWidth = 10 Für die ganze Spalte "A" wird die Zellenbreite festgelegt (hier in Zeichen).
Gezeigt ist auch eine vollständige Adressierung für das 1. Tabellenblatt.
eXc.Rows(1).RowHeight = 20 Die Zeilenhöhe richtet sich automatisch nach der Schriftgröße. Um zusätzliche Abstände zu erreichen, kann sie aber auch separat festgelegt werden (hier in Pixel).
eXc.Rows(1).Interior.ColorIndex = 35 Interior beschreibt die Hintergrundfarbe - die Palette muss man testen - auch 24 und 34 kann man nehmen.
Das ist schön, um die Kopfzeile farbig hervorzuheben, mit Rows() spricht man gleich eine ganze Zeile an.
eXc.Rows(1).Interior.Color = RGB(200, 200, 0) Statt der Farbpalette erfolgt hier eine freie Farbdefinition - das Beispiel zeigt leichtes grün.
eXc.Rows(1).Font.ColorIndex = 3 Die Schrift lässt sich farbig gestalten. Für die Unterscheidung positiver von negativen Zahlen ist das ganz sinnvoll.

nach oben, zur Auswahl

Zellen

Zellen können auch Formeln enthalten. Selbstverständlich lassen sich auch diese per VBA bearbeiten. Wenn ich jedoch in VBA programmiere, dann hinterlege ich Formeln im Programmcode und nutze die Excel-Zellen nur für Ein- Ausgaben. Deshalb beschränken sich die Beispiele auf ordentliche Formatierung.

eXc.Cells(1,1).Value = "abc" Am wichtigsten ist das Schreiben von Werten oder Text in eine Zelle.
Statt der festen Zellennummern (1,1) können auch Zählervariablen verwendet werden.
eXc.Cells(1,1).NumberFormat = "@" Das Textformat wird für eine Zelle explizit festgelegt, so werden z.B. Zahlen links ausgerichtet. NumberFormat kann natürlich noch auf viele andere Werte gesetzt werden (allein Datumsformate sind ein endloses Thema).
ObjExcelFile.ActiveSheet.Cells(1,1).Font.Size = 14 Die Schrift wird auf 14 vergrößert (10 ist Standard).
Hier erfolgt die vollständige Adressierung über die aktive Tabelle.
eXc.ActiveCell.Font.Bold = True Die Zeichen der betreffenden Zelle werden fett dargestellt.
Gleichzeitig ist das ein Beispiel zum Bearbeiten einer markierten Zelle.
eXc.Cells(1,1).Font.Underline = True Den Zelleninhalt unterstreichen.
eXc.Cells(1,1).HorizontalAlignment = xlRight Der Zelleninhalt wird rechts ausgerichtet (z.B. für Aufzählungen, die auch Buchstaben enthalten).
ObjExcelFile.ActiveSheet.Cells(1,1).Select Legt den Focus auf die gewählte Zelle.
Zeile = 9
eXc.Cells(1,1).FormulaR1C1 = "=R" & Zeile & "C5"
Statt einem Wert erhält diese Zelle einen Zellbezug.
Schön, dass man diesen auch aus Variablen zusammensetzen kann, hier zu "=R9C5".

Vorsicht beim korrekten Zusammenfügen der Programmzeilen! Diese Seite skaliert sich auf Deine Bildschirmbreite und kann so zu Zeilenumbrüchen führen, die eine zusammenhängende Programmzeile auseinanderreißen. Bei Unstimmigkeiten genügt es, im Browser die Schrift soweit zu verkleinern, bis es keine ungewollten Zeilenschaltungen mehr gibt.

VB Startseite nach oben, zur Auswahl