JOANNEUMHomeForschungsbereicheNeuSite MapRESEARCH      englishsuchenHilfe

vorheriges Kapitel Inhalt Hilfe Beispiele laden nächstes Kapitel

Selbstgestaltete Dialogfelder

Wann immer...

brauchen Sie ein selbstgestaltetes Dialogfeld.

EXCEL verwaltet diese Dialogfelder in "Dialogblättern" von Arbeitsmappen. Diese "Dialogblätter" stellen eine Zeichenfläche dar, auf der sie die Anordnung der Dialogelemente entwerfen und die Verhaltensweisen der einzelnen Elemente festlegen.

Abbildung 36: eine leere Zeichnungsfläche und die Symbolleiste für selbstgestaltete Dialoge

Dialogblatt anfordern  Verwenden Sie dazu den Befehl EINFÜGEN, MAKRO, DIALOG.

Die Symbolleiste "Dialog"

Diese Symbolleiste wird automatisch eingeblendet, sobald sie ein Dialogblatt anlegen oder zu ihm wechseln. Sie enthält folgende Elemente:



Textfeld ("Textbox")

Gruppenfeld ("Groupbox")

Kontrollkästchen ("Checkbox")

Listenfeld ("Listbox")

Kombination Text-Listenfeld ("Listbox" und "Editbox")

Laufleiste ("Scrollbar")

Eigenschaften

Zeichenraster



Bearbeitungsfeld ("Editbox")

Schaltfläche ("Button")

Optionsfeld ("Optionbutton")

Dropdown-Listenfeld ("Dropdown")

Dropdown Kombination Textfeld-Listenfeld ("Dropdown" und "Editbox")

Drehfeld ("Spinner")

Code bearbeiten

Dialog ausführen

Abbildung 37: Elemente der Dialogleiste "Symbol" und ihre Bedeutung

Elemente eines Dialogfeldes

Jedes Dialogfeld setzt sich aus folgenden Elementen zusammen:

Rahmen, Titel und Elemente können bereits vor dem Anzeigen des Dialogs angesprochen werden. Sie können mittels VBA-Code die Größe des Dialogfeldrahmens festlegen, in Bearbeitungsfelder Text hineinstellen, Optionsfelder und Kontrollkästchen an- und abschalten, Listenfeldern die Listenwerte zuweisen, usw.:

Der lange Weg zum fertigen Dialogfeld...

Dialogfelder mit mehr als ein paar Texteingabefeldern herzustellen, ist eine langwierige Arbeit; es ist dafür viel Code zu schreiben. Die einzelnen Phasen sind:

  1. Zeichnen des Dialogfeldes
  2. Reihenfolge der Elemente festlegen
  3. Code für das Füllen der Elemente vor dem Anzeigen des Dialogfeldes schreiben
  4. Code für die laufende Kontrolle des Dialoges schreiben
  5. Code für die Kontrolle der Eingaben vor der Übernahme in die Tabelle schreiben

Zeichnen des Dialogfeldes

Dialogelement einfügen  Dies ist eine Arbeit, die Sie nur mit der Maus durchführen können! (Der Vollständigkeit halber füge ich hinzu, auch mit VBA-Befehlen, aber warum so umständlich?) Gehen Sie dazu so vor:

Mehrere gleichartige Elemente in einem einfügen  Setzen Sie den Cursor auf den Rand des ersten eingefügten Elementes. Drücken Sie dann die Strg-Taste. EXCEL stellt daraufhin eine Kopie des Elementes zur Verfügung (sie liegt direkt über dem Element, ist also zunächst nicht sichtbar; der Mauszeiger erhält aber zusätzlich ein kleines Kreuz). Ziehen Sie die Kopie dorthin, wo Sie sie haben wollen. Tip: Wenn Sie zusätzlich auch die Umschalt-Taste drücken, ist nur waagrechte oder senkrechte Bewegung möglich (je nachdem, wie Sie die Bewegung beginnen).

Dialogelement verschieben  Klicken Sie dazu mit der linken Maustaste auf das Element. Sobald der Rahmen erscheint, setzen Sie den Mauszeiger auf diesen. Ziehen Sie dann mit gedrückter linker Maustaste das Element an die gewünschte Stelle.

Größe ändern  Der Rahmen um ein Dialogelement enthält 8 Anfasser (kleine Rechtecke). Setzen Sie den Mauscursor auf einen Anfasser, drücken Sie die linke Maustaste und ziehen Sie die Maus dorthin, wo der Anfasser zu liegen kommen soll.

Dialogelement löschen  Klicken Sie mit der rechten Maustaste auf das Element. Wählen Sie im Kontextmenü den Befehl "Objekt löschen".

Mehrere Dialogelemente zugleich bearbeiten Klicken Sie mit der Maus außerhalb des Dialogfeldes auf das Dialog-Arbeitsblatt, damit kein Element ausgewählt ist. Ziehen Sie dann mit gedrückter linker Maustaste eine Linie um die Elemente, die Sie zugleich bearbeiten wollen. Sobald Sie die Maustaste auslassen, erscheinen alle von der Linie umschlossenen Elemente markiert und können gemeinsam verschoben, vergrößert/verkleinert oder gelöscht werden.

Mehrere nicht nebeneinander liegende Elemente werden ausgewählt, indem das erste angeklickt und alle weiteren bei gedrückter Umschalt-Taste angeklickt werden.

NAME DES DIALOGELEMENTES FESTLEGEN

Wenn Sie den Wert eines Dialogelementes auslesen oder festsetzen wollen, müssen Sie es mit seinem Namen angeben. EXCEL gibt automatisch einen Namen vor, wenn Sie das Element schaffen. Dieser Name besteht aus zwei Teilen:

  1. Der Typ des Elementes ("Bearbeitungsfeld", "Listenfeld" usw.)
  2. Eine fortlaufende Ziffer

Diese Namen sind natürlich nicht aussagekräftig. Was sagt Ihnen schon beim Schreiben von Code z.B. "Listenfeld 24"?

Daher sollten Sie diese vorgegebenen Namen sofort nach dem Einfügen des Elementes ersetzen. Klicken Sie dazu auf das Feld links in der Bearbeitungszeile (dort würde in unserem Beispiel "Listenfeld 24" stehen). EXCEL markiert dann den gesamten Namen. Schreiben Sie jetzt den neuen Namen und drücken Sie unbedingt die Eingabetaste. Nur dann wird der Name auch wirklich akzeptiert.

Namenskonventionen  Vor allem bei größeren Programmen ist es wichtig, den Überblick zu bewahren. Daher bietet sich folgende Konvention an:

  1. Kurzbezeichnung des Dialogs (z.B. "EDlg" für "Eingabedialog")
  2. Ein Unterstrich ("_")
  3. Kurzbezeichnung für die Art des Elementes (z.B. "EB" für "Editbox")
  4. Ein Unterstrich ("_")
  5. Ein sprechender Name für das, was in dem Element erfragt werden soll (z.B. "FamName" für ein Bearbeitungsfeld, in dem ein Familienname eingegeben werden soll)

Der Name des Elementes würde in unserem Beispiel also lauten: "EDlg_EB_Famname"

Reihenfolge der Elemente festlegen

In jedem Dialogfeld gibt es eine natürliche Abfolge der Eingaben-wahrscheinlich zeilenweise von oben nach unten. Zum nächsten Element gewechselt wird wie in den eingebauten EXCEL-Dialogen durch Drücken der Tabulator-Taste. Umschalt+Tabulator wechselt zum vorhergehenden Element.

EXCEL legt die Tabulator-Reihenfolge der Elemente selbst fest; es ist die Reihenfolge, in der Sie Elemente in das Dialogfeld stellen. Das entspricht wahrscheinlich nur selten dem, was Sie wünschen. Über das Menü "Extras" und den Befehl "Aktivierfolge" können Sie nachträglich die Reihenfolge verändern.

Code für das Füllen der Elemente vor dem Anzeigen des Dialogfeldes schreiben

Alle Elemente eines Dialogfeldes behalten nach dessen Schliessung die eingegebenen Werte. Wird das Dialogfeld nochmals ausgerufen, zeigt es diese. Das wird meistens nicht passen. Daher müssen die Elemente-noch bevor das Dialogfeld angezeigt wird-mittels Code die gewünschten Werte erhalten.

ThisWorkbook.Dialogsheets("MeinDialog").Editboxes("DlgM_EB_Name"). _
  Text="Müller"
ThisWorkbook.Dialogsheets("MeinDialog").Listboxes("DlgM_LB_Abteilungen"). _
  List=ThisWorkbook.Sheets("Abteilungen").[A1].CurrentRegion
ThisWorkbook.Dialogsheets("MeinDialog").Listboxes("DlgM_LB_Abteilungen"). _
  Listindex=1 
ThisWorkbook.Dialogsheets("MeinDialog"). _ 
  OptionButtons("DlgM_OB_Gruppe").Value=xlOn

Die Werte mehrerer Elemente zugleich festlegen Das geht ganz einfach! Hier kommt uns nämlich die Tatsache entgegen, daß jedes Element ein Mitglied einer Element-Auflistung ist. Daher können wir zum Beispiel:

ThisWorkbook.Dialogsheets("MeinDialog").Editboxes("DlgM_EB_Name"). _
  Text=""
ThisWorkbook.Dialogsheets("MeinDialog").Checkboxes.Value=xlOff
ThisWorkbook.Dialogsheets("MeinDialog").Listboxes.Listindex=1

Auch während der Dialog angezeigt wird, können seine Elemente beeinflußt werden. Ansprache wie oben, allerdings genügt jetzt für die Angabe, um welchen Dialog es sich handelt, "ActiveDialog":

ActiveDialog.Editboxes("DlgM_EB_Name").Text="Müller"

Code für die laufende Kontrolle des Dialoges schreiben

Alle aktivierbaren Dialogelemente reagieren, wenn sie verändert werden. Damit läßt sich schon während der Eingabe in ein Dialogfeld ein wenig kontrollieren, ob die Eingabe sinnvoll ist. Wird ein Dialogelemente verändert, prüft EXCEL, ob es eine Prozedur gibt, die mit dem Element "verknüpft" wurde. Ist das der Fall, dann wird diese Prozedur ausgeführt. Im VBA-Handbuch werden diese Prozeduren "Ereignis-Prozeduren" genannt. Hier sind die "Ereignisse" für die wichtigsten Dialogelemente:

