Dublicate aus mehrdimensionalem Array entfernen

Bild

Betrifft: Dublicate aus mehrdimensionalem Array entfernen
von: SteffenS
Geschrieben am: 08.05.2015 08:29:21

Hallo Zusammen,
da ich mich derzeit gerade in die Welt der Array einarbeite, brauche ich bei folgender Aufgabenstellung einmal Eure Hilfe.
Ich möchte gern ein mehrdimensionales Array unter Beachtung bestimmter Dimensionen gern von Duplikaten befreien.
Im Netz habe ich hierzu schon einmal gestöbert, aber nur eine Lösung für ein zweidimensionales Array gefunden, welches auch nur nach der 1. Dimension bereinigt wird.
Habt ihr eine Idee, wie ich eine allgemeine


Function erstellen kann, die
- unter Angabe bis zu welcher Dimension Duplicate entfernt
- das Array sortiert 
- die Anzahl der Dimensionen kann verschieden sein

Function TwinKiller(arr) As Variant
    Dim L As Long
    Dim i As Integer
    Dim myDic As Object
    Dim strTmp As String
    Const Dummy As String = vbTab
    Set myDic = CreateObject("Scripting.Dictionary")
    For L = LBound(arr) To UBound(arr)
        strTmp = ""
        For i = LBound(arr, 2) To UBound(arr, 2)
            strTmp = strTmp & arr(L, i) & Dummy
        Next
        myDic(strTmp) = 0
    Next
    
    'Rückgabe an Array
    Dim RowArr As Variant, ColArr As Variant
    Dim RowDif As Long, ColDif As Long
    
    RowDif = LBound(arr, 1)
    ColDif = LBound(arr, 2)
    
    RowArr = myDic.keys
    ColArr = Split(RowArr(0), Dummy)
    
    ReDim arr(RowDif To UBound(RowArr) + RowDif, ColDif To UBound(ColArr) + ColDif - 1)
    
    For L = 0 To UBound(RowArr)
        ColArr = Split(RowArr(L), Dummy)
        For i = 0 To UBound(ColArr) - 1
            arr(L + RowDif, i + ColDif) = ColArr(i)
        Next
    Next
    
    TwinKiller = arr
End Function
Danke Euch schon mal
VG Steffen

Bild

Betrifft: AW: Dublicate aus mehrdimensionalem Array entfernen
von: Nepumuk
Geschrieben am: 08.05.2015 09:43:56
Hallo,
es ist wesentlich effizienter keine Duplikate im Array aufzunehmen statt sie nachträglich wieder zu entfernen.
Gruß
Nepumuk

Bild

Betrifft: AW: Dublicate aus mehrdimensionalem Array entfernen
von: Daniel
Geschrieben am: 08.05.2015 10:15:04
Hi
kannst du das mal mit einem Beispiel konkretisieren?
wie sehen die ausgangsdaten aus und wie soll das Ergebnis aussehen?
was verstehst du unter einem zwei- und mehrdimensionalen Array?
eindimensional = Linie
zweidimensional = Fläche
dreidimensional = Würfel
vierdimensional = Würfel mit Zeitlicher Veränderung
fünfdimensional = für die meisten nicht mehr vorstellbar
oder heißt für dich "mehrdimensional" nur "zweidimensional mit mehren Spalten"?
Gruß Daniel

Bild

Betrifft: AW: Dublicate aus mehrdimensionalem Array entfernen
von: SteffenS
Geschrieben am: 08.05.2015 12:30:46
Hallo,
als mehrdimensional heißt zweidimensional mit mehreren Spalte. Sorry für die ungenaue Aussage.
Wie kann ich zudem beim befüllen des Arrays prüfen, ob der Wert bereits vorhanden ist, denn das ist wie ihr richtig angemerkt habt die sauberere Lösung.
Danke Euch nochmal.
VG Steffen

Bild

