Warum noch ein Access-Buch?
Für wen ist das Buch?
Jetzt bestellen
+ direkter Download des eBooks!
Nur EUR 59,95!
Fehler gefunden?
Bitte melden!
Wünsche an das Buch?
Her damit!
Was denken die Leser über dieses Buch?
Lesen Sie aktuelle Rezensionen!
Kapitel des noch nicht veröffentlichten Buchs zum Downloaden, Probelesen und Kommentieren
Beispieldatenbanken
Zusätzliches Material

Das Buch im HTML-Format

Für unbestimmte Zeit bieten Addison-Wesley und André Minhorst den kompletten Inhalt des Buchs als Download an. Schauen Sie rein und informieren Sie sich über den Inhalt! Und wenn Ihnen das Buch nützlich erscheint und Sie glauben, dass Sie etwas gelernt haben oder durch das Gelesene sogar etwas Zeit und somit Geld bei Ihrer Arbeit einsparen konnten, können Sie sich ja beim Autor und beim Verlag revanchieren - beispielsweise durch den Kauf dieses Buchs.

Am schönsten wäre es natürlich, wenn Sie das Buch direkt hier bestellen - Sie erhalten das Buch dann direkt vom Verlag, und der Autor und Verlag haben dann noch mehr davon, als wenn Sie es anderswo kaufen.

Danke für Ihr Interesse!

15.2 Objekte

15.2.1 Eingebaute Objekte