Element Ereignis EXCEL-Standard-Bezeichnung für Ereignis
Bearbeitungsfeld (Editbox) Eingeben oder Löschen eines Zeichens BeiÄnderung
Schaltknopf (Button) Drücken des Schaltknopfes mit der Maus, Enter-Taste, wenn Knopf ausgewählt ist BeiKlick
Optionsschaltfläche (OptionButton) Ein- oder Ausschalten des Knopfes mit Maus oder Tastatur BeiKlick
Listenfelder Auswählen eines Listeneintrages mit Maus oder Tastatur BeiÄnderung
Kontrollkästchen Ein- oder Ausschalten des Kästchens mit Maus oder Tastatur BeiKlick
Bildlaufleiste Anklicken der Leiste BeiÄnderung
Drehfeld Anklicken eines der Dreihfeld-Pfeile BeiÄnderung
Dialogfeldrahmen Starten des Dialoges mittels VBA-Programm oder Drücken des Schaltknopfes "Dialog ausführen" in der Symbolleiste "Dialog" BeiAnzeigen

Ereignis-Prozedur durch EXCEL anlegen lassen Wenn ein Dialog-Element ausgewählt ist (also einen grauen Rahmen hat), können Sie EXCEL veranlassen, den Kopf und die Schlußzeile der für das Element zu schaffenden Ereignis-Prozedur selbsttätig anzulegen. Klicken Sie dazu in der Symbolleiste "Dialog" auf das Symbol "Code bearbeiten".

Wenn Sie das in einem bestimmten Dialogfeld das erste Mal machen, legt EXCEL in der Arbeitsmappe, in der sich das Dialogblatt befindet, ein neues VBA-Modul an. Weitere Prozedur-Köpfe stellt EXCEL dann in dieses Modul hinein.

Zugleich mit dem Anlegen des Prozedur-Kopfes legt EXCEL fest, daß diese Prozedur bei einem auslösenden Element-Ereignis abgearbeitet werden soll.

Ereignis-Prozedur selbst anlegen Sie können die Prozedur auch komplett selbst und in einem VBA-Modul Ihrer Wahl schreiben. Markieren Sie dann das Element. Rufen Sie im Menü "Extras" den Befehl "Zuweisen..." auf. Dort finden Sie in der Liste aller geladenen VBA-Prozeduren die von Ihnen geschriebene. Klicken Sie mit der Maus auf den Namen der Prozedur.

Element eine andere Ereignis-Prozedur zuweisen Markieren Sie zunächst das Element. Rufen Sie dann im Menü "Extras" den Befehl "Zuweisen..." auf. Dort finden Sie eine Liste aller geladenen VBA-Prozeduren. Klicken Sie mit der Maus auf den Namen der Prozedur, die bei einem "Ereignis" des Elements ausgeführt werden soll.

Verbindung zwischen Element und Ereignis-Prozedur trennen Markieren Sie zunächst das Element. Rufen Sie dann im Menü "Extras" den Befehl "Zuweisen..." auf. Löschen Sie den Text im Eingabefeld "Makroname/Prozedur".

Zur Ereignis-Prozedur springen Markieren Sie das Element. Drücken Sie dann in der Symbolleiste "Dialog" auf das Symbol "Code bearbeiten".

Beispiele

Eingabefeld darf nur Zahl enthalten Wir können zwar anordnen, daß ein Eingabefeld nur eine Zahl enthalten darf (über das Menü "Format" und den Befehl "Objekt..."), aber diese Prüfung wird erst durchgeführt, wenn wir das Dialogfeld schliessen. Wollen wir schon während der Eingabe prüfen, verwenden wir die VBA-Funktion "IsNumeric". Sie ergibt "Wahr", wenn der Text im Eingabefeld nur Ziffern, ein Komma und Tausenderpunkte enthält. Die Ereignis-Prozedur "PruefeObZahl" stellt nach jedem Tastendruck fest, ob das eingebene Zeichen "numeric" ist. Wenn nicht, erfolgt eine Warnung und das letzte, offensichtlich falsche Zeichen wird aus dem Eingabefeld-Text entfernt.

Den Code dieses Beispiels finden Sie in der Datei "ZAHL.XLS".
Sub PruefeObZahl()

Dim sZuPruefendesEingabefeld As EditBox

Set sZuPruefendesEingabefeld = _
  ActiveDialog. Editboxes(Application.Caller)
If Not IsNumeric(sZuPruefendesEingabefeld.Text) Then
  Beep
  MsgBox "Dies ist keine Zahl !", vbCritical, "Fehler:"
  sZuPruefendesEingabefeld.Text = Left(sZuPruefendesEingabefeld.Text, _
    Len(sZuPruefendesEingabefeld.Text) - 1)
  SendKeys "{end}"
End If

End Sub

Hinweis "Isnumeric" ist ein bißchen dumm. Man kann ihm an beliebiger Stelle Tausender-Punkte unterschieben, mehr als ein Dezimalkomma läßt es nicht zu.

