Inhaltsverzeichnis         

© Martin Korneffel, Stuttgart 2013 +++ email: Martin.Korneffel@t-online.de +++ web: www.mkoit.de

3 EXCEL – VBA

3.1 Objektmanipulationen in Macros aufzeichnen und wiederholen

Ein Macro (engl. "Zusammenfassung von Befehlen") ist eine Liste von Instruktionen, die Excel- Objekte wie Zellen und Grafiken manipulieren. Macros dienen der Rationalisierung durch Automation sich häufig wiederholender Arbeitsschrittfolgen.

3.1.1.1 Marcos aktivieren

Um die Verbreitung von Schadsoftware (Viren, Würmer, Trojaner) zu vermeiden, die sich auch trefflich mit VBA- Programmieren lassen, ist die Ausführung von Macros im Grundmodus deaktiviert. Detailtiere Informationen dazu hier.




3.1.1.2 Macros mit Macrorecorder aufzeichnen

Um Excel- VBA zu erforschen, kann der Macrorecorder genutzt werden. Er erzeugt aus einer Reihe von Benutzerinteraktionen reinrassigen VBA- Code.Der Macrorecorder ist erreichbar unter Extras/Macros/Macrorecorder.

3.1.1.3 Beispiele

Objekt

Aufgabe

Macro

Zelle

Schriftfont formatieren

Sub ZelleFormatierenMakro()
' Tastenkombination: Strg+Umschalt+R
'
    With Selection.Font
        .Name = "Arial"
        .FontStyle = "Fett"
        .Size = 10
        .Strikethrough = False
        .Superscript = False
        .Subscript = False
        .OutlineFont = False
        .Shadow = False
        .Underline = xlUnderlineStyleNone
        .ColorIndex = xlAutomatic
    End With
End Sub


Formatieren eines Zellenpaar als etikettiertes Ergebnis, z.B.

Saldo 100,00 €

Erste Zelle mit fetter Schrift, Zelle links davon mit Währungsformat, doppelter Unterstreichung

Sub ErgebnisFormatierenMakro()
' Tastenkombination: Strg+Umschalt+R
'
    With Selection.Font
        .Name = "Arial"
        .FontStyle = "Fett"
        .Size = 10
        .Strikethrough = False
        .Superscript = False
        .Subscript = False
        .OutlineFont = False
        .Shadow = False
        .Underline = xlUnderlineStyleNone
        .ColorIndex = xlAutomatic
    End With
    ActiveCell.Offset(0, 1).Range("A1").Select
    Selection.NumberFormat = "#,##0.00 $"
    With Selection.Font
        .Name = "Arial"
        .FontStyle = "Standard"
        .Size = 10
        .Strikethrough = False
        .Superscript = False
        .Subscript = False
        .OutlineFont = False
        .Shadow = False
        .Underline = xlUnderlineStyleDouble
        .ColorIndex = xlAutomatic
    End With    
End Sub

Diagramm

Tortendiagramm für eine Datenreihe erstellen

Sub TorteMakro()
' Tastenkombination: Strg+a
'
    Charts.Add
    ActiveChart.ChartType = xlPie
    ActiveChart.SetSourceData Source:=Sheets("Kopie (1) von FileTypeStatistic"). _
        Range("A2:B33"), PlotBy:=xlColumns
    ActiveChart.Location Where:=xlLocationAsObject, Name:= _
        "PieFileTypeStatistic"
End Sub

3.1.1.4 Aufbau eines Makros

In Excel wird ein Makro durch eine Prozedur in VBA realisiert. Eine Prozedur ist ein Block, der eine Liste von VBA- Anweisungen enthält. Eine Prozedur hat einen Namen und kann über diesen Namen zur Ausführung gebracht werden.

Sub Macrobname                                   <- Hier startet der Prozedurblock
  ' Ein Kommentar                                <- Kommentare dienen dem Entwickler als Speichern von Hilfeinformationen für das Verständnis
  <Eine Liste von VBA- Anweisungen>              <- Durch die Anweisungen werden Excel- Objekte gesteuert
