4.3. Makros mit Bezug auf Diagramme

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:

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:


Abbildung 4-4. Das Dialogfeld des Beispiels