Was zeigt dieses Beispiel noch? Zunächst einmal ist diese Prozedur universell verwendbar. Sie stellt nämlich nicht auf ein konkretes Eingabefeld ab, sondern sie erfragt dessen Namen, während sie läuft:

Dim sZuPruefendesEingabefeld As EditBox

Set sZuPruefendesEingabefeld = _
  ActiveDialog.Editboxes(Application.Caller)

Die Eigenschaft "Caller" des "Application"-Objektes gibt den Namen des Dialog-Elementes zurück, durch dessen Veränderung die Prozedur "PruefeObZahl" aufgerufen wurde.

Da EXCEL darauf besteht, nach der Eingabe eines Textes in ein Eingabefeld durch VBA-Code den Text komplett zu markieren, sodaß jeder Tastendruck ihn ganz verschwinden lassen würde, ordnen wir in der drittletzten Zeile an:

SendKeys "{end}"

Das entspricht dem Drücken der "Ende"-Taste. Die Markierung wird aufgehoben, der Cursor wird an das Ende der verbliebenen Zeichen gesetzt.

Abhängige Felder automatisch ausfüllen Angenommen, der Benützer eines VBA-Programmes kann in einem Dialogfeld aus einer Mitarbeiterliste auswählen. In einer Tabelle sind zu jedem Mitarbeiter auch Abteilung, Zimmernummer und Telefonklappe aufgeführt. Daher liegt es nahe, nach Auswahl des Mitarbeiters die anderen Eingabefelder automatisch ausfüllen zu lassen.


Abbildung 38:
Wird aus dem Listenfeld "Name" ein Name ausgewählt, stellt eine "Ereignis-Prozedur" die zum Mitarbeiter gehörenden Daten für Abteilung, Zimmer und Telefonklappe in die Eingabefelder.

Hier ist der Code:

'Objekt-Variable für Dialog1 deklarieren
Private Dialog1_DD_Name As DropDown
Private Dialog1_EB_Abteilung As EditBox
Private Dialog1_EB_Telefonklappe As EditBox
Private Dialog1_EB_Zimmer As EditBox

Private rMitarbeiterDaten As Range
'Objekt-Variablen die Dialogelemente zuweisen
Sub SetzeObjektVariableFürDialog1()

With DialogSheets("Dialog1").DrawingObjects
  Set Dialog1_DD_Name = .Item("Dialog1_DD_Name")
  Set Dialog1_EB_Abteilung = .Item("Dialog1_EB_Abteilung")
  Set Dialog1_EB_Telefonklappe = .Item("Dialog1_EB_Telefonklappe")
  Set Dialog1_EB_Zimmer = .Item("Dialog1_EB_Zimmer")
End With

End Sub
'Dialogfeld-Elemente auf Anzeige vorbereiten
Sub Dialog1_BeiAnzeigen()

  Call SetzeObjektVariableFürDialog1

  Dialog1_DD_Name.OnAction = "Dialog1_DD_Name_EreignisProzedur"
  
  'Tabellenbereich mit Mitarbeiter-Daten Objekt-Variabler zuweisen
  Set rMitarbeiterDaten = _
    ThisWorkbook.Sheets("Tabelle1").Cells(1, 1).CurrentRegion
  Set rMitarbeiterDaten = _
    rMitarbeiterDaten.Offset(1).Resize(rMitarbeiterDaten.Rows.Count - 1)
  
  Dialog1_DD_Name.List = rMitarbeiterDaten.Columns(1)
  Dialog1_DD_Name.ListIndex = 1
  
  Call Dialog1_DD_Name_EreignisProzedur
  
End Sub
'Abhängige Bearbeitungsfelder nach Auswahl eines Namens
'füllen
Sub Dialog1_DD_Name_EreignisProzedur()

Dialog1_EB_Abteilung.Text = _
  rMitarbeiterDaten.Cells(Dialog1_DD_Name.ListIndex, 2).Value
Dialog1_EB_Zimmer.Text = _
  rMitarbeiterDaten.Cells(Dialog1_DD_Name.ListIndex, 3).Value
Dialog1_EB_Telefonklappe.Text = _
  rMitarbeiterDaten.Cells(Dialog1_DD_Name.ListIndex, 4).Value

End Sub

Erklärung Wie haben wir den Abteilungs-Namen gefunden? Wir fragen zunächst die "Listindex"-Eigenschaft des Listenfeldes ab. Sie gibt uns eine Zahl zurück, die laufende Nummer des ausgewählten Eintrages im Listenfeld. Angenommen, wir haben "Mück" gewählt, dann ist das eine Zwei, denn Mück ist der zweite Eintrag. Genauso ist "Mück" aber der zweite Eintrag im Tabellenbereich "rMitarbeiterDaten", aus dem wir die Liste gefüllt haben. Daher finden wir den Abteilungsnamen in jener Zelle von "rMitarbeiterDaten", die in der zweiten Zeile und in der zweiten Spalte steht. Obwohl "rMitarbeiterDaten" nur eine Spalte breit ist, können wir mit der "Cells"-Methode über diese Grenze hinausgreifen. In Spalte Drei finden wir dann die Zimmer-Nummer, in Spalte Vier die Telefonklappe. Wichtig: Spalte Eins ist nicht notwendig Spalte A. Es ist, wie die folgende Abbildung zeigt, die erste Spalte von "rMitarbeiterDaten"!


