Userform, Liste und Eingabefeld

Informationen und Beispiele zu den hier genannten Dialog-Elementen:
UserForm ListBox TextBox MsgBox


Excel-Version: 8.0 (Office 97)
nach unten

Betrifft: Userform, Liste und Eingabefeld
von: Susi
Geschrieben am: 30.05.2002 - 17:28:58

Liebe Excel-Gemeinde,

bin soweit (verzweifelt), daß mein Problem wohl nur mittels einer Userform zu lösen ist. Nur damit habe ich überhaupt keine Erfahrung (Bisher reichte mir immer eine Input-Box).

Nach Anklicken einer Schaltfläche soll der Anwender eine dreistellige Identifikationsnummer (ID) eingeben. Es gibt aber ca. 100 verschiedene. Sie stehen in einer Tabelle in H2:I100. Spalte H enthält die IDs, Spalte I die Bezeichnung im Klartext alphabetisch sortiert. Die IDs, die am häufigsten gebraucht werden, weiß man auswendig, beim Rest müßte man nachschauen können.

Deshalb möchte ich (wohl oder übel) eine Userform, die ein Eingabefeld enthält, in das man die ID, die man kennt, direkt eingeben kann. Wenn es um eine ausgefallene ID geht, soll der Anwender diese aus einer Liste (ListBox oder Combobox?), in der die Klartexte (also die aus Spalte I) stehen, auswählen können. D.h., wenn er den gewünschten Eintrag anklickt soll (nur) die dazugehörende ID (also die aus Spalte H) in das Eingabefeld übernommen werden.

Außerdem werde ich wohl zwei Schaltflächen brauchen, "Abbrechen" und "OK". Wenn "OK" angeklickt wird, soll der Wert der im Eingabefeld steht in die Variable "ID" übernommen werden.

Soweit so gut, nur wie ich das umsetzen kann, dafür brauche ich bitte Eure Hilfestellung.

Liebe Grüße von Susi

nach oben   nach unten

Re: Userform, Liste und Eingabefeld
von: guenter
Geschrieben am: 30.05.2002 - 17:46:00

https://www.herber.de/mailing/dialog.htm
lies dich mal da durch
Hans hat doch alles
nach oben   nach unten

Das erschlägt mich ...
von: Susi
Geschrieben am: 30.05.2002 - 17:59:07

Lieber Guenter,

Dein Hinweis ist zwar ganz arg lieb, aber ich habe (gestern und heute) schon so viel gelesen (Online-Hilfe, hier im Archiv etc.), ganz ehrlich ich sehe den Wald vor lauter Bäumen nicht mehr. Ich werde - versprochen - mir auch diese Dinge anschauen, aber im Moment brauche ich einfach einen/mehrere konkretere Schubse; wenn mal halt noch nie mit Userform ...

Trotzdem nochmals Danke, Susi


nach oben   nach unten

Step by Step ....
von: Rolf Kersjes
Geschrieben am: 30.05.2002 - 21:49:59

Hallo Susi,

na dann wollen wir's doch mal step by step versuchen.

Eine Schaltfläche hast du ja schon eingerichtet mit der du ein Makro starten kannst.

Dann mußt du zuerst eine UserForm anlegen:

In der Entwicklungsumgebung machst du das mit Einfügen/Userform.

Dann hast du eine leere Userform mit dem Namen UserForm1 (den Namen lassen wir vorerst mal so, den kannst du später ändern), die du nun mit Elementen füllen musst. Dazu benötigst du die Werkzeugsammlung. Wenn die nicht bereits geöffnet ist findest du die unter Ansicht/Werkzeugsammlung.

Zuerst brauchen wir ein Listenfeld, such mal mit dem Mauszeiger in der Werkzeugsammlung (müsste das 5. Element sein) und klick es an. Jetzt kannst du in der Userform ein Rechteck aufziehen (linke Taste gedrückt und bei gewünschter Größe loslassen). Wenn du dir die Eigenschaften anschaust, entweder bereits links unten im vorhandenen Fenster, oder rechte Maustaste auf das Listenfeld klicken und Eigenschaften auswählen, wirst du den Namen ListBox1 des Listenfeldes sehen.

