ACCESS. Steuerelemente per VBA referenzieren FORMULARE MIT VBA PROGRAMMIEREN STEUERELEMENTE PER VBA REFERENZIEREN BASICS

Ähnliche Dokumente
ACCESS. Formulare per VBA referenzieren FORMULARE MIT VBA PROGRAMMIEREN FORMULARE PER VBA REFERENZIEREN BASICS

Zweitens über eine Abfrage, welche die Tabellen tblartikel und tbllieferanten verknüpft. Auf diese Weise würde das Kombinationsfeld

ACCESS. Access-Daten nach Excel verknüpfen INTERAKTIV ACCESS-DATEN NACH EXCEL VERKNÜPFEN BASICS

Formulare für die Dateneingabe Mehrere Formularinstanzen anzeigen

Makro + VBA 2007 effektiv

Verknüpfte Daten kopieren

Vorwort...10 Einleitung...12 Lernen Üben Anwenden...12 Inhalt und Aufbau des Buches...13 Inhalt...13 Aufbau Access 2007 (fast) alles ist

Michael Kolberg. einfach klipp & klar. Microsofft* Press

ACCESS. Berechnete Felder in Tabellen TABELLEN ENTWERFEN BERECHNETE FELDER IN TABELLEN BASICS

Access-Benutzeroberfläche

I Inhaltsverzeichnis B Beispielverzeichnis Vorwort... 17

Werte zu Kombinationsfeldern hinzufügen

3. Synchronisation von Formularen

White Paper Wählen-Buttons in Excel

ACCESS. Aufgabenplaner LÖSUNGEN AUFGABENPLANER BASICS

Erstellung von abhängigen Kombinationsfeldern mit dazugehörigen Unterformular...1

MiniPPS - Systembeschreibung

Access Programmierung. Ricardo Hernández García. 1. Ausgabe, November 2013 ACC2013P

öffnen den Tabellenverknüpfungs-Manager. Bild 1: Verknüpfte Tabellen in einer Datenbank Bild 2: Fehlgeschlagener Zugriff auf eine verknüpfte Tabelle

Access 2000 Programmierung

Access 2010 Programmierung Schleifen

Microsoft Access 2010 Bilder

Excel VBA. Teil Zusammenfassung! Was wir können sollten! V

Programmieren mit Excel VBA Teil 2 Formulare als Benutzerschnittstellen

ACCESS. Kombinationsfeld um Suche erweitern FORMULARE FÜR DIE DATENEINGABE KOMBINATIONSFELD UM SUCHE ERWEITERN BASICS

INFORMATIK TEIL: VBA. Infromatik WS 17/18 Teil: VBA. Allgemeines: - 4 Übungen á 3 Stunden

5 DATEN Variablen. Variablen können beliebige Werte zugewiesen und im Gegensatz zu

Das in Abb. 2 und Abb. 3 dargestellte Kombinationsfeld (Abb. 2 roter Kreis) wurde mit Hilfe des Kombinationsfeld-Assistenten

Visual Basic. Einführung

1 Vorbereitungen Makros aufzeichnen und ausführen Inhalt

13 Unterprogramme erstellen

Algorithmen und ihre Programmierung

Funktionen in JavaScript

Access [basics] Programmieren mit Arrays. Beispieldatenbank. Arrays. Eindimensionale Arrays. VBA-Grundlagen Programmieren mit Arrays

4 Artikel verwalten. 4.1 Übersichtsformular erstellen

Visual Basic - Einführung Mathematische Funktionen und Operatoren Zeichenfolgenbearbeitung. 1.7 Schleifen, Arrays und Entscheidungen

15.4 Mit dem Printer -Objekt drucken

Funktionen in JavaScript

4 Schleifen -= Entstanden unter Excel 2003 =-

VBA mit Office 97 lernen

Klausur SS 2014 EDV Anwendungen im Bauwesen. Name: Vorname: Matr.-Nr:

