Discussion:
Listbox.Selected in Textboxen -> Ändern -> Textboxen in Listbox.Selected
(zu alt für eine Antwort)
Michael Ahrens
2006-12-11 20:14:55 UTC
Permalink
Hallo,

ich lasse mir in einem Userform ein dreispaltiges Listenfeld anzeigen
sowie drei Textboxen.
Beim Ereignis Lisbox_Change sollen die Werte aus dem markierten
Listenelement in die Textboxen übertragen werden.

Dort kann der Benutzer diese verändern und durch einen Button
"Übernehmen" übernehmen lassen. Hierzu sollen die Werte aus den drei
Textboxen in das Listbox-Element übertragen werden.

Hört sich einfach an, krieg ich aber nicht hin.

Das Auslesen mache ich über (i = markiertes Element)
TBox_0 = Lbox.List(i,0)
TBox_1 = Lbox.List(i,1)
TBox_2 = Lbox.List(i,2)

Über .Value oder .Text ging es nicht. Okay, macht Excel auch ganz brav.
Aber beim Zurückschreiben funktioniert es nicht.

Lbox.List(i,0) = Tbox_0
Lbox.List(i,1) = Tbox_1
Lbox.List(i,2) = Tbox_2

Auch ja, i ist "Public" definiert.

Hat jemand dazu einen Tipp ? Danke. Michael.
Melanie Breden
2006-12-12 09:27:35 UTC
Permalink
Hallo Michael,
Post by Michael Ahrens
ich lasse mir in einem Userform ein dreispaltiges Listenfeld anzeigen
sowie drei Textboxen.
Beim Ereignis Lisbox_Change sollen die Werte aus dem markierten
Listenelement in die Textboxen übertragen werden.
Dort kann der Benutzer diese verändern und durch einen Button
"Übernehmen" übernehmen lassen. Hierzu sollen die Werte aus den drei
Textboxen in das Listbox-Element übertragen werden.
weist du dem Listenfeld die Werte einzeln zu oder verwendest du die ControlSource-Eigenschaft?
Bei Verwendung eines Tabellenbereiches kannst du dem Listenfeld keine Werte per Code zurückschreiben.

Ich gehe mal davon aus, dass die Werte per Datenfeld initialisiert werden.
Dann entsteht das Problem, dass durch das Change-Ereignis die TextBoxen
ja wieder mit den alten Listenwerten gefüllt werden.

Ich verwende in solchen Fällen eine boolsche Variable als Flag,
damit bestimmter Code nicht ausgeführt wird:

Dim blbChange As Boolean

Private Sub Lbox_Change()
If blbChange = True Then Exit Sub
TBox_0.Text = Lbox.List(i, 0)
TBox_1.Text = Lbox.List(i, 1)
TBox_2.Text = Lbox.List(i, 2)
End Sub

Private Sub Übernehmen_Click()
' Flag auf True setzen, damit Code im
' Change-Ereignis nicht ausgeführt wird
blbChange = True
Lbox.List(i, 0) = TBox_0.Text
Lbox.List(i, 1) = TBox_1.Text
Lbox.List(i, 2) = TBox_2.Text
' Flag zurücksetzen
blbChange = False
End Sub


Mit freundlichen Grüssen
Melanie Breden
--
- Microsoft MVP für Excel -
Microsoft Excel - Die ExpertenTipps http://tinyurl.com/cmned
Das Excel-VBA Codebook http://excel.codebooks.de
Excel-Auftragsprogrammierung
Michael Ahrens
2006-12-12 21:02:12 UTC
Permalink
Post by Melanie Breden
Hallo Michael,
Post by Michael Ahrens
ich lasse mir in einem Userform ein dreispaltiges Listenfeld anzeigen
sowie drei Textboxen.
Beim Ereignis Lisbox_Change sollen die Werte aus dem markierten
Listenelement in die Textboxen übertragen werden.
Dort kann der Benutzer diese verändern und durch einen Button
"Übernehmen" übernehmen lassen. Hierzu sollen die Werte aus den drei
Textboxen in das Listbox-Element übertragen werden.
weist du dem Listenfeld die Werte einzeln zu oder verwendest du die
ControlSource-Eigenschaft?
Ich weise die Werte einzeln zu:


Dim i, Anzahl As Integer
Dim Index, Name, Bemerkung As String
Dim ...

With WorkSheet(Liste)
For i = 0 to Anzahl
...
...
Lbox.AddItem
Lbox.List
Lbox.List(i, 0) = .Cells(i+5,1)
Lbox.List(i, 1) = .Cells(i+5,2)
Lbox.List(i, 2) = .Cells(i+5,3)
Next i
End With

Dies geschieht im "Userform_Initiliaze".
Das Ereignis zum Beschreiben der Listbox wird einen Button ausgelöst:
"CommandButton_Click"
Post by Melanie Breden
Bei Verwendung eines Tabellenbereiches kannst du dem Listenfeld keine
Werte per Code zurückschreiben.
Ich gehe mal davon aus, dass die Werte per Datenfeld initialisiert werden.
Ja (Userform_Initiliaze, s.o.).
Post by Melanie Breden
Dann entsteht das Problem, dass durch das Change-Ereignis die TextBoxen
ja wieder mit den alten Listenwerten gefüllt werden.
Das hab ich nicht so richtig verstanden...
Post by Melanie Breden
Ich verwende in solchen Fällen eine boolsche Variable als Flag,
Dim blbChange As Boolean
Private Sub Lbox_Change()
If blbChange = True Then Exit Sub
TBox_0.Text = Lbox.List(i, 0)
TBox_1.Text = Lbox.List(i, 1)
TBox_2.Text = Lbox.List(i, 2)
End Sub
Okay. Wenn in die Lbox geschrieben wird (s.u.), dann tritt gleichzeitig
(s.o.) das LBox_Change Ereignis auf.
Excel springt auch in LBox_Change, führt Exit Sub aus, und Ende.
Post by Melanie Breden
Private Sub Übernehmen_Click()
' Flag auf True setzen, damit Code im
' Change-Ereignis nicht ausgeführt wird
blbChange = True
Lbox.List(i, 0) = TBox_0.Text
Lbox.List(i, 1) = TBox_1.Text
Lbox.List(i, 2) = TBox_2.Text
' Flag zurücksetzen
blbChange = False
End Sub
Das klappt bei mir zumindest nicht (ich denke habe keinen Fehler beim
Abschreiben gemacht).

Kann ich auch eine ganze Zeile i einer Listenbox füllen, frei nach dem
Motto:

Dim Text(3) As String

Text (0)=TBox_0.Text
Text (1)=TBox_1.Text
Text (2)=TBox_2.Text

LBox.List(i)=Text()
Post by Melanie Breden
Mit freundlichen Grüssen
Melanie Breden
Melanie Breden
2006-12-13 18:05:40 UTC
Permalink
Hallo Michael,
Post by Michael Ahrens
Okay. Wenn in die Lbox geschrieben wird (s.u.), dann tritt gleichzeitig
(s.o.) das LBox_Change Ereignis auf.
Excel springt auch in LBox_Change, führt Exit Sub aus, und Ende.
Post by Melanie Breden
Private Sub Übernehmen_Click()
' Flag auf True setzen, damit Code im
' Change-Ereignis nicht ausgeführt wird
blbChange = True
Lbox.List(i, 0) = TBox_0.Text
Lbox.List(i, 1) = TBox_1.Text
Lbox.List(i, 2) = TBox_2.Text
' Flag zurücksetzen
blbChange = False
End Sub
Das klappt bei mir zumindest nicht (ich denke habe keinen Fehler beim
Abschreiben gemacht).
erhälst du eine Fehlermeldung?
Hast du blnChange global im Modul der UserForm deklariert?
Setze in die Aufrufzeilen jeder Sub einen Haltepunkt und gehe die
Prozeduren schrittweise mit F8 durch.
Überprüfe dabei den Wert der Textboxen und Listenfeldeinträge.
Post by Michael Ahrens
Kann ich auch eine ganze Zeile i einer Listenbox füllen, frei nach dem
Dim Text(3) As String
Text (0)=TBox_0.Text
Text (1)=TBox_1.Text
Text (2)=TBox_2.Text
LBox.List(i)=Text()
das habe ich jetzt nicht getestet, denke aber dass es nicht geht.
Probiers doch einfach mal aus.


Mit freundlichen Grüssen
Melanie Breden
--
- Microsoft MVP für Excel -
Microsoft Excel - Die ExpertenTipps http://tinyurl.com/cmned
Das Excel-VBA Codebook http://excel.codebooks.de
Excel-Auftragsprogrammierung
Michael Ahrens
2006-12-12 21:18:20 UTC
Permalink
Post by Melanie Breden
Hallo Michael,
Post by Michael Ahrens
ich lasse mir in einem Userform ein dreispaltiges Listenfeld anzeigen
sowie drei Textboxen.
Beim Ereignis Lisbox_Change sollen die Werte aus dem markierten
Listenelement in die Textboxen übertragen werden.
Dort kann der Benutzer diese verändern und durch einen Button
"Übernehmen" übernehmen lassen. Hierzu sollen die Werte aus den drei
Textboxen in das Listbox-Element übertragen werden.
weist du dem Listenfeld die Werte einzeln zu oder verwendest du die
ControlSource-Eigenschaft?
Bei Verwendung eines Tabellenbereiches kannst du dem Listenfeld keine
Werte per Code zurückschreiben.
Ich gehe mal davon aus, dass die Werte per Datenfeld initialisiert werden.
Dann entsteht das Problem, dass durch das Change-Ereignis die TextBoxen
ja wieder mit den alten Listenwerten gefüllt werden.
Ich verwende in solchen Fällen eine boolsche Variable als Flag,
Dim blbChange As Boolean
Private Sub Lbox_Change()
If blbChange = True Then Exit Sub
TBox_0.Text = Lbox.List(i, 0)
TBox_1.Text = Lbox.List(i, 1)
TBox_2.Text = Lbox.List(i, 2)
End Sub
Private Sub Übernehmen_Click()
' Flag auf True setzen, damit Code im
' Change-Ereignis nicht ausgeführt wird
blbChange = True
Lbox.List(i, 0) = TBox_0.Text
Lbox.List(i, 1) = TBox_1.Text
Lbox.List(i, 2) = TBox_2.Text
' Flag zurücksetzen
blbChange = False
End Sub
Mit freundlichen Grüssen
Melanie Breden
Oder ist es besser, die LBox auslesen und neu zu erstellen ?
Loading...