Unter Eigenschaften findest du auch ColumnCount, da trägst du eine 2 eine und unter RowSource z.B. Tabelle1!A1:B20 ,das ist nun der Tabellenbereich in dem deine Ausgangsdaten stehen.

So nun noch die beiden Schaltflächen. Das kennst du ja bereits von den normalen Schaltflächen. Symbol Befehlsschaltfläche in der Werkzeugsammlung auswählen und in der Userform zwei Schaltflächen ziehen.

Der ersten gibst du (wenn angeklickt) in den Eigenschaften unter 'Name' den Namen cmdOK und unter 'Caption' trägst du OK ein. Die zweite erhält den Namen cmdCancel und Caption Abbruch.

Dann noch mal mit der rechten Maustaste hintereinander mit der rechten Maustaste auf die beiden Befehlsschaltflächen klicken
und auf auf 'Code anzeigen' klicken. Damit sind dann schon die beiden Sub's für die Schaltflächen in dem Klassenmodul der Userform angelegt. Die müssen wir jetzt nur noch füllen.

Dazu müssen wir in das Klassenmodul der Userform mit rechte Maustaste im Projektexplorer auf UserForm1 klicken und Code anzeigen auswählen.

Da musst du nun noch folgendes eintragen:


Private Sub cmdCancel_Click()
Unload Me
End Sub

Private Sub cmdOK_Click()
DeineVariable = ListBox1.List(ListBox1.ListIndex, 0)
Unload Me
MsgBox "Ausgewählter Wert = " & DeineVariable
End Sub


Die Userform selbst rufst du in der Sub deiner Befehlsschaltfläche mit

Userform1.show

auf.

Ich hoffe ich hab nichts wichtiges vergessen. Wenns nich klappt, melde dich.


Rolf

nach oben   nach unten

Super, aber etwas fehlt (glaube ich) ...
von: Susi
Geschrieben am: 30.05.2002 - 21:59:26

Hallo Rolf,

daaaaaanke, da mache mich doch sofort noch dran. Wenn ich's beim ersten Durchlesen aber richtig verstanden habe, fehlt noch das Eingabefeld, um geläufige IDs direkt eingeben zu können?

Vielleicht bist Du ja noch im Forum ... ich bastele schon mal meine erste Userform ...

Liebste Grüße, Susi.


nach oben   nach unten

... und noch weitere Fragen
von: Susi
Geschrieben am: 30.05.2002 - 22:37:45

Hallo Rolf,

macht schon richtig Spaß, weil jetzt komme ich endlich weiter.

Aber zum einen bekomme ich noch einen Fehler, wenn ich keinen Eintrag in der Liste ausgewählt habe und trotzdem auf OK klicke. Laufzeitfehler 381: "Eigenschaft List konnte nicht abgerufen werden. Index des Eigenschaftenfeldes ungültig." Wie kann ich das verhindern?

Zum anderen, in der Tabelle mit den IDs und den Klartexten stehen die IDs in der ersten Spalten, die Texte in der zweiten (ist leider nicht änderbar). Kann man einstellen, daß entweder die Reihenfolge in der Liste andersherum ist, oder nur die zweite Spalte angezeigt wird?

Sorry, daß ich so viele Fragen habe.

Gruß Susi

nach oben   nach unten

Eins nach dem anderen...
von: Rolf Kersjes
Geschrieben am: 31.05.2002 - 09:42:52

Guten Morgen Susi,

also die Möglichkeit, dass du eine direkte Eingabe auch vorsehen willst, hatte ich vorher so nicht verstanden. Lösungsvorschlag:

Zusätzlich plazierst du noch ein Textfeld mit der Werkzeugsammlung in die vorhandene Userform. Das Ding heisst dann automatisch TextBox1. Mit Klick der rechten Maustaste auf die Userform kannst du die Aktivierungsreihenfolge bestimmen in der die Userform focusiert wird. Also dann TextBox1 ganz nach oben.

Dann musst du natürlich beim auslösen über den OK Button die Sub etwas umgestalten. Zusätzlich wolltest du ja die ID's in der ListBox1 ausblenden. Dazu gehen wir jetzt nicht mehr über die eingestellten Eigenschaften der Listbox (Column = 2 und die RowSorce = Tabelle.... kannst du löschen). Die setzten wir jetzt beim Initialisieren der Listbox. Das müsste dann etwa wie folgt aussehen.


Private Sub cmdCancel_Click()
Unload Me
End Sub

Private Sub cmdOK_Click()
If TextBox1 <> "" Then
    DeineVariable = TextBox1.Value
Else
    DeineVariable = ListBox1.List(ListBox1.ListIndex, 0)
End If
Unload Me
MsgBox "Ausgewählter Wert = " & DeineVariable
End Sub


Private Sub UserForm_Initialize()
With ListBox1
    .ColumnCount = 2
    .ColumnHeads = False
    .ColumnWidths = "0cm;3cm"
    .List = ThisWorkbook.Worksheets("Tabelle1").Range("a1:b20").Value
End With
End Sub

Ich hoffe, du kommst weiter. Bin jetzt ne Weile in Meetings schau später noch mal rein.

Rolf

nach oben   nach unten

Hoffe, ich habe alles richtig gemacht ...
von: Susi
Geschrieben am: 31.05.2002 - 13:20:55

Hallo Rolf,

vielen Dank für Deine erneute Hilfe. Ich glaube, ich hab's gepackt. Habe viel gelesen und probiert. Es läuft jetzt es so, wie ich es wollte.

Vielleicht kannst Du ja nochmal über meine Umbauten drüberschauen.

In einer Antwort von Hans habe ich gelesen, daß die Werte für die Listbox auch in einer anderen Datei stehen können. Deswegen so:

Private Sub UserForm_Initialize()
With ListBox1
.ColumnCount = 2
.ColumnHeads = False
.ColumnWidths = "0cm;3cm"
.List = Workbooks("ID-Nummern.xls").Worksheets("IDs").Range("H2:I100").Value
End With
End Sub

Um den in der Liste ausgewählten Klartext in die Textbox zu übernehmen, habe ich geschrieben:

Private Sub ListBox1_Change()
TextBox1.Value = ListBox1.Value
End Sub

Hatte erst mit ListBox1_Click rumprobiert, hat aber den Nachteil, daß die Textbox nicht aktualisiert wird, wenn die automatisch vorhandene Suchfunktion verwendet wird. D.h. ich tippe T ein und die Liste springt zum ersten Eintrag, der mit T beginnt. Mit ListBox1_Change ändert sich aber auch in diesem Fall die Textbox.

Um zu kontrollieren, dass wirklich eine Zahl (mit der korrekten Anzahl Stellen) eingegeben wird, und ob überhaupt etwas eingegeben wurde, habe ich das Klicken auf OK so abgeändert:

Private Sub cmdOK_Click()

If Len(TextBox1.Value) <> 3 Or IsNumeric(TextBox1.Value) = False Then
MsgBox ("Die ID muss eine 3stellige Zahl sein !"), _
48, "Ungültige Eingabe !"
Exit Sub

ElseIf TextBox1 = "" Then
MsgBox ("Sie haben noch keine ID eingegeben !"), _
48, "ID ?"

Else
LiefNr = TextBox1.Value
Unload Me
End If
End Sub

Und damit hatte ich dann den Wert zwar in der MsgBox, aber nicht in meinem Makro!!! Habe dann aber im Archiv gefunden, dass ich ganz an den Anfang des Moduls "Public ID As String" setzen muss.

Schwitz, Stöhn ... (Stunden später) ... Freu

Vielen, vielen Dank, Susi

nach oben   nach unten

Trommelwirbel ......
von: Rolf Kersjes
Geschrieben am: 31.05.2002 - 13:51:47

Hallo Susi,

Anerkennung in schärfster Form. Dem ist nichts hinzuzufügen. Hast du gut und richtig gemacht.

Nur noch ein kleiner Hinweis: In der Zeile

48, "Ungültige Eingabe !"

kannst du die 48 zur besseren Lesbarkeitkeit auch durch

vbExclamation, "Ungültige Eingabe !"

ersetzen. So kannst du auch verschiedene miteinander kombinieren z.B.

vbOKOnly + vbCritical

Ansonsten noch ein schönes Wochenende.

Rolf

nach oben   nach unten

Dann nochmals 1000 Dank (oT)
von: Susi
Geschrieben am: 31.05.2002 - 16:30:04


 nach oben

Beiträge aus den Excel-Beispielen zum Thema "Userform, Liste und Eingabefeld"