Arrays. Arrays werden verwendet, wenn viele Variablen benötigt werden. Der Vorteil in Arrays liegt darin, dass man nur eine Variable deklarieren muss

Access [basics] Aktionsabfragen per VBA ausführen. Beispieldatenbank. Aktionsabfragen. Die Execute-Methode. Datenzugriff per VBA

17 VBA-Praxisbeispiel

Download der Beispieldateien 12 Die Icons 12 Unterstützung für dieses Buch 12 Über den Autor 13

ACCESS. 1:1-Beziehungen TABELLEN ENTWERFEN 1:1-BEZIEHUNGEN BASICS

Kapitel 3 Datentypen, Variablen und Konstanten

Modul 122 VBA Scribt.docx

Inhalt. Dokument Beschreibung. Bentley Technical Support ProStructures.Net - Zusatzprogrammierung Visual Basic Express PST_Bearbeitung_Dialog

Kurs-Dokumentation. Zentrum für Informatik ZFI AG. Refresher Microsoft Access Programmierung (PA1P-0418) -IT Ausbildung nach Mass

ACCESS SCHICHTEN PLANEN MIT ACCESS IM UNTERNEHMEN. In diesem Heft: WEB APPS: FORMULARE RIBBON GLOBAL ANPASSEN JAHRESÜBERSICHT PER BERICHT

Access [basics] Rechnen in Berichten. Beispieldatenbank. Datensatzweise berechnen. Berechnung im Textfeld. Reporting in Berichten Rechnen in Berichten

Inhaltsverzeichnis. Teil I Erste Schritte. 1 Einleitung Teil II Grundlagen von VBA. 2 Die ersten VBA-Prozeduren erstellen...

Informationsverarbeitung im Bauwesen

Das Einsteigerseminar ASP

Sin-Funktion vgl. Cos-Funktion

1. Ist Collection ein spezifischer oder ein allgemeiner Objekttyp? Begründen Sie Ihre Antwort.

ProMaSoft.de WordPDFFormular Version (1.083) Seite 1 von 7

Aufgaben zu OOP der Klasse FTI32

Klausur WS 2014/15 EDV Anwendungen im Bauwesen. Name: Vorname: Matr.-Nr:

12 Formulare optimieren

mit Access herangeführt.

Beck EDV-Berater VBA. Visual Basic for Applications Programmieren unter Office XP. 2., neu bearbeitete Auflage

Inhalt. Inhalt. Einleitung Kapitel 1 Access kennenlernen... 25

Programmierstarthilfe SS 2008 Fakultät für Ingenieurwissenschaften und Informatik 8. Blatt Für den 16. und

Fragen zur OOP in Java

ACCESS KREUZTABELLE PER HTML IM UNTERNEHMEN. In diesem Heft: DATENSÄTZE OBEN EINFÜGEN .NET-DLL IN ACCESS EINBINDEN PDF-DOKUMENTE IM GRIFF SEITE 2

4 Makros ausprobieren

Excel VBA Arrays, Enumeration und benutzerdefinierte Typen

Richtig einsteigen: Access 2010 VBA-Programmierung

Richtig einsteigen: Access 2007 VBA-Programmierung

Nützliche Klassen. Armin Hess

Skriptum Bauinformatik SS 2013 (Vorlesung IV)

ACCESS. Laufende Summen in Tabellen TABELLEN ENTWERFEN LAUFENDE SUMMEN IN TABELLEN BASICS

Einführung in die Programmierung für NF MI. Übung 04

Arrays. Theorieteil. Inhaltsverzeichnis. Begriffe. Programmieren mit Java Modul 3. 1 Modulübersicht 3

Richtig einsteigen: Excel VBA-Programmierung. Für Microsoft Excel 2007 bis 2013 Held

Mehrdimensionale Arrays

Anregungen zu Übung 2

Objekt und Auflistung. Objekt. Auflistung und Objekt. Worksheet "Tabelle1" Beispiele: Application Range. Name, Visible = True,

Access [basics] Fehlerbehandlung unter VBA. Wozu eine Fehlerbehandlung? Fehlerbehandlung von Laufzeitfehler. Tritt ein Fehler ohne Fehlerbehandlung

Excel + VBA. Ergänzungen. Kapitel 1 Einführung in VBA Objektbindungen und Verweise HARALD NAHRSTEDT. Erstellt am

Access 2010 Programmierung Import und Export nach Excel

ACCESS MODERNE DIAGRAMME IM UNTERNEHMEN. In diesem Heft: TABULATOR IM RICH-TEXT-ELEMENT FORMULARSPALTEN SYNCHRONISIEREN BERECHTIGUNGEN IM SQL SERVER

zu große Programme (Bildschirmseite!) zerlegen in (weitgehend) unabhängige Einheiten: Unterprogramme

MELANIE BREDEN MICHAEL SCHWIMMER. Das Excel-VBA Codebook

Das Access-VBA Codebook

ACCESS das Datenbankprogramm. (Aufbau) DI (FH) Levent Öztürk

Gedanken zur Unterrichtsrelevanz von Software-Werkzeugen am Beispiel von Excel (VBA)

Klassen. 3.1 Was Sie in diesem Kapitel erwartet. 3.2 Allgemeines

Lorenz Hölscher. Richtig einsteigen: Access 2013 VBA-Programmierung Von den Grundlagen bis zur professionellen Entwicklung

ACCESS IM UNTERNEHMEN

IM UNTERNEHMEN RIBBON-KLASSEN SCHNELLER FILTER

Teil I Installation und erste Schritte 19

- Welche Beziehungstypen werden von ACCESS unterstützt? ACCESS unterstützt die Beziehungen + 1:1 + 1:n bzw. 1:cn + m:n

Einstieg in die Informatik mit Java

Informationsverarbeitung im Bauwesen

Transkript:

Steuerelemente per VBA referenzieren Wenn Sie Formulare und Steuerelemente programmieren wollen, müssen Sie wissen, wie Sie diese referenzieren. Nicht immer geschieht dies vom Klassenmodul des Formulars selbst aus manchmal wollen Sie vielleicht auch von anderen Formularen auf die Steuer elemente eines anderen Formulars zugreifen oder auch von einer VBA-Prozedur in eine Standardmodul. Dieser Artikel zeigt, wie Sie die Unterformulare und Steuer elemente eines Formulars referenzieren und auf diese zugreifen. Beispieldatenbank Die Beispiele dieses Artikels finden Sie in der Datenbank 1805_FormsControlsVBA- Read.accdb. Innerhalb des Formulars Im Artikel Formulare per VBA referenzieren haben Sie bereits erfahren, dass ein Formular ein Klassenmodul erhält, sobald Sie Ereignisprozeduren für das Formular oder die enthaltenen Steuer elemente anlegen. In diesem Klassenmodul können Sie mit dem Schlüsselwort Me auf das Formular und seine Eigenschaften zugreifen, während Sie von außen auf andere Art auf das Formular zugreifen müssen. Für den Zugriff auf die in einem Formular enthaltenen Elemente wie Unterformulare oder andere Steuer elemente gelten daher auch verschiedene Regeln, auch wenn Sie letztendlich auf das gleiche Element zugreifen wollen. Allerdings können wir das entschärfen, indem wir die Regeln dafür nochmal zusammenfassen. Wenn Sie also auf Steuer elemente in einem Formular zugreifen wollen, verwenden Sie abhängig vom Ausgangspunkt die folgenden Referenzen für das Formular: Im eigenen Klassenformular: Bild 1: Schaltfläche zum Ermitteln des Namens einer anderen Schaltfläche Etwas komplizierter wird es noch, wenn sich die zu referenzierenden Steuer elemente in einem Unterformular befinden dazu jedoch später mehr. Über den Namen auf ein Steuer element zugreifen Die einfachste Methode, auf ein Steuer element zuzugreifen, ist die über den Namen des Steuerelements. Dazu fügen wir dem Beispielformular frmbeispiel zwei Schaltflächen hinzu, von denen die zweite den Namen der ersten Schaltfläche ausgeben soll (siehe Bild 1). In der Ereignisprozedur, die durch die zweite Schaltfläche ausgelöst wird, referenzieren wir die erste Schaltfläche dann über die Syntax mit dem Ausrufezeichen und geben den Namen per MsgBox aus: Me... Von außen: Private Sub cmdnameeinessteuerelements_click() MsgBox Me!cmdNameAnzeigen.Name Forms!<Formularname>... Forms("<Formularname>")... Die zweite Möglichkeit ist die Angabe des Steuerelementnamens als Parameter des Me-Schlüsselworts: www.access-basics.de Seite 21

MsgBox Me("cmdNameAnzeigen").Name Dies ist allerdings auch nur möglich, weil die Auflistung Controls die Standardeigenschaft des mit dem Schlüsselwort Me referenzierten Objekts, in diesem Fall des Formulars, ist. Die ausgeschriebene Form dieser Schreibweise bezieht die Controls-Auflistung dann explizit mit ein: MsgBox Me.Controls("cmdNameAnzeigen").Name Dabei fällt mir ein, dass man mal prüfen könnte, welchen Typ das Schlüsselwort Me eigentlich hat. Ist es Form? Nein: Es handelt sich um die Code behind- Klasse des Formulars selbst: Debug.Print TypeName(Me) Form_frmBeispiel Für weitere Experimente fügen wir dem Formular noch ein Textfeld namens txtbeispiel hinzu sowie eine weitere Schaltfläche namens cmdtextfeldausgeben (siehe Bild 2). Den Inhalt des Textfeldes legen wir in einer Ereignisprozedur fest, die beim Laden des Formulars ausgelöst wird: Bild 2: Neues Textfeld zum Experimentieren Private Sub Form_Load() Me!txtBeispiel = "Beispieltext" Warum Ausrufezeichen und kein Punkt? Theoretisch kommen Sie in den meisten Fällen auch ohne Fehler aus, wenn Sie zwischen Formularbezeichner (also etwa Me oder Forms!<Formularname>) und Steuerelementname den Punkt als Trennzeichen angeben. Warum aber verwenden wir hier so beharrlich das Ausrufezeichen? Dieses sollten Sie immer dann nutzen, wenn Sie Elemente von Auflistungen referenzieren, die Sie selbst angelegt haben beziehungsweise anlegen können also etwa Formulare (Forms!<Formularname>) oder Steuer elemente in Formularen (Forms!<For mularname>!<steuerelementname>). Zugriff auf Textfelder von verschiedenen Stellen Wenn wir vom Formular selbst in diesem Fall über die Schaltfläche cmdtextfeldausgeben auf den Inhalt dieses Textfeldes zugreifen wollen, verwenden wir, wie oben gelernt, das Schlüsselwort Me sowie das Ausrufezeichen und den Namen des Textfeldes: Bild 3: Standardeigenschaft einer Klasse im Objektkatalog Private Sub cmdtextfeldausgeben_click() MsgBox Me!txtBeispiel www.access-basics.de Seite 22

Tatsächlich ist dies wiederum eine Kurzform. Wir geben ja nicht das Textfeld txtbeispiel aus, sondern den Inhalt dieses Textfeldes. Die Kurzform funktioniert deshalb, weil die Eigenschaft Value des Textfeldes die Standardeigenschaft der Textfeld-Klasse ist. Ohne diese Kurzform müssten Sie also mit dem folgenden Asudruck arbeiten: MsgBox Me!txtBeispiel.Value Woher wissen wir so etwas? Dies erfahren wir beispielsweise im Objektkatalog, den Sie über den Menüeintrag Ansicht Objektkatalog öffnen (siehe Bild 3). In der Liste der Eigenschaften finden Sie zum Beispiel für das Textfeld (TextBox) ein spezielles Icon für die Eigenschaft Value. Unten finden Sie dann den Text Standardelement von Access.TextBox das ist eindeutig. Das waren nun zwei Kurzform. Genau wie beim Referenzieren von Formularen können Sie aber auch noch über die Schreibweise mit Klammern auf die Steuerelemente eines Formulars zugreifen. Die erste Variante nimmt den Namen des Formulars entgegen: Debug.Print Me("txtBeispiel").Value aktive Steuer element ermitteln wollen, nutzen Sie die Eigenschaft ActiveControl des Screen-Objekts: Debug.Print Screen.ActiveControl.Name Dies liefert beispielsweise den Namen des aktiven Steuerelements. Was geschieht hier beispielsweise, wenn derzeit kein Formular, sondern etwa eine Tabelle den Fokus hat? Dann liefert Screen.ActiveControl den Namen des Feldes der Tabelle, das gerade markiert ist! Im Falle der Tabelle tblbeispiel unserer Beispieldatenbank sieht der Aufruf im Direktbereich etwa wie folgt aus: Debug.Print Screen.ActiveControl.Name ID Können wir darüber auch auf den Namen der Tabelle zugreifen? Ja, auch das gelingt: Debug.Print Screen.ActiveControl.Parent.Name tblbeispiel Dadurch angespornt lassen wir auch gleich noch den mit TypeName ermittelten Typ dieses Tabellenobjekts ausgeben: Das war wiederum die Kurzform für die Variante mit der Controls-Auflistung: Debug.Print TypeName(Screen.ActiveControl.Parent) T_tblBeispiel Debug.Print Me.Controls("txtBeispiel").Value Und wenn Sie den Index-Wert des Steuerelements kennen, können Sie auch noch einen numerischen Wert angeben: Debug.Print Me.Controls(2).Value Zugriff auf das aktive Steuerelement Im Artikel zum Thema Formulare haben Sie die Eigenschaft ActiveForm des Screen-Objekts kennengelernt, mit der Sie das aktive Formular referenzieren konnten. Ein Pendand zu dieser Eigenschaft gibt es auch für Steuer elemente. Wenn Sie also das aktuell Dies ist dann also das Pendant zu dem Typ Form_..., der für ein Formular zurückgeliefert wird. Wenn Sie also etwa per Code über Screen.Active Control auf ein Steuer element eines Formulars zugreifen wollen, sollten Sie zuvor mit Screen.Active Form sicherstellen, dass auch gerade ein Formular den Fokus hat. Steuerelemente durchlaufen Sie haben nun schon gesehen, dass es eine Auflistung namens Controls gibt, mit der Sie Steuerelemente referenzieren können. Für Auflistungen können Sie auch die Anzahl der enthaltenen Elemente www.access-basics.de Seite 23