Abbildung 39:
Der Tabellenbereich "rMitarbeiterDaten" ist zwar nur eine Spalte breit, aber wir können dennoch feststellen, welchen Wert eine Zelle in (vom Bereich weg gesehen) Spalte 2, Spalte 3 usw hat. Die "Cells"-Methode macht es möglich.

Beispiele zu diesem Kapitel finden Sie in der Datei "ABHAENGIG.XLS".

Dialogfeld-Elemente im Überblick

DIALOGFRAME (DIALOGRAHMEN)

Der Dialogfeldrahmen stellt den Hintergrund für benutzerdefinierte Dialogfelder dar. Er weist keine Formatierungseigenschaften auf, sondern lediglich eine Position, eine Größe und einen Titel. Pro Dialogblatt gibt es nur einen Dialogfeldrahmen, der weder gelöscht, noch vor ein anderes Grafikobjekt geschoben werden kann. In Tabellenblättern gibt es keine Dialogfeldrahmen.

Wichtige Eigenschaften des Dialograhmens
Eigenschaft Werte bewirkt
Text beliebige Zeichen Setzt/ändert Titel des Dialogfeldes
Left, Top, Height, Width Zahl Setzt/ändert Position und Größe des Dialogfeldes. Kann auch verändert werden, während der Dialog angezeigt wird

DIE DRAWINGOBJECTS-AUFLISTUNG

Alle Dialogelemente auf einem Dialogblatt sind Teil der "DrawingObjects"-Auflistung. Dieses Container-Objekt ist wichtig, wenn es gilt, alle Elemente eines Dialoges zu untersuchen. Die Datei "DlgVars.XLS" wäre ohne dieses Objekt kaum denkbar: Sie schreibt automatisch den Code für ein komplettes Dialogfeld in ein Modulblatt. Dabei untersucht sie Element für Element in dessen Eigenschaft als Mitglied der "DrawingObjects".

Das Beispiel-Programm dazu: "DlgVars.XLS"
Gemeinsame Eigenschaften aller Dialog-Elemente
Eigenschaft Werte bewirkt
Visible True, False Element ist sichtbar/nicht sichtbar
Enabled True, False Element kann mit Tastatur oder Maus geändert werden/nicht geändert werden
Top, Left Zahl Position im Dialograhmen Wichtig: Kann nur gesetzt werden, wenn der Dialog nicht angezeigt wird

TEXTBOX (TEXTFELD)

Statischer Text zur Erklärung der Dialogelemente für Ein- und Ausgabe. Der Inhalt des Feldes kann über die Eigenschaft "Text" sowohl vor dem Anzeigen des Dialogs als auch zur Laufzeit des Dialogs verändert werden:

ActiveDialog.[textfeldname].Text="Soeben verändert"

EDITBOX (BEARBEITUNGSFELD)

Nimmt Text durch Tastatureingabe auf oder zeigt Text an, der über ein VBA-Programm in das Feld gestellt wurde. Der Inhalt des Feldes kann über die Eigenschaft "Value" zur Laufzeit des Dialogs verändert werden:

ActiveDialog.[bearbeitungsfeldname].Value="Soeben verändert"

Gleichermaßen kann der Inhalt ausgelesen werden:

Variable= ActiveDialog.[bearbeitungsfeldname].Value

Der Text im Bearbeitungsfeld wird durch Zuweisung einer leeren Zeichenkette gelöscht:

ActiveDialog.[bearbeitungsfeldname].Value =""

Das Bearbeitungsfeld kann auch nur zur Anzeige eines Textes verwendet werden. Dies wird über die "Wählbar"-Eigenschaft gesteuert:

ActiveDialog.[bearbeitungsfeldname].Enabled=False

Schließlich kann ein Bearbeitungsfeld auch unsichtbar gemacht werden.

ActiveDialog.[bearbeitungsfeldname].Visible=False

Kontrollmöglichkeiten während des Programm-Laufs Während Text in einer Editbox eingegeben oder bearbeitet wird, verzweigt VBA nach jedem Tastendruck in die zugehörige Ereignis-Prozedur. So läßt sich zum Beispiel prüfen, ob der eingegebene Text eine Zahl ergibt (siehe oben die Prozedur "PruefeObZahl").

GROUPBOX (GRUPPENFELD)

Rahmen zur optischen Gestaltung eines größeren Dialogfeldes und zur Steuerung einander gegenseitig ausschließender Optionen. Für alle mit ihrer linken oberen Ecke im Groupbox-Rahmen stehenden Optionsfelder gilt, daß nur eines von ihnen ausgewählt sein kann. Die (von oben nach unten) fortlaufende Nummer der im Gruppenfeld ausgewählten Option können Sie in einer Tabellenzelle ablegen und erfragen. Es gibt aber in EXCEL 7.0 keine Möglichkeit, mit einem VBA-Befehl die Nummer zu erfragen. Stattdessen muß jedes Optionsfeld einzeln geprüft werden.

