23.3 Ein- und Ausgabe
Ein zentraler Bereich der Programmierung ist die Gestaltung der Interaktion zwischen einem Programm und denen, die es benutzen. Diese Interaktion findet auf zwei Ebenen statt. Zum einen gibt es den direkten Dialog Programm – Benutzer, bei dem der Benutzer Werte eingibt oder Ereignisse (z. B. Mausklicks) verursacht, auf die das Programm reagiert. Zum anderen kann das Programm dazu veranlasst werden, aus Tabellen zu lesen und in Tabellen zu schreiben.
23.3.1 Einfacher Eingabedialog
Die einfachste Form, in einem Programm Benutzereingaben vorzunehmen, ist das Eingabedialogfeld. Hier handelt es sich um ein Standarddialogfeld, das von VBA mit der Funktion InputBox aufgerufen werden kann. Das ausgabeseitige Äquivalent zum Eingabedialog ist der Meldungsdialog. Dafür wird die Funktion MsgBox genutzt.
Für Programme, die nur wenig Eingabe erfordern, ist das Eingabedialogfeld sehr praktisch; bei komplexeren Eingaben sollten dagegen die weiter unten besprochenen Formulare verwendet werden. Das Dialogfeld ist schon mit den Schaltflächen OK und Abbrechen ausgestattet. Wird OK angeklickt, liefert das Dialogfeld die Eingabe als Ergebnis an eine Variable.
In der einfachsten Version kommt die Funktion InputBox mit einem einzigen Argument aus, etwa
InputBox("Betrag")
Durch zusätzliche Argumente kann die Gestaltung des Dialogfeldes modifiziert werden: eine Eingabeaufforderung, ein eigener Fenstertitel, eine Vorgabe, die verwendet wird, wenn nichts eingetragen wird.
Beispiel für ein gestaltetes Eingabefenster ...
... und sein Aufruf
Das Wesentliche am Eingabefenster ist natürlich die Übernahme des eingegebenen Wertes in eine Variable. Dass als Eingabe nur Text akzeptiert wird, ist zwar etwas unglücklich, stellt aber keine unüberwindbare Hürde dar: Mit den Umwandlungsfunktionen von VBA lässt sich die Eingabe in den entsprechenden Datentyp konvertieren. CInt verwandelt z. B. die Zeichenkette in eine ganze Zahl.
Konvertierung von Datentypen bei der Eingabe
Soll der Datentyp dagegen schon bei der Eingabe kontrolliert werden, kann statt der InputBox-Funktion die InputBox-Methode verwendet werden; das Objekt dabei ist Excel selbst als Application. Neben den Argumenten, die auch bei der InputBox-Funktion möglich sind, können hier noch weitere Festlegungen getroffen werden, insbesondere der Ort (die linke obere Ecke), an dem das Fenster erscheinen soll.
Beim Rückübersetzen Maßeinheit beachten |
Beachten Sie, dass die Position des Dialogfeldes seit der Version 97 in der Einheit Twips festgelegt wird und nicht mehr in Punktwerten. Twips sind ein 24stel Punkt. Wenn Sie beispielsweise für die x/y-Koordinaten Werte in der Größenordnung 2000, 2000 verwenden und eine solche Arbeitsmappe in das Format von Excel 95 zurückübersetzen, stürzt Excel 95 beim Ausführen des Makros ab, weil versucht wird, eine Bildschirmposition zu erreichen, die nicht möglich ist. Excel 95 versteht nämlich den Wert 2000 als Punktangabe. |
Auch der Bezug auf eine Hilfedatei lässt sich einbauen. Insbesondere aber kann ein bestimmter Datentyp für die Eingabe festgelegt werden. Zum Beispiel verlangt Type:= 1 eine Zahl, 2 einen Text und 8 einen Zellbezug. Sie können auch Kombinationen verwenden.
Zahlodertext = Application.InputBox(Prompt:= "Geben Sie Zahlen _ oder Text ein:",Type:=3)
Type:= 3, Summe aus 1 + 2 erlaubt also in diesem Fall die Eingabe von Zahlen oder Texten.
23.3.2 Meldungsdialoge
Das Gegenstück zum Eingabedialog ist, wie schon erwähnt, der Meldungsdialog. Den Text, der ausgegeben werden soll, können Sie entweder direkt als Zeichenfolge in Anführungszeichen angeben oder als Variable.
Meldungstext als Zeichenfolge oder Variable
Nur auf den ersten Blick ist das Meldungsfenster ein reines Ausgabemedium. Durch zusätzliche Argumente lässt es sich so gestalten, dass die Reaktion des Benutzers im weiteren Verlauf des Programms berücksichtigt werden kann, wobei sich die Benutzerreaktion allerdings auf das Anklicken von Schaltflächen beschränkt. Um auszuwählen, mit welchen Schaltflächen das Meldungsfenster zu versehen ist, wird gleich nach dem Meldungstext als Argument eine Kennziffer eingefügt: 0 (OK); 1 (OK und Abbrechen); 2 (Abbrechen, Wiederholen und Ignorieren); 3 (Ja, Nein und Abbrechen); 4 (Ja und Nein); 5 (Wiederholen und Abbrechen).
Zu den Ziffern für die Schaltflächen können noch Kennziffern für eingeblendete Symbole addiert werden: 16 (Stopp); 32 (?); 48 (!); 64 (i für Info). Die Kennziffer 68 etwa liefert ein Meldungsfenster mit einem Info-Symbol und den Schaltflächen Ja und Nein.
Abhängig davon, welche Schaltfläche der Benutzer anklickt, wird ein Wert zurückgegeben, der in eine Variable übernommen werden kann. Abhängig von diesem Wert kann der weitere Programmablauf gesteuert werden. Als Rückgabewerte kommen in Frage: 1 (OK); 2 (Abbrechen); 3 (Abbruch); 4 (Wiederholen); 5 (Ignorieren); 6 (Ja); 7 (Nein). Wie schon für die Methoden beschrieben, gibt es auch bei den Funktionen zwei Schreibweisen:
meldung = MsgBox(ausdruck) MsgBox ausdruck
Soll eine einfache Meldung ausgegeben werden, genügt die zweite Schreibweise. Soll aber das Ergebnis des Meldungsdialogs (welche Schaltfläche wurde angeklickt) in eine Variable übernommen werden, muss die erste Form verwendet werden.
Kleines Testprogramm für Schaltflächen in Meldungen
Mit einem kleinen Programm lassen sich diese Zusammenhänge einfach testen: Im ersten Dialog wird zunächst die Kennziffer für die Art des Meldungsdialogs eingegeben. Das Programm zeigt in einem zweiten Meldungsfenster den Code derjenigen Schaltfläche an, die im ersten Meldungsdialog angeklickt wurde.
23.3.3 Bereiche in Tabellen auswählen
Bei der Arbeit mit VBA innerhalb von Excel ist natürlich der zentrale Punkt der Programmierung die Arbeit mit Tabellen: das Auswählen von Zellen oder Bereichen, das Lesen von Daten aus diesen Bereichen und das Schreiben von Daten in diese Bereiche. Ein Programm in VBA kann vieles eleganter lösen, als es bei der manuellen Arbeit in der Tabelle möglich ist: Zum Beispiel kann es in einer Tabelle lesen, ohne dass der zu lesende Teil auf dem Bildschirm sichtbar wird, und es kann in Zellen schreiben, ohne diese vorher auszuwählen.
Wenn eine Prozedur, in der Zellen oder Bereiche ausgewählt werden sollen, direkt von einer Tabelle aus gestartet wird, lässt sich die Methode Select direkt anwenden, ohne dass das Objekt (die Tabelle) weiter spezifiziert wird:
Auswahl von Zellen der aktiven Tabelle
Mit der Eigenschaft Formula wird in die aktivierte Zelle jeweils eine Formel eingetragen, wobei bei der Auswahl eines ganzen Bereichs die linke obere Zelle die aktive Zelle ist.
Ist die Tabelle, in der ein Bereich ausgewählt (oder gelesen oder beschrieben) werden soll, gerade nicht aktiv, muss zunächst das Tabellenblatt ausgewählt werden, bevor der Bereich bestimmt werden kann. Diese Methode empfiehlt sich auch dann, wenn vom Programmablauf her nicht eindeutig sichergestellt ist, dass das richtige Tabellenblatt zum richtigen Zeitpunkt aktiv ist.
Auswahl Tabellenblatt und Bereich
In diesem Beispiel wird den Zellen keine Formel zugewiesen, sondern ein Wert. Dies geschieht mit Hilfe der Value-Eigenschaft. In der kleinen Prozedur wird außerdem noch eine andere Methode der Auswahl vorgeführt: Die Cells-Methode bezieht sich direkt auf Zellen und gestattet die Auswahl nach Zeilen und Spalten. Diese Möglichkeit ist der Auswahl nach Zelladressen in vielen Fällen vorzuziehen, da sie es gestattet, von den leicht abzufragenden Zeilen- und Spaltennummern einer Zelle auszugehen und dann die Adressen weiterer Zellen im Programm zu berechnen.
Zellauswahl mit Hilfe von Variablen
Im ersten Beispiel in der folgenden Abbildung wird zunächst in die aktive Zelle start geschrieben. Dann werden Zeilen- und Spaltennummern der aktiven Zelle abgefragt und aus diesen Werten neue Zeilen- und Spaltennummern errechnet, die für die nächste Auswahl verwendet werden können.
Auswahl nach Zeilen und Spalten
Das zweite Beispiel zeigt, dass diese Adressierungsart auch für die Auswahl von Bereichen geeignet ist, die sich über mehrere Zellen erstrecken. So lassen sich bequem Bezüge herstellen, bei denen Zeilen- und Spaltennummern anderweitig ermittelt wurden. Diese Methode muss aber nicht als Ersatz für die Auswahl von Zellen oder Bereichen relativ zur aktiven Zelle benutzt werden. Hierfür gibt es in VBA eigene Möglichkeiten mit Hilfe der Offset-Eigenschaft:
Relative Bereichswahl
Im ersten Beispiel (auswahl4) wird die Auswahl um eine angebbare Zahl von Zeilen und Spalten versetzt, und von da aus ein Bereich ausgewählt. Die Bereichsbezeichnung »A1:A5« ist etwas verwirrend, da im Beispiel ja der Bereich »D2:D6« ausgewählt wird. Tatsächlich wird die nach dem Versetzen des Bereichs aktive Zelle als Ausgangspunkt genommen und vom Programm so behandelt, als wäre sie die Zelle »A1«. Nur in diesem Sinne kann vom Bereich »A1:A5« die Rede sein. Durchschaubarer ist die Reihenfolge im zweiten Beispiel (auswahl5).
Ermitteln von Zellverweisen
Oben wurde schon darauf hingewiesen, dass die Zeilennummern und Spaltenbezeichnungen einer aktiven Zelle ermittelt werden können, um für die Verarbeitung im Programm zur Verfügung zu stehen. Z. B. mit
zeile = Selection.Row spalte = Selection.Column
Ähnliches gilt auch für ausgewählte Bereiche. Auf diese Weise lassen sich Verweise ermitteln, die ihrerseits wieder in allen Befehlen, für die »A1«- Verweise verwendet werden, zum Einsatz kommen können.
23.3.4 Schreiben in Tabellen
Im Unterschied zur manuellen Arbeit ist es in einem Programm nicht zwingend, eine Zelle, in die etwas geschrieben werden soll, vorher zur aktiven Zelle zu machen. VBA gestattet es, sowohl mit absoluten als auch mit relativen Bezügen direkt in Zellen zu schreiben.
Schreiben absolut und relativ
Zum Vergleich ist im ersten Beispiel noch einmal die Methode wiederholt worden, zunächst eine Zelle auszuwählen und dann in die aktive Zelle zu schreiben. Die beiden anschließenden Schreibvorgänge geschehen direkt, also ohne dass die Zellen vorher ausgewählt würden. Während das erste Beispiel feste Adressen für die Zellen verwendet, arbeitet das zweite Beispiel mit relativen Bezügen. Zunächst wird in die aktive Zelle geschrieben, dann wird relativ zu dieser Zelle (im Beispiel eine Zeile tiefer, 0 Spalten nach rechts) der nächste Eintrag vorgenommen.
Oben wurde schon die bequeme Methode der Zellauswahl über die Zeilen- und Spaltennummer beschrieben. Diese Methode lässt sich auch beim Schreiben in Zellen verwenden:
Schreiben in mehrere Zellen
In diesem Beispiel werden zwei ineinander verschachtelte For-Next-Schleifen dazu benutzt, die Zeilen- und Spaltennummern bestimmte Werte durchlaufen zu lassen und in die jeweiligen Zellen diese Nummern einzutragen.
Eintragen von Formeln
Wenn es darum geht, Formeln in Zellen einzutragen, können Sie statt der Eigenschaft Formula auch die Eigenschaft FormulaR1C1 verwenden. Der Unterschied soll hier an einem kleinen Beispiel demonstriert werden.
Schreiben von Formeln in ein Tabellenblatt
In der ersten Zeile kann die Formel für die Zelle in der so genannten R1C1-Schreibweise eingegeben werden, in der zweiten Zeile muss die »A1«-Schreibweise verwendet werden. In beiden Fällen wird im Tabellenblatt die korrekte Formel für das Produkt der beiden vorangehenden Spalten (B und C) in die Spalte D eingetragen. Die R1C1-Schreibweise mag dabei zunächst etwas ungewohnt erscheinen, hat aber den großen Vorteil, dass sich relative Bezüge hier sehr einfach und klar gestalten lassen. Hier bedeutet beispielsweise:
R1C1 | die Zelle A1 (1. Zeile, 1.Spalte) |
RC(1) | eine Spalte weiter |
RC(-1) | eine Spalte vorher |
R(1)C(1) | eine Zeile tiefer, eine Spalte rechts |
23.3.5 Daten aus Tabellen auslesen
Auch das Lesen von Zellinhalten aus einem Tabellenblatt in eine Variable bedient sich ganz ähnlicher Verweisformen wie das Auswählen und Schreiben. In allen folgenden Beispielen werden Zellinhalte in eine Variable zellentext übernommen und stehen dann dem Programm zur Verfügung. In den Beispielen werden die übernommenen Inhalte lediglich in eine weitere Zelle geschrieben.
Lesen von Zellinhalten
Bei diesen Beispielen werden immer die Werte der Zellen übernommen, unabhängig davon, wie sie im Tabellenblatt zustande gekommen sind. Anders verhält es sich, wenn Sie nicht die Werte, sondern die Formeln übernehmen wollen, die in Zellen eingetragen sind.
Lesen von Inhalten und Formeln
Im obigen Beispiel werden der Zelleninhalt und die Formeln gelesen, letztere in beiden Schreibweisen, und nacheinander in Meldungsfenstern ausgegeben. Beim Lesen des Inhalts in der ersten Zeile ist diesmal nicht die Eigenschaft Value, sondern die Eigenschaft Text verwendet worden. Das ist auch dann möglich, wenn in der Zelle ein numerischer Wert steht.
Dass VBA natürlich Zahlen auch direkt als Zahlen lesen kann, zeigt Ihnen das letzte Beispiel: Hier erfolgt eine Fehlermeldung, wenn in der angesprochenen Zelle keine Ganzzahl oder eine Formel, die eine Ganzzahl ergibt, steht.
Die Flexibilität, mit der VBA die Datentypen handhabt, lässt sich an einem kleinen Beispiel demonstrieren, bei dem die Eigenschaften Value, Text und Formula in Variablen gelesen (aus den Zellen A1 bis A4) und dann über diese Variable die Eigenschaften für die Zellen B1 bis B4 festgelegt werden. Die Texteigenschaft kann hierbei nur zum Lesen verwendet werden. Wird der mit der Texteigenschaft ermittelte Wert wieder in eine Zelle übertragen, ist der Zellinhalt eine Zeichenfolge, d. h., eine Zahl wird in eine Zeichenfolge umgewandelt.
Lesen und Setzen von Eigenschaften
Ihre Meinung
Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.