Betrifft: AW: Dublicate aus mehrdimensionalem Array entfernen
von: Daniel
Geschrieben am: 08.05.2015 12:35:28
Hi
kommt jetzt darauf an, wie du das Array befüllst.
wenn du einen Zellbereich einliest, könntst du diesen Zellbereich auch in eine freie Stelle der Tabelle kopieren dort die Funktion DATEN - DATENTOOLS - DUPLIAKTE ENTFERNEN anwenden und dann die Werte von dort einlesen.
wäre mal programmiertechnisch das einfachste.
Ansonsten halt mit einer Schleife über die schon vorhanderen Werte drüberlaufen und prüfen, ob der Wert drin ist oder nicht.
Gruß Daniel

Bild

Betrifft: AW: Duplicate aus zweidimensionalem Array entfern
von: Daniel
Geschrieben am: 08.05.2015 18:04:14
du kannst auch ein schon bestehendes zweidimenionales Array in eine Exceltabelle schreiben, dort das Duplikate-Entfernen auf die Zellen anwenden und dann die Excelzellen wieder ins Array einlesen.
hier mal als Codebeispiel mit der Duplikatsprüfung auf Spalte 1 und 2

With Cells(1, 1).Resize(Ubound(myArray, 1)- LBound(myArray, 1) + 1, Ubound(myArray, 2) - Lbound( _
myArray, 2) + 1)
    .Value = myArray
    .RemoveDuplicates Array(1, 2), xlno
    myArray = .value
    .clearcontents
end with 
allerdings ist danach dein 2-D-Array immer eins-basierend (kleinste Index = 1)
Gruß Daniel

Bild

Betrifft: Es ist nicht sinnvoll, ein 2dimensionales Array...
von: Luc:-?
Geschrieben am: 08.05.2015 16:27:15
…mit Duplikaten anzulegen, Steffen,
wenn diese nicht erwünscht sind. Wdn sie nachträglich entfernt, können aber in jeder Dimension auftreten, wird es Probleme geben, denn die entfallenden Werte müssen durch etwas Anderes ersetzt wdn, weil eine klassische 2dStruktur stets regulär sein muss, d.h., alle Zeilen (bzw Spalten) müssen aus gleichviel Werten bestehen! Das wäre bei einfachem Entfernen ohne Ersatz aber weder gegeben noch möglich!
Wollte man so etwas machen, müsste man einen 1dimensionalen Array-Typ wählen, dessen Einzelwerte aus ganzen Zeilen oder Spalten bestehen. Diese ebenfalls 1dimensionalen Array-Elemente könnten dann auch unterschiedliche Längen haben, wären aber so nicht auf Xl-Tabellen abbildbar. Dazu müssten die EinzelVektoren nachträglich durch ErsatzWerte (ggf inkl ReDim Preserve) auf gleiche Längen gebracht und das Ganze mit INDEX oder MTRANS (entsprd WorksheetFunctions .Index bzw .Transpose) noch getrimmt wdn, wie hier gezeigt wird.
Es ist also angeraten, Nepumuks Rat folgend, gleich ein, dann bevorzugt 1dimensionales Array, also einen Vektor, anzulegen, es sei denn, die Duplikate sind stets nur für eine Zeile oder Spalte relevant und nicht auf die ganze Matrix bezogen. In diesem letzteren Fall wäre ein ErgebnisVektor besonders sinnvoll, wenn nicht gar zwingend erforderlich. Den kann man zB auch mit folgd mehrzelliger Matrix­Formel erreichen:
{=MTRANS(VSplit(VJoin(A16:C25;;-1);;1))}
Die beiden UDFs VSplit und VJoin können natürlich auch in VBA-Prozeduren angewendet bzw „nachempfunden“ wdn. Zu VSplit existieren im Archiv noch 3 neuere Versionen, mindestens Version1.1 verwenden!
Gruß, Luc :-?

Besser informiert mit …

 Bild

Beiträge aus den Excel-Beispielen zum Thema "Dublicate aus mehrdimensionalem Array entfernen"