Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1424to1428
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

Dublicate aus mehrdimensionalem Array entfernen

Dublicate aus mehrdimensionalem Array entfernen
08.05.2015 08:29:21
SteffenS
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

6
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

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

AW: Dublicate aus mehrdimensionalem Array entfernen
08.05.2015 10:15:04
Daniel
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

Anzeige
AW: Dublicate aus mehrdimensionalem Array entfernen
08.05.2015 12:30:46
SteffenS
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

AW: Dublicate aus mehrdimensionalem Array entfernen
08.05.2015 12:35:28
Daniel
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

Anzeige
AW: Duplicate aus zweidimensionalem Array entfern
08.05.2015 18:04:14
Daniel
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

Anzeige
Es ist nicht sinnvoll, ein 2dimensionales Array...
08.05.2015 16:27:15
Luc:-?
…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 …
Anzeige

118 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige