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: