UserForm mit dynamischen Feldinhalten erstellen

Hallo,

ich schon wieder.
Wenn ich nun eine eigene UserForm erstellen möchte, und dort verschiedene Felder haben möchte die mit Daten einer Sub gefüllt werden. Wie stelle ich das an.

Mein Beispiel:
Ich habe eine Liste mit 1500 Begriffen, dazu habe ich eine Suchfunktion gebaut. Wenn man nun nach einem bestimmten Begriff sucht, bekommt man erstmal angezeigt, wie viele Begriffe zu dem eingegebenen Wort gefunden wurden. Dann werden die einzelnen Begriffe und die dazugehörige Definition einzeln in einer MsgBox angezeigt. Nach bestätigung des OK-Buttons wird der nächste Begriff angezeigt, so lange bis keine Begriffe mehr da sind.

Nun würde ich gerne eine eigene UserForm für die Ausgabe der Begriffe erstellen, wo nach der Meldung, wie viele Begriffe gefunden wurden, die UserForm aufgeht und eine Liste mit allen gefunden Begriffen ist, die man dann einzeln anklicken kann und zur Definition gelangt.
Nun finde ich keine Möglichkeit, wie ich der UserForm sagen kann woher er sich die Daten zieht, da diese ja in Variablen in der Sub abgelegt sind und nicht als Liste in Excel.

Wie kann ich sowas anstellen, oder ist das nicht möglich?

Liebe Grüße
shiny

P.s. Wenn es etwas unklar beschrieben ist, fragt bitte nach, ich bin an der Lösung sehr interessiert.

Hallo, shiny!

Mein Beispiel:
Ich habe eine Liste mit 1500 Begriffen, dazu habe ich eine
Suchfunktion gebaut. Wenn man nun nach einem bestimmten
Begriff sucht, bekommt man erstmal angezeigt, wie viele
Begriffe zu dem eingegebenen Wort gefunden wurden. Dann werden
die einzelnen Begriffe und die dazugehörige Definition einzeln
in einer MsgBox angezeigt. Nach bestätigung des OK-Buttons
wird der nächste Begriff angezeigt, so lange bis keine
Begriffe mehr da sind.

Geht das nicht ziemlich auf die Nerven?

Nun würde ich gerne eine eigene UserForm für die Ausgabe der
Begriffe erstellen, wo nach der Meldung, wie viele Begriffe
gefunden wurden, die UserForm aufgeht und eine Liste mit allen
gefunden Begriffen ist, die man dann einzeln anklicken kann
und zur Definition gelangt.

Das ist ein besserer Ansatz.

Nun finde ich keine Möglichkeit, wie ich der UserForm sagen
kann woher er sich die Daten zieht, da diese ja in Variablen
in der Sub abgelegt sind und nicht als Liste in Excel.

Du hast Deine UserForm. Auf diese packst Du ein Listen-Steuerelement. Und in Deiner Sub hast Du bislang stehen „MsgBox …“. Statt dessen schreibst Du dort hinein:

DeineUserForm.DeineListBox.AddItem "Der neue Text"

Nachdem Du die Schleife mit allen Begriffen, die in die Listbox sollen, durchgelaufen bist, kannst Du Deine UserForm mit

DeineUserForm.Show

anzeigen. In der Userform kannst Du dann beim Klick auf die Liste in der Ereignisprozedur entsprechend reagieren und z. B. einen zusätzlichen Text in einem Textfeld anzeigen lassen.

Wie kann ich sowas anstellen, oder ist das nicht möglich?

Möglich ist generell erst mal fast alles:wink:

Gruß, Manfred

Möglich ist generell erst mal fast alles:wink:

Gruß, Manfred

Hallo Manfred,

Du bist ja ein Engel, vielen vielen Dank. Das mit der Liste funktioniert schon mal.
Nur bin ich irgendiwe immer noch zu blöd nun der TextBox die Definition zu übergeben wenn ich einen Begriff in der Liste angeklickt habe.

Schick Dir mal ein wenig Quellcode mit.

Das steht in meinem Modul (nur ein Ausschnitt):
For i = lZeile2 To 1 Step -1

Test = „*“
Test1 = Test & Such & Test

If Cells(i, Sp1) Like Test & Such & Test Then

Cells(i, Sp1).Select

FeldZahlM = i
FeldWahlM = „A“ & FeldZahlM
FeldWahlN = „B“ & FeldZahlM

Begriff = Range(FeldWahlM).Value
Definition = Range(FeldWahlN).Value