BUTTON (SCHALTFL&AUMLCHE)

Löst Vorgänge aus. Die Schaltflächen "OK" und "Abbrechen"sind standardmäßig vorgegeben, weitere Schaltflächen werden beim Zeichnen des Dialogfeldes dazugefügt. Jeder Schaltfläche kann (über das Menü "Format" und den Befehl "Objekt...") eine oder mehrere der vier Funktionsweisen "Standard", "Abbrechen", "Schließen" und "Hilfe" zugeordnet werden:

Standard ist ausgewählt (stark umrandet); wird die Enter-Taste gedrückt, verhält sich der Dialog so, als wäre die Standard-Schaltfläche angeklickt worden
Abbrechen Dialog gilt als "Abgebrochen", gibt an den aufrufenden Code den Wert "False" zurück
Schließen Dialog wird beendet, Dialogfeld wird geschlossen. Gibt an den aufrufenden Code "True" zurück
Hilfe Schaltfläche erhält den Text "Hilfe"

Diese Funktionsweisen können Schaltflächen auch durch VBA-Code zugewiesen werden oder durch Code erfragt werden:

Button-Objekt.DefaultButton  ("True" oder "False")
Button-Objekt.CancelButton ("True" oder "False")
Button-Obkekt.DismissButton ("True" oder "False")
Button-Objekt.HelpButton ("True" oder "False")

Diese Eigenschaften eines Buttons können nebeneinander festgelegt werden. Einem Standard-Button kann zum Beispiel die (immer vorgegebene) Eigenschaft, bei Anklicken das Dialogfeld zu schließen, entzogen werden:

ActiveDialog.Buttons("Dlg_BT_OK").DissmissButton=False

Button-Aufschrift ändern Die Beschriftung jedes Buttons ist durch seine "Caption"-Eigenschaft festgelegt. Diese kann erfragt und geändert werden, bevor oder während der Dialog angezeigt wird:

If ActiveDialog.Buttons("Dlg_BT_OK").Caption = "Guten Abend" Then
  ActiveDialog.Buttons("Dlg_BT_OK").Caption = "Guten Morgen"
End If

Hinweis Egal, wie hoch Sie einen Schaltknopf machen, Text stellt er immer nur in einer Zeile dar.

CHECKBOX (KONTROLLK&AUMLSTCHEN)

Kennt drei Werte: Angekreuzt, nicht angekreuzt, teilweise angekreuzt. Der Zustand kann mit Hilfe der "Value"-Eigenschaft und dreier Konstanten erfragt oder gesetzt werden:

If ActiveDialog.[kontrollkästchen].Value= xlOn Then
  ActiveDialog.[kontrollkästchen].Value = xlOff
ElseIf ActiveDialog.[kontrollkästchen].Value = xlOff Then
 ActiveDialog.[kontrollkästchen].Value = xlMixed
End If

OPTIONBOX (OPTIONSFELD)

Kann ausgewählt oder nicht ausgewählt sein. Liegen mehrere Optionsfelder mit ihrer linken oberen Ecke in einem Gruppenfeld-Rahmen, sorgt EXCEL dafür, daß jeweils nur eines von ihnen ausgewählt werden kann.

If ActiveDialog.[Optionsfeld].Value= xlOn Then
  ActiveDialog.[ Optionsfeld].Value = xlOff
ElseIf ActiveDialog.[ Optionsfeld].Value = xlOff
  ...
End If

LISTBOX (LISTENFELD)

Bildet die Einträge in einem zusammenhängenden Bereich einer Tabelle ab. Es können, je nach Einstellung des Listenfeldes über FORMAT, OBJEKT

ausgewählt werden. Der Tabellenbereich, der die Liste enthält, kann in diesem Dialog im Bearbeitungsfeld "Listenbereich" angegeben werden.

Ein "einfaches" Listenfeld gibt die Zahl des Elementes in der Liste zurück, welches ausgewählt worden ist. Die Zahl wird in jener Zelle, deren Bezug im Dialog FORMAT, OBJEKT ins Feld "Ausgabeverknüpfung" eingetragen worden ist, hinterlegt. Sie kann auch durch Abfragen der Eigenschaft "Listindex" erfragt werden. Die beiden eine Mehrfachauswahl zulassenden Listenfeldtypen liefern Datenfelder, die die Position der ausgewählten Listeneinträge enthalten. Leider führt die in der Online-Hilfe für EXCEL 5.0 angegebene Syntax für die Mehrfachauswahl zu einem Laufzeitfehler, sodaß dafür keine Beispiele gegeben werden können. In EXCEL für Windows95 ist Mehrfach-Auswahl wie in der Online-Hilfe beschrieben möglich.

Listenfelder werden über folgende Eigenschaften gesteuert:

Eigenschaft verlangt bewirkt
List Datenfeld, Bereichsobjekt Liste wird mit den Elementen des Datenfeldes gefüllt
List(Zahl) Zahl zw. 1 und Anzahl der Elemente im Listenfeld Beim Setzen: legt den Wert des Listenfeld-Eintrages "Zahl" fest