End Sub                                          <- Hier endet der Prozedurblock

3.2 Objektmodell von Excel

3.2.1 Objektmodell der Excel- Anwendung

  Application                              <=> Excel- Anwendung
   |
   +-> OrganizationName                  <=> Name der Firma, für das das Produkt lizensiert wurde
   |
   +-> UserName                          <=> Name des Benutzers, der Excel ausführt
   |
   +-> OperatingSystem                   <=> Betriebssystemversion, unter dem die Anwendung läuft
   |
   +-> ActivePrinter                     <=> Name des aktuell eingestellten Standarddruckers 
   |
   +-> Selection                         <=> Referenz auf selektierten Bereich
   |
   +-> ActiveCell                        <=> Referenz auf aktive Zelle
   |
   +-> ActiveChart                       <=> Referenz auf aktives Diagramm
   | 
   +-> ActiveSheet                       <=> Referenz auf aktives Tabellenblatt
   |
   +-> ActiveWindow                      <=> Referenz auf aktives Fenster
   |
   +-> ActiveWorkbook                    <=> Datei, die IO- aktiv ist
   | 
   +-> ThisWorkbook                      <=> Datei, die momentan
   |                                         ausgeführtes Macro enthält
   |
   +-> ScreenUpdating                    <=> TRUE, dann werden alle Änderungen an Zellen
   |                                               sofort angezeigt
   |                                         FALSE, die Änderungen werden nicht angezeigt
   +-> M: GetOpenFilename([Filter], ...) <=> Zeigt einen "Datei öffnen" Dialog an, 
   |                                         und gibt den Name der zu öffnenden Datei zurück
   |
   +-> M: GetSaveAsFilename(...)         <=> Zeigt einen "Datei speichern unter..." Dialog an,
   |                                         und gibt den Namen der Datei zurück, in die gesichert
   |                                         werden soll.
   |
   +-> M: Intersect(A as Range, B as Range) <=> Bildet die Schnittmenge zwischen zwei Zellbereichen.
   |                                         Kann verwendet werden, um zu prüfen, ob eine
   |                                         betrachtete Zelle in einem definierten Bereich von
   |                                         Zellen enthalten ist.
   |
   +-> C: Workbooks                      <=> Aufzählung aller geladenener
          |                                  Excel- Dateien. 
          |                                  Zugriff über: Workbooks(Nr) oder
          |                                                Workbooks(„Dateiname“)
          |                                  liefert die Referenz auf ein 
          |                                  Workbook- Objekt.
          |
          +-> M: Add                     <=> neue, leere Arbeitsmappe anlegen
          |
          +-> count                      <=> Anzahl der aktuell geladenen Arbeitsmappen
          |
          +-> M: open „Dateiname“        <=> Vorhandene Excel-Datei laden
          |
          +-> M: Close                   <=> schließen einer Excel- Datei

3.2.2 Objektmodell einer Arbeitmappe (Excel- Datei)

  Workbook                                 <=> Arbeitsmappe, entspricht einer 
   |                                         Excel- Datei
   |
   +-> M: Activate                       <=> Datei zur IO- aktiven machen           
   |   
   +-> M: Save                           <=> Arbeitsmappe sichern
   |
   +-> Path                              <=> Verzeichnis, in dem die Arbeitsmappe gepeichert ist
   |
   +-> C: Sheets                         <=> Aufzählung aller Arbeitsblätter der 
          |                                  Arbeitsmappe
          |                                  Zugriff über: Sheets(Nr) oder
          |                                                Sheets(„Name“)
          |                                  Ein Sheet kann ein Tabellenblatt, ein 
          |                                  Diagramm oder ein Dialog sein.
          |
          +-> M: Add                     <=> neue, leere Arbeitsmappe anlegen
          |
          +-> count                      <=> Anzahl der aktuell geladenen Arbeitsmappen
          |       
          +-> M: Close                   <=> schließen einer Excel- Datei   

3.2.3 Objektmodell einer Excel- Tabelle