UserForm1.ListBox1.AddItem ("" & Begriff & „“)
'Frage = MsgBox("" & vbCrLf & „“ & Definition & „“ & vbCrLf & „“, vbOKCancel, Title:="" & Begriff & „“)

’ If Frage = vbCancel Then GoTo Ende

End If

Next i

UserForm1.Show

Jetzt habe ich mir gedacht das von der Schleife bestimmt was in

Private Sub ListBox1_Click()
UserForm1.TextBox1.AddItem ("" & Definition & „“)
End Sub

muss, oder?

Sorry das ich so doof fragen muss, aber das übersteigt einfach meinen Horizont

Liebe Grüße
shiny

Hallo, Shiny!

Bau Dir der Einfachheit halber eine zweite, nicht sichtbare Listbox.

For i = lZeile2 To 1 Step -1

Test = „*“
Test1 = Test & Such & Test

If Cells(i, Sp1) Like Test & Such & Test Then

Cells(i, Sp1).Select

FeldZahlM = i
FeldWahlM = „A“ & FeldZahlM
FeldWahlN = „B“ & FeldZahlM

Begriff = Range(FeldWahlM).Value
Definition = Range(FeldWahlN).Value

UserForm1.ListBox1.AddItem ("" & Begriff & „“)

Hier dann noch:
UserForm1.ListBox2.AddItem ("" & Definition & „“)

'Frage = MsgBox("" & vbCrLf & „“ & Definition & „“ &
vbCrLf & „“, vbOKCancel, Title:="" & Begriff & „“)

’ If Frage = vbCancel Then GoTo Ende

End If

Next i

UserForm1.Show

Dann in der Listbox:

Private Sub ListBox1\_Click()
 UserForm1.TextBox1 = UserForm1.ListBox2.List(UserForm1.ListBox1.ListIndex)
End Sub

Gruß, Manfred

1 Like

Hallo Manfred,

also nochmal ein riesen Dank. Dass funktioniert alles.
Du scheinst ja echt ein Profi zu sein :smile:

Nun noch eine letzte Frage:
Ich habe in meiner Excel-Tabelle mit Zeilenumbrüchen gearbeitet, die stellt er mir in der ListBox und in der TextBox mit diversen Symbolen dar, aber beachtet Sie nicht. Das heißt meine Definition passt nicht in die TextBox.

Gibt es da nicht irgendeinen Befehl, so nach dem Motto, „wenn Du dieses Zeichen findest, dann wechsel in eine neue Zeile“ ? Oder wie kann ich für die TextBox einstellen, dass die von sich aus einen Zeilenumbruch macht?

Liebe Grüße shiny

Hallo, Shiny!

Nun noch eine letzte Frage:
Ich habe in meiner Excel-Tabelle mit Zeilenumbrüchen
gearbeitet, die stellt er mir in der ListBox und in der
TextBox mit diversen Symbolen dar, aber beachtet Sie nicht.
Das heißt meine Definition passt nicht in die TextBox.

Die Textbox sollte eine „MultiLine“-Eigenschaft haben; setze diese auf TRUE, damit Zeilenumbrüche dargestellt werden.

Für die Listbox gibt es ein Problem: Du musst die Steuerzeichen rauswerfen. Das kannst Du z. B. mit

Begriff = Replace(Begriff, vbCr, "")
Begriff = Replace(Begriff, vbLf, "")

vor dem .AddItem erledigen.

(Ich weiß jetzt nicht, welche(s) Zeichen in Deiner Quelle für den Zeilenumbruch steht. Cr ist der „Wagenrücklauf“, Lf der „Zeilenvorschub“. Es gibt auch vbCrLf als Kombination aus beiden. Wenn immer noch kein Zeilenumbruch, sondern ein Sonderzeichen kommt, hast Du in Deiner Quelle nur Lf. Dann brauchst Du noch ein

Definition = Replace(Definition, vbLf, vbCrLf)

vorm .AddItem der zweiten Listbox. Falls kein Lf, sondern nur Cr verwendet wird, brauchst Du analog:

Definition = Replace(Definition, vbCr, vbCrLf)

Für die Beschreibung brauchst Du das nicht zu tun, da Du ja die Zeilenumbrüche im Textfeld haben willst und diese Listbox eh unsichtbar ist.

Gruß, Manfred

1 Like

Vielen vielen Dank, Du bist echt Spitze *großenBlumenstraußreicht*

Jetzt noch ein paar Schönheitsreparaturen und es läuft.

Liebe Grüße shiny