bestimmen und Sie können die Elemente in verschiedenen Schleifentypen durchlaufen. Wir fügen dem Formular zwei weitere Schaltflächen hinzu. Die erste heißt cmdsteuerelementedurchlaufenfornext und löst die folgende Ereignisprozedur aus: Private Sub cmdsteuerelementedurchlaufenfornext_click() Dim intcount As Integer Dim i As Integer intcount = Me.Controls.Count For i = 0 To intcount - 1 Next i Debug.Print Me.Controls(i).Name Dies ist die Variante zum Durchlaufen der enthaltenen Steuer elemente, bei der wir zuerst die Anzahl der Steuerelemente ermitteln und dann eine For...Next- Schleife entsprechend der Anzahl der Steuer elemente durchlaufen. Innerhalb der Schleife referenzieren wir dabei das jeweilige Steuer element über den Index. Da dieser 0-basiert ist, beginnt die Schleife bei 0 und wir legen den Endpunkt der Schleife auf intcount - 1 fest. intcount ermitteln wir zuvor über die Eigenschaft Count der Controls-Auflistung. Die zweite Variante lösen wir mit der Schaltfläche cmsteuerelementedurchlaufenforeach aus. Diese hat einen etwas eleganteren Ansatz: Sie durchläuft die Controls-Auflistung mit einer For Each-Schleife. Diese füllt die Elemente der Auflistung dann automatisch in die hinter For Each angegebene Variable, hier die Variable ctl vom Datentyp Control. Bild 4: Eigenschaften der Control-Klasse Debug.Print ctl.name Steuerelementtypen Wenn Sie sich die Auswahl der für die Klasse Control verfügbaren Eigenschaften, Methoden und Ereignisse ansehen (etwas per IntelliSense wie in Bild 4), scheint dies nur eine Teilmenge der für die verschiedenen Steuerelementtypen verfügbaren Member zu sein in der Tat sind es nur rund 40. Schauen Sie sich dann etwas im Objektkatalog die Eigenschaften des Steuerelements TextBox an, finden Sie schon circa 160 Eigenschaften. Da scheint es logisch, dass Sie für volle Flexibilität auf das Steuer element mit dem spezifischen Datentyp zugreifen wollen. Wenn Sie gezielt auf einzelne Steuer elemente zugreifen, wissen Sie natürlich, welchen Typ das jeweilige Steuer element hat. Sie können es dann direkt mit dem passenden Datentyp deklarieren beispielsweise wie folgt: Control ist ein allgemeiner Datentyp, den Sie mit allen möglichen Steuerelementen füllen können. Innerhalb der Schleife gibt die Prozedur dann den Namen des mit ctl referenzierten Steuerelements aus: Private Sub cmdsteuerelementedurchlaufenforeach_click() Dim txtbeispiel As TextBox Was aber, wenn Sie etwa alle Steuer elemente durchlaufen wollen, aber dennoch die spezifischen Eigenschaften der jeweiligen Steuer elemente nutzen wollen? In diesem Fall müssen wir zuerst herausfinden, um welchen Steuerelementtyp es sich bei dem jeweiligen Objekt handelt. www.access-basics.de Seite 24

Steuerelementtyp in einer Schleife ermitteln Den Steuerelementtyp ermitteln Sie mit einer Eigenschaft, die interessanterweise gar nicht für die Control-Klasse angegeben ist nämlich ControlType. Die folgende Prozedur, ausgelöst durch eine neue Schaltfläche namens cmdsteuerelementtypermitteln, liefert jeweils einen Zahlenwert für die Steuerelementtypen: Private Sub cmdsteuerelementtypermitteln_ Click() Debug.Print ctl.controltype Bild 5: Die Eigenschaft ControlType gibt es für alle Steuer elemente. Woher kommt aber die Eigenschaft Control Type und warum können wir diese nutzen, aber nicht per IntelliSense auswählen? Die Eigenschaft steht, soviel verrät der Objektkatalog wie in Bild 5, für alle im Objektkatalog bekannten Steuer elemente zur Verfügung, aber nicht für die Control-Klasse. Die Control-Klasse kann aber alle Eigenschaften der verschiedenen Steuerelementklassen nutzen, die einer Variablen des Datentyp Control zugewiesen werden können. Die Suche nach der Eigenschaft Control Type im Objektkatalog lieferte auch noch den Typ accontroltype. Dieser enthält alle Konstanten für die verschiedenen Steuerelementtypen (siehe Bild 6). Wenn Sie eines der Elemente anklicken, erscheint unten auch der Zahlenwert für die jeweilige Konstante. Das Problem ist nur: Dieser Zahlenwert wird auch zurückgeliefert, wenn Sie die Eigenschaft ControlType etwa im Direktfenster ausgeben lassen. Und damit können Sie nicht viel anfangen, wenn Sie die Zahlenwerte nicht alle auswendig können. Also stellen wir eine kleine Hilfsfunktion zur Verfügung, welche den Zahlenwert Bild 6: Konstanten für die verschiedenen Steuerelementtypen für einen Steuerelementtyp als Parameter erwartet und diesen in einer Select Case-Bedingung mit den möglichen Werten des Typs accontroltype abgleicht und die Bezeichnung in die Variable strtype schreibt. www.access-basics.de Seite 25