Achtung: Ein Range- Objekt kann an selbstdefinierte Funktionen übergeben werden. Jedoch darf es in diesen nicht verändert werden (endet mit einer kryptischen Fehlermeldung) !



  Worksheet                                <=> Excel- Tabelle
   |
   +-> M: Activate                       <=> Tabelle zur IO- aktiven machen 
   |
   +-> ChartObjects                      <=> Aufzählung aller Diagrammobjekte in einem Arbeitsblatt
   |     |
   |     +->>ChartObject          
   |
   +-> M: Cells(line, Col)               <=> Zugriffsfunktion auf Tabellenzellen.
   |                                         Zugriff erfolgt über Zeilen und 
   |                                         Spaltenindizes z.B. Cells(1, 2)
   |                                         liefert Zugriff auf Zelle B2
   |
   +-> Range                             <=> Afzählung aller Tabellenzellen.
        |                                    Zugriff erfolgt über A1- Adressen
        |                                    z.B. Range(„B2:C4“) liefert Aufzählung
        |                                    aller Zellen aus dem Bereich B2:C4,
        |                                    Range("A1") liefert die Zelle A1
        |
        +-> Interior                     <=> Hintergrundfarbe und -Muster einer Zelle
        |
        +-> Borders                      <=> Aufzählung aller Umrandungslinien eines Zellbereiches
        |      |
        |      +-> Line
        |           |
        |           +-> LineStyle        <=> Linienstil einer Umrandungslinie
        |
        +-> Value                        <=> Wert der Zelle
        | 
        +-> Formula                      <=> In Zelle gespeicherte Formel
        |
        +-> FormulaLocal                 <=> In Zelle gespeicherte Formel in der 
        |                                    Landessprache
        |
        +-> HasFormula                   <=> True, wenn Zelle eine Formel enthält
        |
        +-> Font                         <=> Von der Zelle verwendete Schriftart
        |     |
        |     +-> Name                   <=> Name des Schriftfonts
        |     |
        |     +-> FontStyle              <=> Schriftschnitt (z.B. Bold )
        |
        +-> NumberFormat                 <=> Nummerische Formatierung des Zelleninhaltes. Zulässige 
        |                                    Werte sind Zeichenketten wie im Dialog Zellen Formatieren

3.2.4 Objektmodell eines Diagramms

3.2.4.1 Zugriff auf das aktivierte Diagramm

Das aktivierte Diagramm ist über die Eigenschaft Applicatio.ActiveSheet erreichbar.

3.2.4.2 Deaktivieren eines Diagramms

Die Deaktivierung eines Diagramms erfolgt über die Eigenschaft Application.ActiveWindow.Visble = False. Die Ursache dafür besteht darin, dass ein Diagramm als OLE- Objekt behandelt wird.

  C: Charts                               <=> Aufzählung aller Diagramme
   |
   +-> Chart                            <=> Diagramm
        |
        +-> ChartArea                   <=> Hintergrund des gesamten Diagrammes
        |
        +-> PlotArea                    <=> Hintergrund des Zeichnungsbereiches
        |
        +-> Foor                        <=> Boden eines 3D Diagramms
        |
        +-> Walls                       <=> Seitenwände eines 3D Diagramms
        |
        +-> Corners                     <=> Ecken eines 3D Diagramms
        |
        +-> ChartTitle                  <=> Titel
        |
        +-> Legend                      <=> Beschriftung der Datenreihe
        |
        +-> Axes                        <=> Diagrammachsen
        |    |
        |    +->> Axis
        |          |
        |          +-> TickLabels       <=> Markierungen von Achspunkten
        |          |
        |          +-> Gridlines        <=> Orientierungslinien
        |
        +-> SeriesCollection            <=> Datenreihen
             |
             +-> Series
                  |
                  +-> Points            <=> Datenpunkte
                  |     |
                  |     +->> Point
                  |
                  +-> Trendlines        <=> Trend und Ausgleichslinien
                        |
                        +->> Trendlinie