mreske
Goto Top

Listbox Werte in Array schreiben

Hallo zusammen,

ich möchte in einer Listbox in Spalte 3 ("ArtID") nach einem Wert suchen (z.B. 100007)
Dort wo der Wert vorkommt soll der Wert der Listbox aus Spalte 2 ("SetID") in einem Array gespeichtert werden.
Danach sollen alle Zeilen in der Listbox gelöscht werden, die NICHT einen der Werte aus dem Array in Spalte "SetID" (also Listindex 1) enthalten.

Leider gibt mir die Function IsInArray die Fehlermeldung "Laufzeitfehler 9: Index ausserhalb des gültigen Bereichs" aus

SuchID = 100007
Zähler = 2
For i = 1 to Listbox2.Listcount -1
if Listbox2.List(Zähler,3) ? SuchID then
'schreibe den Wert aus Spalte "SetID" in einen Array
'in diesem Beispiel müsste also im Array folgende Werte stehen: 100001 , 100008
End if
Next i

Listbox2
Index0 Index1 Index2
"lfdID" "SetID" "ArtID"
100000 100000
100001 100001 100007
100002 100001 100006
100003 100001 100000
100004 100001 100002
100005 100001 100002
100006 100001 100004
100007 100001 100005
100008 100008 100007
100009 100008 100006
100010 100008 100000
100011 100008 100002
100012 100008 100002
100013 100008 100004
100014 100008 100005
100015 100015 100007
100016 100015 100006
100017 100015 100000
100018 100015 100002
100019 100015 100002
100020 100015 100004
100021 100015 100005

Private Sub CommandButton7_Click()
Set objLbxQuelle = uf.lbxArtikelBLVSu
Set objLbxZiel = uf.lbxArtikelBLV_Items

'lngArtID = "100007" 'objLbxZiel.List(objLbxZiel.ListIndex, 2) 'ArtNr  
'Zähler = 2 'Anzahl der RückgabeEingabe  

Dim SuchID As String
Dim Zähler As Integer
Dim WertArray() As String
Dim i As Long
Dim rowCount As Long

SuchID = "100007"  
Zähler = 2

' Werte in Array speichern  
For i = 1 To objLbxZiel.ListCount - 1
    If objLbxZiel.List(i, 3) = SuchID Then
        rowCount = rowCount + 1
        ReDim Preserve WertArray(1 To rowCount)
        WertArray(rowCount) = objLbxZiel.List(i, 1) ' Spalte "SetID"  
    End If
Next i

' Zeilen in objLbxZiel löschen, die nicht im Array enthalten sind  
For i = objLbxZiel.ListCount - 1 To 1 Step -1
    If Not IsInArray(objLbxZiel.List(i, 1), WertArray) Then
        objLbxZiel.RemoveItem i
    End If
Next i
End Sub
' Hilfsfunktion, um zu überprüfen, ob ein Wert in einem Array vorhanden ist  
Function IsInArray(ByVal searchValue As Variant, ByVal searchArray As Variant) As Boolean
    If Not IsEmpty(searchArray) Then
        Dim i As Long
        For i = 1 To UBound(searchArray, 1)
            If searchArray(i, 1) = searchValue Then
                IsInArray = True
                Exit Function
            End If
        Next i
    End If
    IsInArray = False
End Function

Könnte mir jemand sagen, was falsch an der Function ist?
Danke
laufzfehler9_indexausserh

Content-ID: 7614828491

Url: https://administrator.de/contentid/7614828491

Ausgedruckt am: 21.11.2024 um 22:11 Uhr

mayho33
mayho33 22.06.2023 um 08:14:49 Uhr
Goto Top
Hi,

Du könntest dir ein ObservableCollection-Object erstellen und dieses verwenden. Der große Vorteil ist, dass du die Daten nur noch dort bearbeiten musst und die Listbox wird automatisch aktualisiert wenn die ObservableCollection als DataSource hinterlegt ist.

Siehe dazu:
https://learn-powershell.net/2012/12/08/powershell-and-wpf-listbox-part- ....

https://learn.microsoft.com/en-us/dotnet/desktop/wpf/data/how-to-create- ...

Grüße!
7426148943
Lösung 7426148943 22.06.2023 aktualisiert um 10:30:04 Uhr
Goto Top
Wohl noch kein Kaffee gehabt face-smile. Schau nochmal genau hin, du erstellst ein eindimensionales Array benutzt es aber wie ein zweidimensionales ...
Mit Breakpoints setzen und untersuchen der Variablen wäre dir das auch aufgefallen.

Zeppel
mreske
mreske 22.06.2023 um 19:26:20 Uhr
Goto Top
Hallo Zeppel.
danke für den Hinweis (Kaffee hilft immer face-smile
Außerdem war der Spaltenindex falsch.

Jetzt funktioniert der Code.
Falsch war:
If Listbox2.List(i, 3) = SuchID Then
searchValue As Variant

Richtig ist:
If Listbox2.List(i, 2) = SuchID Then
searchValue As String

Hier der korrekte Code:

Dim SuchID As String
Dim Zähler As Integer
Dim WertArray() As String
Dim i As Long
Dim rowCount As Long

SuchID = "100007"  
Zähler = 2

' Werte in Array speichern  
For i = 1 To objLbxZiel.ListCount - 1
    If objLbxZiel.List(i, 2) = SuchID Then
        rowCount = rowCount + 1
        ReDim Preserve WertArray(1 To rowCount)
        WertArray(rowCount) = objLbxZiel.List(i, 1) ' Spalte "SetID"  
    End If
Next i

'Ergebnisse in Msgbox anzeigen lassen  
'Dim result As String  
'For i = LBound(WertArray) To UBound(WertArray)  
'    result = result & WertArray(i) & vbCrLf  
'Next i  
'MsgBox result  

'Zeilen in objLbxZiel löschen, die nicht im Array enthalten sind  
For i = objLbxZiel.ListCount - 1 To 0 Step -1
    If Not IsInArray(objLbxZiel.List(i, 1), WertArray) Then
       objLbxZiel.RemoveItem i
    End If
Next i
End Sub
' Hilfsfunktion, um zu überprüfen, ob ein Wert in einem Array vorhanden ist  
Function IsInArray(ByVal searchValue As String, ByVal searchArray As Variant) As Boolean
    If Not IsEmpty(searchArray) Then
      Dim i As Long
          For i = 1 To UBound(searchArray)
            If searchArray(i) = searchValue Then
                IsInArray = True
                Exit Function
            End If
        Next i
    End If
    IsInArray = False
End Function

Schönen Abend noch
beste Grüße
7426148943
7426148943 22.06.2023 aktualisiert um 22:14:00 Uhr
Goto Top
Hey, mal jemand der sich mit einem Hinweis auch selbst helfen kann 👍, ist hier ja eine seltene Spezies.😉