Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Listview - Markierung (selection) verschwindet

Forumthread: Listview - Markierung (selection) verschwindet

Listview - Markierung (selection) verschwindet
KLE
Hallo,
ich habe eine Userform mit einem Listview-Element (Darstellung aller Datensätze).
Wenn der User einen Datensatz markiert, sollen die Daten in den Feldern angezeigt bekommen...
was auch sehr gut funktioniert - nur, dass die Markierung des Datensatzes im Listview-Element dann sofort weg ist... ?!?
Woran liegt es und wie kann man es verhindern ?
Hier der von mir verwendete Code:
Zeilen für das ListviewElement:
' Listview mit Datensätzen des Kunden aus Daten befüllen '
Private Sub Fülle_Listview(Optional varFilter As Variant = 0)
' Daten in PBE als Range behandeln
With Sheets("Daten")
Set Bereich = .UsedRange
meArray = Bereich
End With
With LVKasse
If .ColumnHeaders.Count 

' Reaktion auf Clicks in Listview
Private Sub LVKasse_Click()
LPos.Caption = LVKasse.SelectedItem.Index
Call einlesen
' Versuch nach dem einlesen diesen einfach zu markieren - funktioniert aber leider nicht...
LVKasse.ListItems(CDbl(LPos.Caption)).Selected = True
'Debug.Print "Count: " & LVKasse.SelectedItem.Index
'Debug.Print "Subitem(1):" & LVKasse.ListItems(LVKasse.SelectedItem.Index).SubItems(1)
'Debug.Print "Subitem(2):" & LVKasse.ListItems(LVKasse.SelectedItem.Index).SubItems(2)
'Debug.Print "Subitem(3):" & LVKasse.ListItems(LVKasse.SelectedItem.Index).SubItems(3)
End Sub
' per Klick auf Spaltenüberschriten der Listview die Einträge entsprechend sortieren
Private Sub LVKAsse_ColumnClick(ByVal ColumnHeader As MSComctlLib.ColumnHeader)
If ColumnHeader.Index = 0 Then
LVKasse.SortKey = ColumnHeader.Index
Else
LVKasse.SortKey = ColumnHeader.Index - 1
End If
LVKasse.SortOrder = IIf(LVKasse.SortOrder = lvwAscending, lvwDescending, lvwAscending)
End Sub
'#################################################################
'Code für das einlesen der Daten des selektiertem Datensatzes:
' Einlesen des letzten Datensatzes
Private Sub einlesen()
If LPos.Caption  2 Then
DTPicker1.Value = Worksheets("Daten").Cells(LZeile, 8).Value
End If
If Worksheets("Daten").Cells(LZeile, 9) = "" And Worksheets("Daten").Cells(LZeile, 10) = " _
" Then
OBEin.Value = True
OBAus.Value = False
ElseIf Worksheets("Daten").Cells(LZeile, 9)  "" Then
OBEin.Value = True
TB2.Text = Format(Worksheets("Daten").Cells(LZeile, 9).Value, "#,##0.00 €")
Else
OBAus.Value = True
TB2.Text = Format(Worksheets("Daten").Cells(LZeile, 10).Value, "#,##0.00 €")
End If
CBUSt.Value = Format(Worksheets("Daten").Cells(LZeile, 13), "#0 %")
CBSkonto.Value = Format(Worksheets("Daten").Cells(LZeile, 15), "#0 %")
CBBeleg.Value = Worksheets("Daten").Cells(LZeile, 20)
CBUBeleg.Value = Worksheets("Daten").Cells(LZeile, 18)
CBMandant.Value = Worksheets("Daten").Cells(LZeile, 21)
CBKSD.Value = Worksheets("Daten").Cells(LZeile, 22)
Call CBSkonto_Change
' Anzeige des Datenbestandes per Label "LInfo"
' Label Info füllen mit den Daten, wann der Datensatz erfasst wurde und wann geändert
LInfo.Caption = "Datensatz erfasst am: " & VBA.Chr(13) & Worksheets("Daten").Cells(LZeile, _
3).Value & _
VBA.Chr(13) & VBA.Chr(13) & "letzte Änderung am: " & VBA.Chr(13) & Worksheets(" _
Daten").Cells(LZeile, 4).Value
' Scrollbar anpassen
SBSucheBloc = True
SBSuche.Max = Application.WorksheetFunction.Max(Worksheets("Daten").Range("B3:B65000")) '  _
Scollbar aktualisieren
If LPos.Caption > SBSuche.Max Then LPos.Caption = SBSuche.Max
SBSuche.Value = LPos.Caption
LDS.Caption = "Datensatz " & SBSuche.Value & " von " & SBSuche.Max
SBSucheBloc = False
End Sub
Hoffe jemand kann mir helfen ?!
Gruß und Danke
Kay
Anzeige

3
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Benutzer
Anzeige
Nachbauen zuviel Arbeit - bitte Datei hochladen...
05.05.2010 17:30:07
NoNet
Hallo Kay,
glaubst Du allen Ernstes, jemand macht sich die Mühe, aus Deinem geposteten code eine komplette Mappe mit Daten, UserForms, Steuerelementen etc. nach zu bauen ?
Mir persönlich ist das für eine Hilfestellung ehrlich gesagt zu viel Arbeit, daher werde ich mich nicht an der Erarbeitung einer Lösung beteiligen - es sei denn, Du lädst eine (auf das wesentliche reduzierte) DEMO-Datei hoch, anhand der das Problem nachvollzogen werden kann und die man dann analysieren kann...
Gruß, NoNet
Anzeige
AW: Nachbauen zuviel Arbeit - bitte Datei hochladen...
05.05.2010 19:57:18
Hajo_Zi
Hallo,
dem stimme ich zu.

AW: Klappt jetzt, aber wie geht Zeile fett ?
05.05.2010 20:53:40
KLE
Sorry, wollte garantiert keine "Mehrarbeit" verursachen ! Dachte nur, Ihr "lest" einen Fehler als "Profis" schon auf dem ersten Blick heraus...?!
OK, nehme meine Frage zurück, da ich nun selbst beim erstellen einer Demo-Datei bemerkte, dass es an der Belegung des Labels "LPos.Caption" mit der Datensatzposition gelegen haben muss. Da ich in der Demoversion ein "neues" Label dafür nutzte - funktionierte es fehlerfrei. Also gleich in meiner Datei auch probiert und ein neues Label "Visible = false" reingepackt - diesem die Datensatzposition aus der Listview zugewiesen und darauf im Code "einlesen" Bezug genommen - klappt es.
Aber, wie kann ich die ganze Zeile "FETT" machen in der Listview - die solange Fett bleibt, bis eine andere Zeile gewählt wird ? Auch wenn der Focus aus der Listview genommn wird ?
Gruß und Danke
Kay
Anzeige
;
Anzeige
Anzeige

Infobox / Tutorial

Listview-Markierung in Excel UserForms korrekt implementieren


Schritt-für-Schritt-Anleitung

Um die Markierung eines Listview-Elements in einer Excel UserForm zu behalten, kannst Du folgende Schritte befolgen:

  1. UserForm erstellen: Stelle sicher, dass Deine UserForm ein Listview-Element enthält.

  2. Daten im Listview laden: Verwende den Code, um Daten in das Listview zu laden. Hier ein Beispiel:

    Private Sub Fülle_Listview(Optional varFilter As Variant = 0)
       With Sheets("Daten")
           Set Bereich = .UsedRange
           meArray = Bereich
       End With
    
       With LVKasse
           ' Hier den Code zum Befüllen des Listviews einfügen
       End With
    End Sub
  3. Markierung beibehalten: Um die Markierung zu behalten, setze den Code im Click-Ereignis des Listviews:

    Private Sub LVKasse_Click()
       LPos.Caption = LVKasse.SelectedItem.Index
       Call einlesen
       LVKasse.ListItems(CDbl(LPos.Caption)).Selected = True
    End Sub
  4. Daten einlesen: In der einlesen-Subroutine kannst Du die entsprechenden Daten in die Textfelder laden.


Häufige Fehler und Lösungen

  • Markierung verschwindet sofort: Dies geschieht häufig, wenn das Label LPos.Caption nicht korrekt gesetzt ist. Stelle sicher, dass die Index-Nummer des ausgewählten Items korrekt zugewiesen wird.

  • Daten werden nicht angezeigt: Überprüfe, ob die einlesen-Subroutine korrekt auf die Datensätze zugreift. Achte darauf, dass die Zeile, die Du versuchst auszulesen, tatsächlich existiert.


Alternative Methoden

Falls Du Schwierigkeiten mit der Standardmethode hast, kannst Du auch die ListItem-Eigenschaften direkt anpassen. Eine Alternative besteht darin, die Auswahl manuell zu speichern und den Status beim Verlassen der UserForm zu verwalten.

Dim lastSelectedIndex As Long

Private Sub LVKasse_Click()
    lastSelectedIndex = LVKasse.SelectedItem.Index
    ' Rest des Codes
End Sub

Private Sub UserForm_QueryClose(Cancel As Integer)
    LVKasse.ListItems(lastSelectedIndex).Selected = True
End Sub

Praktische Beispiele

Hier ist ein einfaches Beispiel, wie Du die Markierung in einer UserForm beibehalten kannst:

  1. UserForm mit Listview erstellen: Füge ein Listview und ein Label hinzu.
  2. Daten einfügen: Verwende eine Excel-Tabelle als Datenquelle.
  3. Klick-Ereignis programmieren: Setze den oben beschriebenen Code in die Click-Methode des Listviews ein.

Tipps für Profis

  • Verwendung von Visible = False: Du kannst ein unsichtbares Label verwenden, um die Position des ausgewählten Datensatzes zu speichern, ohne die Benutzeroberfläche zu stören.

  • Zustand speichern: Überlege, den Zustand der Listview-Auswahl in einer Variablen zu speichern, um das Handling zu vereinfachen.

  • Event-Handling optimieren: Teste verschiedene Event-Handler wie MouseDown oder MouseUp, um die Benutzererfahrung zu verbessern.


FAQ: Häufige Fragen

1. Wie kann ich eine Zeile fett formatieren, wenn sie ausgewählt ist? Du kannst die ListItems-Eigenschaft verwenden, um die Schriftart zu ändern:

LVKasse.ListItems(selectedIndex).Font.Bold = True

2. Warum funktioniert meine Markierung nicht? Überprüfe, ob der Index, den Du verwendest, tatsächlich zu einem existierenden ListItem gehört. Achte auch darauf, dass keine anderen Subroutinen die Markierung zurücksetzen.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige