Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1704to1708
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(array()) 2-Dim

filter(array()) 2-Dim
09.08.2019 09:45:45
Toni
Hallo Excel-Freunde, einen schönen Einstieg ins Wochenende,
mit nachfolgender Aufgabenstellung zum Thema filter(array()) komme ich aktuell nicht weiter.
Filter() setzt ja bekanntlich bei 1-dim an, was ich mit den beiden Funktionen zu umgehen versuche, noch ohne Erfolg und irgendwie ist das alles noch nicht stimmig. Gesucht ist der richtige Zugang zur Nutzung von Filter() in diesem 2-Dim Zusammenhang.
(Alternativ-Ansätze mit Autofilter, Spezialfilter, Array-Schleife oder ausprogrammierte Range-Resize-Lösungen sind mir bekannt -- ich möchte hier aber explizit die Filter()-Fkt ausprobieren. Später werde ich dann die Ansätze im Kontext "Dauer" vergleichen)
Vielen Dank für Euren Input!!!
Option Explicit
Sub test()
Dim ber As Range, berfilt As Range
Dim arr(), arrlist1(), arrlist2(), arrfilt()
ber = Worksheets("Tabelle1").Range("A1:M30")
arr = ber
arrlist1 = Join2d(arr)
arrfilt = Filter(arrlist1, "abla")
arrlist2 = Split2d(arrfilt)
berfilt = Worksheets("Tabelle1").Range("O2:AA" & UBound(arrlist2)) 'geht später tatsächlich in  _
andere Mappe
berfilt = arrlist2
End Sub
Public Function Join2d(ByRef InputArray As Variant, _
Optional RowDelimiter As String = vbCr, _
Optional FieldDelimiter = vbTab, _
Optional SkipBlankRows As Boolean = False _
) As String
' Join up a 2-dimensional array into a string. Works like the standard
'  VBA.Strings.Join, for a 2-dimensional array.
' Note that the default delimiters are those inserted into the string
'  returned by ADODB.Recordset.GetString
On Error Resume Next
' Coding note: we're not doing any string-handling in VBA.Strings -
' allocating, deallocating and (especially!) concatenating are SLOW.
' We're using the VBA Join & Split functions ONLY. The VBA Join,
' Split, & Replace functions are linked directly to fast (by VBA
' standards) functions in the native Windows code. Feel free to
' optimise further by declaring and using the Kernel string functions
' if you want to.
' ** THIS CODE IS IN THE PUBLIC DOMAIN **
'   Nigel Heffernan   Excellerando.Blogspot.com
Dim i As Long
Dim j As Long
Dim i_lBound As Long
Dim i_uBound As Long
Dim j_lBound As Long
Dim j_uBound As Long
Dim arrTemp1() As String
Dim arrTemp2() As String
Dim strBlankRow As String
i_lBound = LBound(InputArray, 1)
i_uBound = UBound(InputArray, 1)
j_lBound = LBound(InputArray, 2)
j_uBound = UBound(InputArray, 2)
ReDim arrTemp1(i_lBound To i_uBound)
ReDim arrTemp2(j_lBound To j_uBound)
For i = i_lBound To i_uBound
For j = j_lBound To j_uBound
arrTemp2(j) = InputArray(i, j)
Next j
arrTemp1(i) = Join(arrTemp2, FieldDelimiter)
Next i
If SkipBlankRows Then
If Len(FieldDelimiter) = 1 Then
strBlankRow = String(j_uBound - j_lBound, FieldDelimiter)
Else
For j = j_lBound To j_uBound
strBlankRow = strBlankRow & FieldDelimiter
Next j
End If
Join2d = Replace(Join(arrTemp1, RowDelimiter), strBlankRow, RowDelimiter, "")
i = Len(strBlankRow & RowDelimiter)
If Left(Join2d, i) = strBlankRow & RowDelimiter Then
Mid$(Join2d, 1, i) = ""
End If
Else
Join2d = Join(arrTemp1, RowDelimiter)
End If
Erase arrTemp1
End Function
Public Function Split2d(ByRef strInput As String, _
Optional RowDelimiter As String = vbCr, _
Optional FieldDelimiter = vbTab, _
Optional CoerceLowerBound As Long = 0 _
) As Variant
' Split up a string into a 2-dimensional array.
' Works like VBA.Strings.Split, for a 2-dimensional array.
' Check your lower bounds on return: never assume that any array in
' VBA is zero-based, even if you've set Option Base 0
' If in doubt, coerce the lower bounds to 0 or 1 by setting
' CoerceLowerBound
' Note that the default delimiters are those inserted into the
'  string returned by ADODB.Recordset.GetString
On Error Resume Next
' Coding note: we're not doing any string-handling in VBA.Strings -
' allocating, deallocating and (especially!) concatenating are SLOW.
' We're using the VBA Join & Split functions ONLY. The VBA Join,
' Split, & Replace functions are linked directly to fast (by VBA
' standards) functions in the native Windows code. Feel free to
' optimise further by declaring and using the Kernel string functions
' if you want to.
' ** THIS CODE IS IN THE PUBLIC DOMAIN **
'    Nigel Heffernan   Excellerando.Blogspot.com
Dim i   As Long
Dim j   As Long
Dim i_n As Long
Dim j_n As Long
Dim i_lBound As Long
Dim i_uBound As Long
Dim j_lBound As Long
Dim j_uBound As Long
Dim arrTemp1 As Variant
Dim arrTemp2 As Variant
arrTemp1 = Split(strInput, RowDelimiter)
i_lBound = LBound(arrTemp1)
i_uBound = UBound(arrTemp1)
If VBA.LenB(arrTemp1(i_uBound)) 
Die Funktionen sind von hier: http://excellerando.blogspot.com/2012/08/join-and-split-functions-for-2.html
Eine Testdatei findet Ihr hier: https://www.herber.de/bbs/user/131345.xlsx
lG
Toni

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: filter(array()) 2-Dim
09.08.2019 10:24:57
Luschi
Hallo Toni,
bei mir läuft das Programm gleich hier auf einen Fehler: arrlist1 = Join2d(arr)
- die Funktion 'Join2d' gibt einen String zurück
- Du hast 'arrlist1' aber als Datenfeld arrlist1() dimensioniert
- das kann nicht klappen
Ich teste mal weiter.
Gruß von Luschi
aus klein-Paris
AW: filter(array()) 2-Dim
09.08.2019 10:55:17
Toni
Hallo Luschi,
Danke auch für Deinen Hinweis. Habe ich im F8-Durchlauf auch gesehen, aber keine Lösung recht gefunden. Daniel hat einen Zwischenschritt eingebaut und so läufts durch.
Auch Dir ein schönes Wochenende!!!!
lG
Toni
AW: filter(array()) 2-Dim
09.08.2019 11:12:19
Toni
Hallo Luschi,
habe Deine Antwort jetzt erst ganz gelesen, das war sehr unhöflich von mir, Dich abzuwürgen, wo Du noch getestet hast. Ich bin natürlich auf Deine Lösung gespannt, wenn ich Dich nicht verprellt habe durch meine abschließende Antwort. Falls doch: trotzdem Danke!!
Entschuldige!
lG
Toni
Anzeige
AW: filter(array()) 2-Dim
09.08.2019 10:39:06
Daniel
HI
so läuft der Code:
Sub test()
Dim ber As Range, berfilt As Range
Dim arr(), arrlist1, arrlist2, arrfilt
Dim txt As String
Set ber = Worksheets("Tabelle1").Range("A1:M30")
arr = ber
txt = Join2d(arr)
arrlist1 = Split(txt, vbCr)
arrfilt = Filter(arrlist1, "Abla")
txt = Join(arrfilt, vbCr)
arrlist2 = Split2d(txt)
Set berfilt = Worksheets("Tabelle1").Range("O2:AA" & UBound(arrlist2))
berfilt = arrlist2
End Sub
Gruß Daniel
AW: filter(array()) 2-Dim
09.08.2019 10:53:02
Toni
Hallo Daniel,
Chapeau! Das ging ja flink :)
Vielen lieben Dank! Ein schönes Wochenende wünsche ich Dir!
lG
Toni
Anzeige
AW: filter(array()) 2-Dim
09.08.2019 10:53:21
Daniel
Hi
ich würde dir noch folgende Variante empfehlen:
Sub Test2()
Range("A:M").Copy Range("O1")
With Range("O1").CurrentRegion
With .Columns(.Columns.Count + 1)
.FormulaR1C1 = "=IF(RC[-12]=""abla"",Row(),0)"
.Cells(1, 1).Value = 0
.Offset(0, -13).Resize(, 14).RemoveDuplicates 14, xlNo
.ClearContents
End With
End With
End Sub
vergleiche bitte nicht nur "Dauer", sondern auch "Programmieraufwand" und "erforderliche VBA-Kenntnisse"
Gruß Daniel
AW: filter(array()) 2-Dim
09.08.2019 11:01:56
Toni
Hi Daniel,
ich werde noch verschiedene Varianten durchgehen und denke im F8-Modus ist das alles gut nachvollziehbar und Fehler sind dann auszuschließen.
Bin mir auch gar nicht sicher, ob nicht Dein 2. Code bei zig Daten nicht Zeitvorteile hat. Mir gings insb. darum, die Filter() einmal anzuwenden und bin Dir sehr dankbar für diese Lösung.
lG
Toni
Anzeige
Nachtrag und Frage
11.08.2019 13:43:35
Toni
Hallo Zusammen,
die Varianten habe ich jetzt durchgespielt und SpezFilter ist mit Abstand die schnellste Lösung, was ich vermutet habe aber:
Die Array Join/Filter/Split von oben dauert bei entsprechendem Datenvolumen dagegen extrem lange. Ist die Ausführung dieses Ansatzes oben der falsche, oder warum dauert das Ganze trotz Array so viel länger als Bordmittel; weiß das jemand von Euch? Weiß evtl. noch einer eine fixere Variante mit Array?
Nebenbei habe ich im Code oben den Bereich (berfilter) um Überschriften und den Index0 des Arrays erweitert, das nur am Rande.
lG
Toni
Anzeige

23 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige