Hallo,
wie kann man bei einem Listenfeld mit Mehrfachauswahl (einzeln) den ersten Wert (oder den letzten), der markierten Daten auslesen?
Private Sub btnFilialenVerkn_02_Click()
Dim strFilter As String, varElement As Variant
Dim strFilterSET As String
Dim stDocName As String
Const cstrField = "AGKDNR"
Dim intRow As Integer
If Forms!mnu_Kunden!lbxFilialenVerkn.ItemsSelected.count = 0 Then
For intRow = 0 To Forms!mnu_Kunden!lbxFilialenVerkn.ListCount - 1
Forms!mnu_Kunden!lbxFilialenVerkn.Selected(intRow) = True
Next intRow
End If
strFilterSET = 7676767 'hier soll der erste Wert von AGKDNR (cstrField) rein
strFilter = ""
For Each varElement In Forms!mnu_Kunden!lbxFilialenVerkn.ItemsSelected
If strFilter <> "" Then ' " or " Anhaengen
strFilter = strFilter + " or "
End If
strFilter = strFilter & "[" & cstrField & "] = '" & _
Forms!mnu_Kunden!lbxFilialenVerkn.ItemData(varElement) & "'"
Next
strFilter = "Update tab_ex_Kunden " & "set [LFKDNR]= " & [strFilterSET] & " where " & strFilter
Forms!mnu_Kunden!Infofeld.Caption = strFilter 'wird nur zu Testzwecken benutzt
CurrentDb.Execute strFilter, dbFailOnError
End Sub
Den ermittelten Wert will ich meiner Variablen "strFilterSET" zuordnen,
also als "Ersatz" für "7676767".
Hat jemand eine Idee, kann mir hier bitte jemand weiterhelfen?
Kann man vielleicht die Schleife nach einem Durchlauf (nach dem ersten Wert) anhalten? Aber wie? Ich finde einfach keine Lösung, die funzt.
Mit besten Dank im Voraus
jagger
Acc 2016, W10
In ItemsSelected.Count, steht die Anzahl der ausgewählten Zeilen und in ItemsSelected.Item(Index) wird die Zeile des Listenfelds festgehalten, die an der Position vermerkt ist. Item ist die Standard-Eigenschaft von ItemsSelected und darf deshalb beim Adressieren ausgelassen werden. Auf dein Listenfeld bezogen, könntest Du so den ersten und letzten gewählten Eintrag ermitteln: Dim selIdx As Long
'mit dem Listenfeld: lbxFilialenVerkn
With Me.lbxFilialenVerkn
'wenn etwas ausgewählt wurde, ist Count größer 0
If .ItemsSelected.Count > 0 Then
'die Zählung von ItemsSelected.Count beginnt bei 0
'die von ListIndex des Listenfelds auch
'1. gewählter ListIndex
selIdx = .ItemsSelected(0)
'korrespondiernder ListIndex
MsgBox "Zeile im Listenfeld: " & selIdx
'Zeilenwert aus gebundener Spalte
MsgBox "Erster: " & .ItemData(selIdx)
'letzter gewählter ListIndex
selIdx = .ItemsSelected(.ItemsSelected.Count - 1)
'korrespondiernder ListIndex
MsgBox "Zeile im Listenfeld: " & selIdx
'Zeilenwert aus gebundener Spalte
MsgBox "Letzter: " & .ItemData(selIdx)
End If
End With
Hey Lachtaube,
das sieht super aus. Kann ich gut einbauen.
Da wäre ich bestimmt auch selber drauf gekommen.
...so in 5 bis 6 Monaten oder Jahren!. :o
Nachmals vielen Dank!
LG
jagger
Mit intensivem Studium der Online-Hilfe (Steuerelement-Typ -> Eigenschaften und Methoden) kann sich diese Zeit auch drastisch verkürzen ;)
@Beaker s.a.,
Du hast ja recht.
Ich habe den großen Gockel befragt und bin sicherlich auch öfter mal in der Online-Hilfe gelandet. Aber: Wald, Bäume... :-[
Zum Glück gibt es ja dieses Forum!
Vielleicht haben ja auch andere noch dieses Problem und finden jetzt hier im Forum die Lösung. So kann ja auch mal ein neues Mitglied hängen bleiben. ;-)
LG
jagger
@Lachtaube,
eine beliebige Spalte (vom ersten oder letzten Wert) kann man so aber nicht ausgeben, oder?
LG
jagger
Hallo,
eine bestimmte Spalte kann so "ausgegeben" werden:
dim x
x= Me!lbxFilialenVerkn.Column (2,selIdx) ' dritte(!) Spalte des Listenfeldes.. <edit>
Hallo DF6GL,
irgendwie klappt das so nicht.
Je nachdem welche Zeilen ausgewählt wurden, bringt er immer andere Werte.
Mal aus der ersten Spalte, mal aus der 4. oder 5. Manchmal auch Werte aus einer Zeile, die gar nicht aus gewählt wurde. Ich kann allerdings kein Schema erkennen.
Kann es sein, dass das bei Mehrfachauswahl nicht funktioniert?
:-[
Dim strFilter As String, varElement As Variant
Dim strFilterSET As String
Dim KDSET As String
Dim stDocName As String
Const cstrField = "AGKDNR"
Dim intRow As Integer
Dim selIdx As Long
With Me.lbxFilialenVerkn 'mit dem Listenfeld: lbxFilialenVerk
If .ItemsSelected.count > 0 Then 'wenn etwas ausgewählt wurde, ist Count größer 0
'die Zählung von ItemsSelected.Count beginnt bei 0
'die von ListIndex des Listenfelds auch
'1. gewählter ListIndex
selIdx = .ItemsSelected(0)
'korrespondiernder ListIndex
Rem MsgBox "Zeile im Listenfeld: " & selIdx
'Zeilenwert aus gebundener Spalte
Rem MsgBox "Erster: " & .ItemData(selIdx)
strFilterSET = .ItemData(selIdx)
KDSET = Me!lbxFilialenVerkn.Column(selIdx, 2)
MsgBox "Wert ist " & KDSET
End If
End With
LG
jagger
Die Spaltenposition - 1 muss das erste Argument sein, danach folgt die Zeile (selIdx). In Excel ist es genau umgekehrt - gut zu merken :) .
Hallo Jo,
Wenn ich nichts übersehen habe, dürfte dein Code kein unerwartetes
Ergebnis liefern, sondern immer den Wert, der im ersten, ausgewählten
Eintrag in der dritten Spalte steht.
Wenn du aus mehreren Einträgen einen Filter zusammensetzen willst,
musst du eine Schleife über die Auflistung .ItemsSelected laufen lassen
und den Filter Stück für Stück zusammensetzen, - Prinzip
strFilterSET = strFilterSET & neuer Teil
Frage dich doch mal, wozu die übrigen Variablen deklariert werden, die
du gar nicht verwendest.
gruss ekkehard
@Lachtaube,
das ist die Lösung! Es ist bei Access genau anders herum.
So funktioniert er super:
If .ItemsSelected.count > 0 Then
selIdx = .ItemsSelected(0)
strFilterSET = .ItemData(selIdx)
KDSET = Me!lbxFilialenVerkn.Column(2, selIdx)
MsgBox "Wert ist " & KDSET
End If
End With
Vielen Dank an alle Tippgeber!
LG
jagger
Zitatdas ist die Lösung
die schon in #6 von Franz geposted wurde
Stimmt, nach der Änderung vom 01.09. ;)
Stellt sich jedoch die Frage, warum du ein Listfeld mit Mehrfachauswahl
brauchst, wenn du dann nur eine Zeile für einen Filterausdruck verwendest.
Mit einer Einfachauswahl kannst du doch auf das ganze Item-Gewurschtel
verzichten
strFilterSET = .Value
KDSET = .Column(2)
gruss ekkehard
Hallo Ekkehard,
es geht darum, Kundendaten (z.B. Kressner), die mehrere Filialen haben, zu verknüpfen.
Man gibt den Suchbegriff ein, im Listenfeld werden die Suchergebnisse angezeigt.
Dann markiert man im Listenfeld die Filialen, die zu dem Kunden gehören und klickt auf den Button "verknüpfen". Jetzt haben alle Datensätze die gleiche "AGFLNR" (so heisst das Feld). Über dieses Feld (läuft nur im Hintergrund mit) sind nun alle Standorte (Filialen) verknüpft. Jetzt kann man von jedem Datensatz des Kunden (pro Standort ein Datensatz) sich alle Filialen von diesem Kunden anzeigen lassen.
Das funktioniert super!
LG
jagger
Zitatwie kann man bei einem Listenfeld mit Mehrfachauswahl (einzeln) den ersten Wert (oder den letzten), der markierten Daten auslesen?
Es ist ein Zeichen von "Konsequenz", bei einer Mehrfachauswahl nur genau eine benötigte ID auszulesen. Immerhin benötigt man bei Mehrfachauswahl zwingend eine Auswertung per VBA, während man bei Einfachauswahl schlicht den Rückgabewert des Listenfeldes nutzen könnte.