Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1824to1828
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Filter-Methode um Wert zu entfernen

Filter-Methode um Wert zu entfernen
22.04.2021 12:13:02
NW
Hallo Leute,
ich habe hier im Forum die Filter-Methode kennengelernt, um einzelne Werte aus einem Array zu löschen.
https://www.herber.de/forum/archiv/936to940/936979_einzelnen_Wert_aus_Array_loeschen.html
Da stand folgendes:

Sub test2()
Dim myArr As Variant
Dim x As Integer, s As Variant
myArr = Array("a", "b", "c", "d", "e")
Randomize
'Zufälligen Eintragwählen (Index)
x = Int((UBound(myArr) + 1) * Rnd)
'Zufälliger Eintrag
s = myArr(x)
'Eintrag Löschen
myArr = Filter(myArr, s, False)
MsgBox Join(myArr, vbCrLf)
End Sub
Dies wollte ich nun nutzen. Ich habe zwei Arrays mit Anzahl x Elementen. Diese vergleiche ich miteinander und wenn Wert a in beiden Listen vorhanden ist, möchte ich den Wert aus dem zweiten Array löschen.
Bis zum Löschen funktioniert es super, aber irgendwie funktioniert meine Filter methode, wie oben nicht.
Hier ein Ausschnitt:
Listold As Variant
(Listold wird eingelesen und enthält eine Liste aus strings)
Indexold ist meine fortlaufende Nummer für den aktuellen Wert in meinem Array)
Listold = Filter(Listold, Listold(Indexold), False, vbTextCompare)
Ich wollte jetzt nicht den ganzen Code reinkopieren, der ist lang und ohne Erklärung schwer zu verstehen.
Indexold = 1
Länge von Indexold ist 16 aktuell
Wert ist ein string
Ich bekomme den Fehler: "Laufzeitfehler 9: Index außerhalb des gültige Bereichs"
Ich habe keine ahnung, wo mein Fehler liegt. Ich habe vorher noch nicht mit Arrays / Variants in VBA gearbeitet.
Gruß,
NW

11
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Filter-Methode um Wert zu entfernen
22.04.2021 12:16:41
NW
Was mir noch aufgefallen ist, mein Arrays ist wohl zweidimensional.
Funktioniert diese Funktion nur mit eindimensionalen Arrays ?
Ich weiß aber nicht, wieso mein Array zweidimensional ist :-(
Ich habe hier
Listold = TR.Range("A2:A" & TotalRows).Value
eine Zeile aus einem Tabellenblatt in das Array geschrieben, aber in meinem Überwachungfenster ist es ein Variant/Variant und kein Variant/String.
d.h. ich muss es aufklappen und dehe erst in Listold(1,1) den String :-(
AW: Filter-Methode um Wert zu entfernen
22.04.2021 12:28:15
Nepumuk
Hallo,
so:

Listold = Application.Transpose(TR.Range("A2:A" & TotalRows).Value)
Gruß
Nepumuk
Anzeige
AW: Filter-Methode um Wert zu entfernen
22.04.2021 12:34:21
Daniel
Hi
ob das nur mit eindimensonalen Arrays funktionert, weiß ich auch nicht, aber in der Hilfeseite, die direkt aufpoppt, wenn man im Editor den Cursor auf "Filter" setzt und F1 drückt, steht folgendes:
"sourceArray Erforderlich. Eindimensionales Array mit den zu durchsuchenden Zeichenfolgen."
ich überlasse das mal deiner Interpretation.
Arrays, die du direkt aus dem Tabellenblatt übernimmst, sind immer zweidimensional, auch wenn der Zellbereich einzeilig oder einspaltig ist.
dh wenn du Einzelwerte aus dem Array extrahieren willst, musst du immer Zeilen- und Spaltenindex angeben.
um ein zweidimensionales Array in ein eindimensionales Array zu wandeln, kann man Worksheetfunction.Transpose verwenden.
arr2 ist das vorhandene 2-dimensionale Array, arr1 das daraus zu erstellende eindimensionale
Array hat eine Spalte:

arr1 = Worksheetfunction.Transpose(arr2)
Array hat eine Zeile:

arr1 = Worksheetfunction.Transpose(Worksheetfunction.Transpose(arr2))
oder man dimensioniert sich ein zweites eindimensionales Array mit gleicher Elementanzahl und schaufelt dann die Werte per Schleife von einem ins andere Array.

redim arr1(lbound(arr2, 1) to ubound(arr2, 1))
for x = lbound(arr1) to ubound(arr1)
arr1(x) = arr2(x, 1)
Next
beim Transponieren kann man natürlich auch die gleiche Variable verwenden, wenn man die 2-d-Variante nicht mehr benötigt.
Je nach Array-Größe und Excelversion kann es sein, dass die Schleifenlösung schneller und leistungsfähiger ist (bezogen auf die Elementanzahl) als das Transponieren. (wird aber erst bei 5-6-Stelleigen Elementanzahlen relevant)
Gruß Daniel
Anzeige
AW: Filter-Methode um Wert zu entfernen
22.04.2021 12:54:09
NW
Vielen Dank für die Hilfe
AW: Filter-Methode um Wert zu entfernen
22.04.2021 13:01:33
NW
hhmm, das ist aber jetzt sehr interessant.
Ich habe das array umgewandelt mit der ersten Methode, da ich eine Spalte eingelesen habe.
Bei der Filter-Methode wirft er mir jetzt "Variable verwendet einen in VIsual Basic nicht unterstützten Typ der Automatisierung"
Hab ich bisher auch noch nie gesehen den Fehler.
Das einzige, was ich geändert habe, ist, dass der array jetzt eindimensional ist .....
AW: Filter-Methode um Wert zu entfernen
22.04.2021 13:05:04
Nepumuk
Hallo,
zeig doch mal die relevanten Codezeilen.
Gruß
Nepumuk
AW: Filter-Methode um Wert zu entfernen
22.04.2021 13:12:10
NW
Ich probier es mal :-)
Der Code ist viel länger ...

Sub test ()
Dim TR_arr_old() As Variant
TR_arr_old = Prepare_TR(ThisWorkbook.Worksheets("temp"))
TR_arr_old = WorksheetFunction.Transpose(TR_arr_old)
Dim TR_list() As Variant
TR_list = Compare_TR_arrays(TR_arr_new, TR_arr_old)
End Sub

Function Prepare_TR(TR As Worksheet) As Variant
TotalRows = TR.Cells(TR.Rows.Count, "A").End(xlUp).Row
For Z = TotalRows To 1 Step -1
With TR
If .Cells(Z, 3) = "nein" Then .Rows(Z).Delete
End With
Next
TotalRows = TR.Cells(TR.Rows.Count, "A").End(xlUp).Row
Prepare_TR = TR.Range("A2:A" & TotalRows).Value
End Function

Function Compare_TR_arrays(Listnew As Variant, Listold As Variant) As Variant
Dim commonList() As Variant 'Werte, die in beiden Listen drin sind
Dim commonLength 'Länge von commonList
Dim NewLength 'Länge von New_Only_List
Dim New_Only_List() As Variant 'Werte, die in New drin sind, aber nicht in Old
Dim isInList As Boolean
For Indexnew = LBound(Listnew) To UBound(Listnew) 'Gehe durch alle TRs der neuen Liste
For Indexold = LBound(Listold) To UBound(Listold)
'String Compare überprüft textuell (1) und gibt 0 aus, wenn identisch
If StrComp(Listold(Indexold), Listnew(Indexnew), 1) = 0 Then
isInList = True
'Verlasse innere for-schleife
Exit For
Else
isInList = False
End If
Next
If isInList = True Then
Listold = Filter(Listold, Listold(Indexold), False)
next
End Function

Anzeige
AW: Filter-Methode um Wert zu entfernen
22.04.2021 13:20:39
Nepumuk
Hallo,
wo kommen die Daten für TR_arr_new her?
Gruß
Nepumuk
AW: Filter-Methode um Wert zu entfernen
22.04.2021 13:22:54
NW
Das sind identische Daten, die ich abgeändert habe.
*_new und *_old wurde aus zwei identischen tabellenblättern ausgelesen.
Ich habe den Code nur nicht mit rein, da er redundant ist und hier nicht von bedeutung :-)
AW: Filter-Methode um Wert zu entfernen
22.04.2021 13:39:33
Nepumuk
Hallo,
in deiner Test-Routine:

Dim TR_arr_old As Variant, TR_arr_new As Variant
Dim TR_list As Variant
Gruß
Nepumuk
AW: Filter-Methode um Wert zu entfernen
22.04.2021 14:03:04
NW
Danke für deine Hilfe.
Ich habe jetzt endlich durch Debuggen den Fehler gefunden.
Die Filter Methode akzeptiert ein eindimensionales String Array, aber kein Variant.
Beim Transponieren habe ich die Schleife von Daniel genommen und in ein String() geschrieben - jetzt funktioniert es ohne Probleme.
Die Funktion Filter mag kein Variant Array :-)
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige