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-Key: 7614828491

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

Printed on: April 27, 2024 at 06:04 o'clock

Member: mayho33
mayho33 Jun 22, 2023 at 06:14:49 (UTC)
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!
Mitglied: 7426148943
Solution 7426148943 Jun 22, 2023 updated at 08:30:04 (UTC)
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
Member: mreske
mreske Jun 22, 2023 at 17:26:20 (UTC)
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
Mitglied: 7426148943
7426148943 Jun 22, 2023 updated at 20:14:00 (UTC)
Goto Top
Hey, mal jemand der sich mit einem Hinweis auch selbst helfen kann 👍, ist hier ja eine seltene Spezies.😉