Der Wert dieser Variablen wird dann schließlich als Funktionsergebnis zurückgegeben: Public Function ControlType(intControlType As AcControlType) As String Dim strtype As String Select Case intcontroltype Case acattachment strtype = "Attachment" Case acboundobjectframe strtype = "BoundObjectFrame" Case acchart strtype = "Chart" Case accheckbox strtype = "CheckBox" Case accombobox strtype = "ComboBox" Case accommandbutton strtype = "CommandButton" Case accustomcontrol strtype = "CustomControl" Case acemptycell strtype = "EmptyCell" Case acimage strtype = "Image" Case aclabel strtype = "Label" Case acline strtype = "Line" Case aclistbox strtype = "ListBox" Case acnavigationbutton strtype = "NavigationButton" Case acnavigationcontrol strtype = "NavigationControl" Case acobjectframe strtype = "ObjectFrame" Case acoptionbutton strtype = "OptionButton" Case acoptiongroup strtype = "OptionGroup" Case acpage strtype = "Page" Case acpagebreak strtype = "PageBreak" Case acrectangle strtype = "Rectangle" Case acsubform strtype = "Subform" Case actabctl strtype = "TabCtl" Case actextbox strtype = "TextBox" Case actogglebutton strtype = "ToggleButton" Case acwebbrowser End Select strtype = "WebBrowser" ControlType = strtype End Function Danach brauchen Sie die Prozedur cmdsteuerelementtypermitteln nur noch um diese Funktion zu erweitern, um die Steuerelementnamen sowie deren Typ im Klartext im Direktbereich des VBA-Editor auszugeben: Private Sub cmdsteuerelementtypermitteln_click() Debug.Print ctl.name, ControlType(ctl.ControlType) Was tun mit dem Steuerelementtyp? Aber was können wir mit der Kenntnis des Steuerelementtyps noch anstellen? Ganz einfach: Sie können damit beispielsweise nur die Textfelder des Formulars ermitteln und mit diesen die gewünschten Aktionen durchführen. Im ersten Schritt geben wir zunächst einmal alle Steuer elemente des Typs CommandButton im Direktbereich aus: Private Sub cmdnurschaltflaechenausgeben_click() Select Case ctl.controltype Case accommandbutton www.access-basics.de Seite 26

Debug.Print ctl.name End Select Wenn Sie nun auch noch auf die für diesen Steuerelementtyp spezifischen Eigenschaften, Ereignisse und Methoden zugreifen wollen, deklarieren Sie einfach eine passende Objektvariable, weisen dieser in der Schleife das Steuer element zu und nutzen dann bequem über IntelliSense die für das Steuer element verfügbaren Member. Bild 7: Formular, das als Unterformular dienen soll Im folgenden Beispiel nutzen wir das direkt sinnvoll, um die Beschriftung der Schaltflächen auszugeben. Da es die dafür verwendete Eigenschaft Caption für die meisten anderen Steuer elemente nicht gibt, war es durchaus sinnvoll, zuvor nach Schaltflächen zu selektieren und diese gezielt einer CommandButton-Variablen zuzuweisen: Private Sub cmdschaltflaechenreferenzieren_click() Dim cmd As CommandButton Select Case ctl.controltype Case accommandbutton End Select Set cmd = ctl Debug.Print cmd.caption Es gibt zwei wichtige Vorteile, wenn Sie ein Control- Element dem spezifischen Steuerelementtyp wie CommandButton, TextBox et cetere zuweisen: Sie können damit erstens über IntelliSense auf die jeweiligen Eigenschaften und Methoden zugreifen und zweitens können Sie nur so die Ereignisse eines Steuerelements implementieren, sollte sich dieses nicht im aktuellen Formular befinden. Wie dies gelingt, schauen wir uns jedoch in einem späteren Artikel an. Bild 8: Unterformular-Steuerelement mit Unterformular Spezialfall Unterformular Das Unterformular ist ein Spezialfall, weil es ein Container für ein weiteres Formular ist, dass wiederum Steuer elemente enthalten kann und somit auch weitere Unterformulare. Um dies an Beispielen dokumentieren zu können, fügen wir dem Formular frmbeispiel ein Unterformular namens sfmbeispiel hinzu. Dieses legen wir zunächst als herkömmliches Formular an und speichern es unter dem Namen sfmbeispiel. Außerdem fügen wir diesem ein Textfeld namens txtunterformular hinzu (siehe Bild 7). Um das Formular als Unterformular zum Hauptformular hinzuzufügen, schließen Sie das angehende Unterformular, öffnen das Hauptformular in der Entwurfsansicht und ziehen das Unterformular dann aus dem Navigationsbereich in den Detailbereich des Hauptformulars. Das Ergebnis sieht wie in Bild 8 aus. www.access-basics.de Seite 27

Access hat nun ein Unterformular-Steuerelement angelegt und für seine Eigenschaft Herkunftsobjekt (unter VBA SourceObject) den Namen des Formulars eingetragen, dass im Unterformular-Steuerelement angezeigt werden soll. Da das Unterformular-Steuerelement bei dieser Aktion von Access mit dem Namen des Unterformulars versehen wird, entstehen oft Missverständnisse, die dazu führen, dass Unterformular-Steuerelement und das enthaltene Formular verwechselt oder für das gleiche Element gehalten werden. Das ist aber in der Tat nicht so. Uns interessiert aber nun vielmehr, wie wir das Unterformular und die darin enthaltenen Steuer elemente referenzieren können. Auf das Unterformular-Steuerelement greifen Sie wie folgt zu: Debug.Print Me!sfmBeispiel.Name Von außerhalb ginge das so: Debug.Print Forms!frmBeispiel!sfmBeispiel.Name Auf das im Unterformular enthaltene Formular greifen Sie über die Form-Eigenschaft des Unterformular- Steuerelements zu vom Hauptformular aus: Controls-Auflistung von Steuerelementen Wenn Sie versehentlich einmal die Controls-Auflistung des Unterformular-Steuerelements durchlaufen, werden Sie sich möglicherweise über das Ergebnis wundern: Private Sub cmdufocontrols_click() For Each ctl In Me!sfmBeispiel.Controls Debug.Print ctl.name Es werden dann nämlich die gleichen Steuer elemente ausgegeben wie für das Formular im Unterformular- Steuerelement. Also liefert die Controls-Auflistung des Unterformular-Steuerelements die gleichen Steuer elemente wie das darin enthaltene Formular? Das ist interessant. Was liefert dann die Name- Eigenschaft? Um dies zu testen, markieren wir das Unterformular-Steuerelement über das Kombinationsfeld im Eigenschaften-Fenster und stellen seinen Namen auf sfm ein im Gegensatz zur Bezeichnung sfmbeispiel für das im Unterformular-Steuerelement enthaltene Formular. Hier erhalten wir die zu erwartenden Werte: Debug.Print Me!sfmBeispiel.Form.Name Von außerhalb: Debug.Print Forms!frmBeispiel!sfmBeispiel.Form.Name Schließlich wollen wir noch auf die Steuer elemente im Unterformular zugreifen. Das geht mit der For Each- Auflistung wie folgt: Private Sub cmdsteuerelementeimufo_click() For Each ctl In Me!sfmBeispiel.Form.Controls Debug.Print ctl.name? Me!sfm.Name sfm? Me!sfm.Form.Name sfmbeispiel Reicht das als Unterformular angegebene Formular also auf irgendeine Weise seine Controls-Liste an das Unterformular-Steuerelement hoch? Offensichtlich ist das der Fall im Gegensatz zu den anderen Eigenschaften, die jeweils dem Unterformular-Steuerelement und dem darin enthaltenen Formular vorbehalten bleiben. Zusammenfassung und Ausblick Dieser Artikel zeigt, wie Sie auf die Steuer elemente in Formularen und Unterformularen zugreifen können. www.access-basics.de Seite 28