Beim Lesen: Gibt den Wert des Listenelementes an der Stelle von "Zahl" aus

ListIndex(Zahl) Zahl Beim Setzen: Legt das aktive Element der Liste fest

Beim Lesen: gibt Position des aktiven Elementes in der Liste zurück

ListCount Gibt Anzahl der Elemente im Listenfeld zurück
ListFillRange Verweis auf einen Tabellenbereich in Textform Beim Setzen: Liste wird mit dem Wert der Zellen des Tabellenbereiches gefüllt
Beim Lesen: gibt den Tabellenbereich als Text zurück, aus dem die Liste gefüllt wurde

Listenfelder werden über folgende Methoden verändert:

Methode bewirkt
AddItem Liste erhält ein zusätzliches Element
RemoveItem Löscht ein Element aus der Liste
RemoveAllItems Löscht die ganze Liste
"List" oder "ListFillRange", das ist hier die Frage...

"List" füllt die Liste aus den Einträgen eines Datenfeldes, "ListFillRange" aus den Zellen eines Tabellenbereiches. Verwenden Sie dennoch auch für Tabellen-Listen "List", den "ListFillRange" gibt sowohl beim Löschen als auch beim Hinzufügen von Listeneinträgen den Geist auf. Und EXCEL ist gescheit genug, die Zellen eines Tabellenbereiches automatisch in ein Datenfeld umzuwandeln, sobald "List" mit Hilfe einer Objekt-Variablen der Tabellenbereich gezeigt wird.

Die "List"-Eigenschaft

Weist einer Liste die Elemente eines Datenfeldes oder eines als Objekt-Referenz vorliegenden Zellbereiches zu.

Syntax 1 - ganze Liste

Objekt.List

Beispiel

Set rDieListe = ThisWorkbook.Sheets("Tabelle1"). _
  Cells(1, 1).CurrentRegion
Dlg1_Listbox_1.List = rDieListe 

Listenbereich der Tabelle wird mit einem EXCEL-Namen angesprochen Angenommen, Sie haben in einer Tabelle einen Bereich von Zellen mit einem Namen versehen (in unserem Fall "TabellenZellenFuerListe"), dann können Sie mit Hilfe der Methode "Evaluate" diese Zelladresse in eine Objekt-Referenz umwandeln und die Referenz dann der "List"-Eigenschaft zuweisen:

ThisWorkbook.DialogSheets("Dialog1"). _
  ListBoxes("Dialog1_LB_DieListe").List = Evaluate("TabellenZellenFuerListe")
Listenbereich der Tabelle wird mit Zellreferenz angesprochen Auch hier hilft wieder die Methode "Evaluate" weiter:
Sheets("Dialog1").ListBoxes("Dialog1_LB_DieListe").List = _
  Evaluate("[ListeNeu.xls]Tabelle1!C1:C12")
Syntax 2 - einzelne Listenelemente
Objekt.List(Index)

Wert eines Listen-Elementes erfragen Dazu weisen wir das Ergebnis von "List(Index)" einer Variablen zu oder verwenden es in einer Anweisung:

' Wert von Listen-Element 6 erfragen
vListenwert=Dlg1_DasListenfeld.List(6)
' Wert des aktiven, gerade ausgewählten Listen-Elementes erfragen
vListenwert=Dlg1_DasListenfeld.List(Dlg1_DasListenfeld.ListIndex)
' Inhalt von Element 6 prüfen
If Dlg1_DasListenfeld.List(6)= "Guten Morgen" Then ...

Wert eines Listen-Elementes setzen Dazu weisen wir dem Listen-Element den Wert zu:

sAntwort = InputBox("Bitte geben Sie den neuen Text " & _
    "des Listeneintrags an:")
  If sAntwort = "" Then Exit Sub
  Dialog1_LB_DieListe.List(Dialog1_LB_DieListe.ListIndex) = sAntwort
Die "ListIndex"-Eigenschaft

Syntax

Objekt.ListIndex

Gibt die fortlaufende Nummer des aktiven Listen-Elementes wieder. Diese Eigenschaft legt fest oder informiert darüber, welches Element der Liste "aktiv" ist, also ausgewählt erscheint oder ausgewählt wurde. "ListIndex" ist immer eine Zahl.

Beispiele

Element 4 der Liste auswählen (erscheint mit Balken unterlegt):

[Listenfeld-Referenz].ListIndex=4

Fortlaufende Nummer des Elements innerhalb der Liste anzeigen, das ausgewählt wurde:

MsgBox [Listenfeld-Referenz].ListIndex 

Inhalt des ausgewählten Listenelementes erfragen

Wenn der Listenbereich als Text vorliegt und "Listenindex" den Wert 2 hat.

MsgBox Application.Index([[MAPPE1]Tabelle1!A1:A5], 2)

Beachten Sie die beiden eckigen Klammerpaare!

Die "ListCount"-Eigenschaft

Gibt als Zahl die Anzahl der Listen-Elemente wieder. Nützlich, wenn es darum geht, alle Elemente einer Liste in eine Tabelle zu schreiben:

For iZaehler = 1 To Dialog1_LB_DieListe.ListCount
      rListenBereich.Cells(iZaehler, 1).Value = Dialog1_LB_DieListe.List(iZaehler)
