AW: Eintrag aus Listbox löschen bzw ändern
26.12.2013 22:06:16
fcs
Hallo Marc,
hier kann es verschiedene Probleme geben:
1. Dein Code zum Löschen von Einträgen in der Tabelle ist geeignet für eine Listbox mit Mehrfachauswahl (Eigenschaft MultiSelect der Listbox ist nicht "0-fmMultiSelectSingle).
Bei einer Listbox mit Einfachauswahl ist er wirkungslos.
2. Da du für die Datenquelle der Listbox einen Zellbereich in einem Tabellenblatt festlegst kommt es zu Rückkopplungseffekten, wenn die Werte in der Tabelle geändert/gelöscht werden
- das Click-Ereignis wird gestartet
- eine Mehrfachauswahl in der Listbox wird zurückgesetzt.
Das Clickereignis kann man noch umgehen. Das Zurücksetzen der Mehrfachauswahl nicht.
Du solltest also deine Listbox für einzelauswahl konfigurieren.
Außerdem sollten die Textboxen für die Datumswerte so konfiguriert werden, dass auf gültige Eingaben geprüft wird und der Code des Commandbuttons sollte nicht die Textboxinhalte sondern den entsprechenden Datumswert in die Tabelle schreiben. Nur so funktioniert auch das Sortieren korrekt.
Nachfolgend der Code des Userforms, wie er etwa aussehen müßte.
Gruß
Franz
'Code des Userforms - erstellt/bearbeitet unter Excel 2010
Option Explicit
Private bolNoAction As Boolean
Private Sub Tagesort()
bolNoAction = True
With Worksheets("Gesamtübersicht").Range("BU8:BW37")
.Sort key1:=.Cells(1, 2), order1:=xlAscending, _
key2:=.Cells(1, 3), order2:=xlAscending, _
key3:=.Cells(1, 1), order3:=xlAscending, Header:=xlNo
End With
bolNoAction = False
End Sub
Private Sub CommandButton1_Click()
'Daten zum selektierten Listeneintrag ändern - Textboxinhalte in Tabelle eintragen
Dim lngZeile As Long
Dim intItem As Integer
bolNoAction = True
With Me.ListBox1
lngZeile = .ListIndex + 8
End With
With Worksheets("Gesamtübersicht")
'von-Datum
If Me.TextBox1 = "" Then
.Cells(lngZeile, 74).ClearContents
ElseIf IsDate(Me.TextBox1) Then
.Cells(lngZeile, 74).Value = CDate(Me.TextBox1)
Else
.Cells(lngZeile, 74).Value = Me.TextBox1
End If
'bis-Datum
If Me.TextBox2 = "" Then
.Cells(lngZeile, 75).ClearContents
ElseIf IsDate(Me.TextBox2) Then
.Cells(lngZeile, 75).Value = CDate(Me.TextBox2)
Else
.Cells(lngZeile, 75).Value = Me.TextBox2
End If
End With
Call Tagesort
UserForm1.Repaint
bolNoAction = False
Me.ListBox1.ListIndex = -1
TextBox1.Value = ""
TextBox2.Value = ""
End Sub
Private Sub CommandButton2_Click()
'markierten Eintrag löschen
Dim lngZeile As Long
Dim intItem As Integer
bolNoAction = True
With Me.ListBox1
lngZeile = .ListIndex + 8
End With
With Worksheets("Gesamtübersicht")
.Range(.Cells(lngZeile, 74), .Cells(lngZeile, 75)).ClearContents
End With
Call Tagesort
UserForm1.Repaint
bolNoAction = False
Me.ListBox1.ListIndex = -1
TextBox1.Value = ""
TextBox2.Value = ""
End Sub
Private Sub ListBox1_Click()
'Daten des selektierten Listeneintrag in Textboxen eintragen
If bolNoAction = True Then Exit Sub
With ListBox1
If .ListIndex = -1 Then
TextBox1.Value = ""
TextBox2.Value = ""
Else
'von-Datum
If .List(.ListIndex, 1) = "" Then
TextBox1.Value = ""
ElseIf IsNumeric(.List(.ListIndex, 1)) Then
TextBox1.Value = Format(.List(.ListIndex, 1), "DD.MM.YYYY")
Else
TextBox1.Value = .List(.ListIndex, 1)
End If
'bis-Datum
If .List(.ListIndex, 2) = "" Then
TextBox2.Value = ""
ElseIf IsNumeric(.List(.ListIndex, 2)) Then
TextBox2.Value = Format(.List(.ListIndex, 2), "DD.MM.YYYY")
Else
TextBox2.Value = .List(.ListIndex, 2)
End If
End If
End With
End Sub
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
'Prüfung der Eingabe auf gültiges Datum
With Me.TextBox1
If .Value = "" Then
'do nothing
ElseIf IsDate(.Value) Then
.Value = Format(CDate(.Value), "DD.MM.YYYY")
Else
MsgBox "Eingabe ist kein gültiges Datum", vbInformation + vbOKOnly, _
"Prüfung Eingabe - Von-Datum"
Cancel = True
End If
End With
End Sub
Private Sub TextBox2_Exit(ByVal Cancel As MSForms.ReturnBoolean)
'Prüfung der Eingabe auf gültiges Datum
With Me.TextBox2
If .Value = "" Then
'do nothing
ElseIf IsDate(.Value) Then
.Value = Format(CDate(.Value), "DD.MM.YYYY")
Else
MsgBox "Eingabe ist kein gültiges Datum", vbInformation + vbOKOnly, _
"Prüfung Eingabe - Bis-Datum"
Cancel = True
End If
End With
End Sub
Private Sub UserForm_Initialize()
ListBox1.RowSource = "Gesamtübersicht!BU8:BW37"
End Sub