Im Urzustand enthält eine Access 2007-Datenbank Verweise auf mindestens drei Bibliotheken, die einige für die Programmierung benötigte Objekte zur Verfügung stellen:

  • Visual Basic for Applications
  • Microsoft Access 12.0 Object Library
  • OLE Automation
  • Microsoft Office 12.0 Access database engine Object Library
  • Die Methoden, Eigenschaften und Ereignisse dieser Objekte stehen jederzeit zur Verfügung, ihre Verwendung erfolgt ohne vorheriges Instanzieren. Zum größten Teil greift man vermutlich auf diese Objekte zu, ohne dass man sich im Klaren darüber ist, dass es sich auch bei den herkömmlichen Methoden und Eigenschaften um Teile eines Objekts handelt. Ein Beispiel verdeutlicht dies. Mit der folgenden Anweisung können Sie beispielsweise den aktuellen Datenbankbenutzer herausfinden:

    Debug.Print CurrentUser

    Der folgende Aufruf belegt, dass diese Eigenschaft zur Microsoft Access x.y Object Library gehört:

    Debug.Print Access.CurrentUser

    beziehungsweise

    Debug.Print Access.Application.CurrentUser

    Letztere Version ist eigentlich korrekter: Access.CurrentUser ist nur möglich, weil Application als GlobalMultiUse-Objekt von Access quasi die Standardeigenschaft von Access ist und daher nicht ausgeschrieben werden muss.

    MultiUse-Klassen und GlobalMultiUse-Klassen

    Vielleicht haben Sie schon einmal festgestellt, dass man manche Objekte unter VBA ohne Weiteres verwenden kann, während man andere erst instanzieren muss. Der Grund ist, dass es tatsächlich unterschiedliche Arten von zugrunde liegenden Klassen gibt: Die so genannten GlobalMultiUse-Klassen brauchen Sie nicht zu instanzieren - dies geschieht im Hintergrund automatisch, sobald Sie eine Methode oder Eigenschaft der Klasse aufrufen. Die Eigenschaften und Methoden dieser Klassen stehen ohne Ihr Zutun global zur Verfügung. Beispiele sind DBEngine, DoCmd oder Application. Es gibt auch eine Menge GlobalMultiUse-Klassen, die Sie niemals bemerken - so sind beispielsweise alle Datums- und Zeitfunktionen Methoden der Klasse Datetime. Wenn Sie neugierig geworden sind, zu welcher Klasse die eine oder andere Eigenschaft oder Methode gehört, zeigen Sie einfach den Objektkatalog an und geben als Suchbegriff den gewünschten Ausdruck ein. Beispiele für Klassen, die Sie zunächst instanzieren müssen, sind Ihnen vermutlich ausreichend geläufig - Database und Recordset etwa dürften Ihnen schon das eine oder andere Mal über den Weg gelaufen sein.

    Beispiele für Objekte

    Alle Elemente, die in VBA Eigenschaften, Methoden oder Ereignisse bereitstellen, sind Objekte. Manche davon stehen nicht nur für den Zugriff per VBA, sondern direkt in der Benutzeroberfläche zur Verfügung. Dazu gehören beispielsweise:

  • Fenster
  • Steuerelemente
  • Formulare
  • Berichte
  • Textfelder
  • Schaltflächen
  • Alle genannten Elemente (und natürlich noch mehr) lassen sich auch per VBA ansprechen.

    Funktionen zum Instanzieren neuer Objekte

    Neben den Methoden und Eigenschaften stellt die Access-Bibliothek wiederum Objekte beziehungsweise Funktionen zur Ermittlung von Verweisen auf die entsprechenden Objekte zur Verfügung.

    Wenn Sie beispielsweise CurrentDb verwenden, könnte der Eindruck entstehen, dass es sich dabei bereits um ein Objekt handelt. Der Eindruck verstärkt sich, wenn Sie folgendes Beispiel betrachten:

    Debug.Print Access.CurrentDb.Name

    Die Anweisung bewirkt die Ausgabe des Verzeichnisses und des Dateinamens der aktuellen Datenbankdatei. Der Zugriff auf die Eigenschaft Name erfolgt dabei aber nicht über das »Objekt« CurrentDb, sondern über das Objekt, das durch die CurrentDb-Methode zurückgeliefert wird. Und dabei handelt es sich wiederum um eine neue Instanz der aktuellen Datenbank.

    Man könnte diese »implizite« Instanzierung über Funktionen noch weitertreiben. Die folgende Anweisung gibt die Anzahl Datensätze der angegebenen Tabelle zurück:

    Debug.Print CurrentDb.OpenRecordset("tblKontakte").RecordCount

    Diese Anweisung erstellt nicht nur eine neue Instanz der aktuellen Datenbank, sondern innerhalb dieser Instanz auch noch eine neue Datensatzgruppe, um deren Datensatzanzahl auszugeben. Für die Ausgabe zu Testzwecken ist die Verwendung einer solchen Anweisung sicher legitim, innerhalb von Prozeduren sollten Sie diese Anweisungen aber nur für den einfachen Gebrauch einsetzen - hier sind sie dann allerdings auch schneller. Wenn Sie aber öfter auf ein solches Objekt zugreifen werden, sollten Sie Objektvariablen verwenden und darüber auf die benötigten Eigenschaften und Methoden zugreifen. Die Verwendung der Objektvariablen sieht wie in folgender Routine aus:

    Public Function DatensaetzeZaehlen()

        'Objektvariablen deklarieren
        Dim db As DAO.Database
        Dim rst As DAO.Recordset

        'Objektvariable auf eine bestehende Instanz setzen
        Set db = Access.CurrentDb

        'Neue Instanz eines Objekts erzeugen und
        'per Objektvariable darauf verweisen
        Set rst = db.OpenRecordset("tblKontakte", dbOpenDynaset)
        Debug.Print rst.RecordCount

        '... weitere Aktionen mit dem Recordsetobjekt ...
        rst.Close

        'Objektvariablen freigeben
        Set rst = Nothing
        Set db = Nothing

    End Function

    Listing 15.4: Beispiel für das Setzen von Objektvariablen

    Wenn Sie die mit CurrentDB erzeugte Instanz der aktuellen Datenbank mit einer Objektvariablen des Typs Database referenzieren, haben Sie einen entscheidenden Vorteil: Sie können die Objektvariable anschließend wieder auf den Wert Nothing setzen und gehen nicht das Risiko ein, dass die Instanz über den gewünschten Zeitraum hinaus existiert. Gleiches gilt für das im Beispiel erzeugte Recordset-Objekt: Dieses können Sie durch die Verwendung einer Objektvariablen erstens schließen (entfernt die Datensätze daraus) und zweitens die Objektvariable leeren (gibt belegten Speicherplatz frei).

    Auflistungen

    Viele Objekte lassen sich über Auflistungen ansprechen. Das Database-Objekt enthält beispielsweise eine TableDefs-Auflistung, über die man auf alle TableDef-Objekte zugreifen kann.

    Auflistungen stellen je nach Typ unterschiedliche Elemente zur Verfügung - in diesem Fall eine Count-Eigenschaft zur Ausgabe der Anzahl der enthaltenen Objekte und die drei Methoden Append, Delete und Refresh.

    Auf die Elemente von Auflistungen können Sie meist auf unterschiedliche Art zugreifen. Wenn Sie den Namen des Elements kennen, können Sie ihn in Klammern angeben, um auf das Objekt zuzugreifen:

    Debug.Print .TableDefs("tblKontakte").RecordCount

    Eine andere Möglichkeit bietet der Index der jeweiligen Auflistung:

    Debug.Print CurrentDb.TableDefs(0).RecordCount

    Die folgenden beiden Prozeduren enthalten Beispiele für die Verwendung von Auflistungen.

    Public Sub TableDefsAuflisten_I()

        Dim db As DAO.Database
        Dim tdf As TableDef

        Set db = CurrentDb

        For Each tdf In db.TableDefs
            Debug.Print tdf.Name
        Next tdf

        Set db = Nothing

    End Sub

    Public Sub TableDefsAuflisten_II()

        Dim db As DAO.Database
        Dim intAnzahl As Integer

        Set db = CurrentDb

        intAnzahl = db.TableDefs.count

        For i = 0 To intAnzahl
            Debug.Print db.TableDefs(i).Name - 1
        Next i
        Set db = Nothing

    End Sub

    Listing 15.5: Beispiele für die Verwendung von Auflistungen

    Nächster Abschnitt:

    15.2.2 Erzeugen eines Objekts

    © 2006-2008 André Minhorst Alle Rechte vorbehalten.