Next
ListFillRange (Listenbereich)

Die Adresse des Tabellenbereiches, der die Einträge der Liste enthält, in Text-Form. Achtung: die Adresse muß in Textform angegeben werden; mit Objektvariablen, die eine Referenz auf den Tabellenbereich enthalten, kann "Listenbereich" nicht gefüttert werden!

Beispiel:

[Listenfeld-Referenz].ListFillRange="[MAPPE5.XLS]Tabelle3!A2:A14"

nicht aber:

Set Namenszellen=Workbooks("Mappe5.xls")._
  Sheets("Tabelle3").Range("A2:A14")
[Listenfeld-Referenz]. ListFillRange =Namenszellen

So geht es aber mit einer Objektvariablen:

[Listenfeld-Referenz]. ListFillRange=Namenszellen.Address (external:=True)

Die Address-Methode macht aus einer Objekt-Referenz wieder einen Referenz-Text. Das benannte Argument "external" stellt den vollständigen Text der Referenz bereit: Mappe, Blatt und Zellen.

DROPDOWN-LISTENFELD

Idente Funktionalität mit dem Listenfeld, jedoch muß die Liste durch Klicken auf die Schaltfläche am rechten Rand oder durch Drücken der Tasten "Alt"+"Pfeil-ab" erst aufgeklappt werden.

KOMBINATIONSFELD LISTE-TEXT

Besteht aus einem Bearbeitungsfeld und einem Listenfeld. Die beiden sind unabhängige Dialogfeld-Elemente, allerdings mit folgender Funktionalität verbunden:

Hinweis Ein Eintrag in das Bearbeitungsfeld wird nicht im Listenfeld gesucht. Selbst wenn er dort vorhanden ist, enthält die Ausgabeverknüpfungs-Zelle den Wert 0. Sie müssen also mit VBA-Code die ganze Liste durchsuchen. Wird der Text des Bearbeitungsfeldes nicht gefunden, müssen Sie ihn mit VBA-Code in die Liste einfügen.

Code für die praktische Arbeit mit einem Kombinationsfeld Liste-Text finden Sie in den Dateien "KombiListe.XLS" und "KombiFeld.XLS".


Abbildung 40:
"KombiListe.XLS" enthält Beispielscode für die Arbeit mit einem Kombinationsfeld Liste-Text. Nach jedem Eintrag kann durch Drücken auf den oberen Schaltknopf ("Prüfen...") festgestellt werden, ob der Eintrag schon in der Liste enthalten ist. Wenn ja, erfolgt eine Warnung. Der Schaltknopf "Eintrag in Liste sortiert aufnehmen" vergrößert den Tabellenbereich, aus dem das Listenfeld gespeist wird, um eine Zeile, schreibt in diese Zeile den neuen Eintrag, sortiert den Tabellenbereich und weist ihn als Datenquelle wieder dem Listenfeld zu.

DROPDOWN LISTE-TEXT

 Mit Kombinationsfeld Liste-Text idente Funktionalität, doch muß die Liste durch Klicken auf die Schaltfläche am rechten Rand oder durch Drücken der Tasten "Alt"+"Pfeil-ab" erst aufgeklappt werden.

BILDLAUFLEISTE

Funktionalität wie in der in EXCEL eingebauten Datenmaske. Die Bildlaufleiste verwaltet eine ganze Zahl zwischen den beiden (einstellbaren) Eckwerten "Min" und "Max". Diese Zahl kann über die Eigenschaft "Value" ausgelesen und auch eingestellt werden. Jedes Klicken auf die Pfeile am oberen bzw. unteren Ende der Bildlaufleiste erhöht bzw. vermindert den aktuellen Wert der Bildlaufleiste. Der kleinste Wert ("Min"-Eigenschaft) ist 0, der größte ("Max"-Eigenschaft) ist 30000. Zusätzlich kann ein Wert für "LargeChange" eingestellt werden. Diese "Große Bewegung" wird ausgelöst, wenn Sie mit der Maus nicht auf den "Fahrstuhl" klicken, sondern auf die Flächen darüber und darunter.

DREHFELD

In der Funktionalität mit der Bildlaufleiste ident bis auf das Fehlen von "LargeChange". Drehfelder werden wahrscheinlich immer im Zusammenhang mit Bearbeitungsfeldern eingesetzt. Der Gleichklang zwischen Drehfeld und Bearbeitungsfeld ist eine verzwickte Aufgabe:

Beispiele für das Arbeiten mit Drehfeldern finden Sie in der Datei "Drehfeld.XLS". Der Modul "Mod DialogDrehfeld" enthält den Code für das Prüfen einer numerischen Eingabe, die zwischen den Grenzen eines Drehfeldes liegen muß. "Mod HalbstundenDrehfeld" zeigt in seinem Bearbeitungsfeld die Uhrzeit; diese kann mit dem Drehfeld halbstundenweise verändert werden.

vorheriges Kapitel Inhalt Hilfe Beispiele laden nächstes Kapitel

------------

Copyright © by JOANNEUM RESEARCH Forschungsgesellschaft mbH