AW: Listbox statt Datenliste?
20.11.2017 14:00:18
fcs
Hallo Claudia,
- Ich würde die Eingabe nur über die Liste machen wollen.
Daran kann dich ja niemand hindern, die Datengültigkeitsprüfung wäre dann nur ein Absicheung gegen manuelle Falscheingaben.
- Ist es möglich - wenn ich einen Buchstabe eingebe - dass die Liste dann zu diesen Buchstaben spring und ich dann die richtige Auswahl treffen? In Deiner Liste würde ich mit M zu M01 springen und könnte dort dann den gewünschten Wert auswählen.
Diese Funktionalität kann man über die Eigenschaften der Listbox einstellen (MatchEntry = 0 - frmMatchEntryFirstLetter) und ist meines Wissens die Standardeinstellung für Listboxen.
- Nach der "finalen" Auswahl soll der Cursor immer in die nächsten Zeile und dort in die Spalte B springen. Vermutlich bräuchte man dann noch ein OK und ein Abbrechen Button?
Im Makro hab ich es jetzt so eingerichtet, dass mit ENTER oder Pfeiltasten links/rechts die Listbox verlassen und Spalte B in der Folgezeile selektiert wird. Ebenso wenn nach der Auswahl eine beliebige Zelle per Maus selektiert/die Listbox verlassen wird.
- Ich habe die Liste um ein langes Wort erweitert was in der Auswahl dann aber nur zum Teil angezeigt wird. Ist es möglich, die Auswahlliste anzupassen, so dass ich den gesamten Begriff sehen kann?
Hier musst du wie bereits beschrieben den Entwurfsmodus für die Steuerelemente aktivieren, dann kannst du die Breite der Listbox vergrößern.
Gruß
Franz
Private Sub ListBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
Select Case KeyCode
Case 13, 37, 39 'Enter, Pfeil links, Pfeil rechts
Application.EnableEvents = False
With Me.ListBox1
'bei verlassen der Listbox nächste Zeile Spalte B selektieren
Me.Cells(Me.Range(.LinkedCell).Row + 1, 2).Select
.LinkedCell = ""
.Visible = False
End With
Application.EnableEvents = True
Case Else
'do nothing
' MsgBox KeyCode
End Select
End Sub
Private Sub ListBox1_LostFocus()
Application.EnableEvents = False
With Me.ListBox1
'bei verlassen (z.B. mit Maus) der Listbox nächste Zeile Spalte B selektieren
Me.Cells(Me.Range(.LinkedCell).Row + 1, 2).Select
.LinkedCell = ""
.Visible = False
End With
Application.EnableEvents = True
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim varWert
On Error GoTo Fehler
'Prüfen ob eine auszufüllende Zelle selektiert wurde - hier ggf. die Prüfbedingen _
bzw.den Wert für Row/Column anpassen - aktuell Zelle C1
If Target.Row >= 7 And Target.Cells.Count And Target.Column = 6 Then 'Spalte mit Listbox1
varWert = Target
With Me.ListBox1
'neue Position der Listbox
.Left = Target.Offset(0, 1).Left
.Top = Target.Offset(0, 0).Top
'verknüpfte Zelle auf gewählte Zelle setzen
.LinkedCell = "'" & Me.Name & "'!" & Target.Address
'Listboxwert als obersten Wert in Listbox setzen
If IsEmpty(varWert) Then
.TopIndex = 0
Else
.TopIndex = .ListIndex
Resume01:
End If
.Visible = True
.Activate 'Listbox nach Zellauswahl direkt aktivieren
'Scrollvorgang erforderlich, da sonst gelegtenlich chaotische Anzeige von aktiver Zelle und _
Listbox
ActiveWindow.ScrollRow = Target.Row - 2
End With
End If
Fehler:
With Err
Select Case .Number
Case 0 'alles OK
Case 440, 380 'Wert in Zelle ist nicht in Auswahlliste der Listbox
MsgBox "Wert in Zelle ist nicht in Auswahlliste der Listbox"
With Me.ListBox1
.ListIndex = -1
.TopIndex = 0
Resume Resume01
End With
Case Else
MsgBox "Fehler-Nr.: " & .Number & vbLf & .Description
End Select
End With
End Sub