Auch Diagramme kann man mit Makros herstellen. Im folgenden wird das Beispiel des Kondensators noch einmal aufgegriffen. Wir werden nun eine Tabelle und ein Diagramm für einen solchen Kondensator automatisch herstellen.
Am Anfang werden die Parameter noch direkt in den Quelltext des Makros geschrieben. Das wird im nächsten Schritt noch verbessert. Der Kondensator wird mit drei Parametern berechnet:
die Spannung U in [V]
der Widerstand R in [Ohm],
die Kapazität C in [F]
Diese Werte werden für die Berechnung zunächst als Konstanten gesetzt und später im Dialog eingegeben.
Beispiel 4-4. Globale Variablendeklarationen und Hauptprogramm
' Globale Variablendeklarationen: Public Blattname As String Public Kapazitaet As Double Public Spannung As Double Public Widerstand As Double Public Berechnung_fertig As Boolean Public Eingabe_fertig As Boolean ' Diese Variablen stehen allen Unterprogrammen zur ' Verfuegung. ' Hauptprogramm: Private Sub Berechnung_Click() Blattname = TextBox_Blattname.Value ' Prüfen, ob der Blattname schon vorhanden ist! ' Dazu geht man durch die gesamte Sammlung der ' WorkSheets durch und vergleicht den Namen jedes ' WorkSheets mit dem gewünschten Namen. For i = 1 To Worksheets.Count If Worksheets(i).Name = Blattname Then MsgBox "Blattname ist vorhanden" Blattname = "" Exit For End If Next i If Eingabe_fertig = False Then MsgBox "In einem der Textfelder ist ein Fehler enthalten." End If If Blattname <> "" And Eingabe_fertig = True Then Call init_table(Blattname) Kapazitaet = TextBox_C.Value Spannung = TextBox_U.Value Widerstand = TextBox_R.Value Call Berechnung Berechnung_fertig = True Else Berechnung_fertig = False End If End Sub
Im ersten Schritt soll nach einem bestehenden Muster das neue Blatt erstellt werden. Das übernimmt die Funktion init_table(Blattname) Dazu ist aber eine Eingabekontrolle des Blattnamens erforderlich (das ist im obigen Beispiel die Schleife über alle Blattnamen).
Diese Eingabekontrolle wird im folgenden Schritt noch etwas verbessert, nachdem sich in den ersten Tests ein Fehler herausgestellt hat. Für Windows ist der Blattname "Test" gleich dem Blattnamen "test", obwohl beide Zeichenketten in VBA ungleich sind. Excel gibt erst eine Fehlermeldung aus, wenn man versucht, das Blatt entsprechend umzubenennen. Um das zu vermeiden, kann man folgende Verbesserung einführen:
Beispiel 4-5. Verbesserte Eingabekontrolle des Blattnamens
' Die Funktion LCase wandelt alle großen Buchstaben einer ' Zeichenkette in Kleinbuchstaben um. For i = 1 To Worksheets.Count If LCase(Worksheets(i).Name) = LCase(Blattname) Then MsgBox "Blattname ist vorhanden" Blattname = "" Exit For End If Next i
Damit ist nun die Möglichkeit eines doppelt auftretenden Tabellennamens ausgeschlossen. Es ist natuerlich ebenfalls noch eine Kontrolle der Eingabewerte notwendig. Diese wird hier etwas einfacher gestaltet, sie sollte in der Praxis auf jeden Fall ernst genommen werden. Eine ganz einfache Eingabekontrolle für die drei Textfelder kann wie folgt aussehen:
Beispiel 4-6. Vereinfachte Eingabekontrolle der gegebenen Werte
Private Sub TextBox_C_Change() Call num_check End Sub Private Sub TextBox_R_Change() Call num_check End Sub Private Sub TextBox_U_Change() Call num_check End Sub Private Sub num_check() If (IsNumeric(TextBox_C.Value)) And _ (IsNumeric(TextBox_R.Value)) And _ (IsNumeric(TextBox_R.Value)) Then Eingabe_fertig = True Else Eingabe_fertig = False End If End Sub
Die Funktion init_table(Blattname) tut eigentlich nichts anderes, als das Musterblatt zu kopieren und umzubenennen.
Beispiel 4-7. Initialisierung des neuen Tabellenblatts
Function init_table(Blattname) Worksheets("Muster").Copy after:=Worksheets("Muster") ActiveSheet.Name = Blattname End Function
Es folgen die Berechnungen. Die Ergebnisse werden immer in den Tabellenbereich ab D15 eingetragen.
Beispiel 4-8. Durchführung der Berechnungen
Sub Berechnung() For i = 0 To 20 Range("D" & CStr(i + 15)) = _ Uc(Kapazitaet, Spannung, Widerstand, (i / 2)) Next i End Sub Function Uc(C, U, R, t As Double) As Double Uc = U * (1 - Exp(-1 * (t / (R * C)))) End Function
Schließlich wird hier noch das Dialogfeld zur Eingabe und zum Veranlassen der Berechnungen beschrieben: