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

VBA - Array-Werte einsortieren

VBA - Array-Werte einsortieren
21.02.2016 11:36:47
Christian
Hallo zusammen,
ich suche eine VBA-Lösung um alle Einträge aus verschiedener Arrays in der Reihenfolge ihrer Position in ein gemeinsames Ziel-Array zu schreiben.
Bsp:

Sub Array_Reihenfolge()
Dim vntQuell(2), vntZiel
vntQuell(0) = Array("cn", "h3", "e2", "lo", "te", "no", "cc")
vntQuell(1) = Array("cn", "dn", "h3", "e2", "lo", "no")
vntQuell(2) = Array("aa", "dn", "h3", "bb", "e2", "lo", "no", "f1")
' gesuchtes Ergebnis:
' vntZiel = Array("cn", "aa", "dn", "h3", "bb", "e2", "lo", "te", "no", "cc", f1")
End Sub

Mein Ansatz war:
nehme vntQuell(0) als Basis und prüfe anschließend bei den weiteren Arrays, ob dort ein neuer Eintrag vor oder nach einem in vntQuell(0) vorhandenen besteht.
Aber leider komme ich mit meinen VBA-Kenntnissen damit nicht zum Ziel.
Könnt ihr mir helfen?
Vielen Dank vorab
Christian

7
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA - Array-Werte einsortieren
21.02.2016 13:32:22
Oberschlumpf
Hi Christian
Könnte das hier eine Lösung für dich sein?
Sub Array_Reihenfolge()
Dim vntQuell(2), vntZiel, liIdx As Integer, liIdx2 As Integer, lloRow As Long
vntQuell(0) = Array("cn", "h3", "e2", "lo", "te", "no", "cc")
vntQuell(1) = Array("cn", "dn", "h3", "e2", "lo", "no")
vntQuell(2) = Array("aa", "dn", "h3", "bb", "e2", "lo", "no", "f1")
lloRow = 1
ActiveSheet.Cells.Clear
For liIdx = 0 To 2
For liIdx2 = 0 To UBound(vntQuell(liIdx), 1)
Range("A" & lloRow).Value = vntQuell(liIdx)(liIdx2)
lloRow = lloRow + 1
Next
Next
With ActiveSheet.Sort
.SortFields.Clear
.SortFields.Add Key:=Range("A1:A" & ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row), _
SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
.SetRange Range("A1:A21")
.Header = xlGuess
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
With ActiveSheet
For lloRow = .Cells(Rows.Count, 1).End(xlUp).Row To 2 Step -1
If .Cells(lloRow, 1).Value = .Cells(lloRow - 1, 1).Value Then
.Rows(lloRow).Delete
End If
Next
vntZiel = Array(.Range("A1:A" & .Cells(Rows.Count, 1).End(xlUp).Row).Value)
End With
End Sub

Mein Code löscht zuerst alle Zellen in der Hilfstabelle, die nötig ist, da ich die Sortierfunktion von Excel nutze.
Dann werden im 2. Schritt alle Werte aus der Array-Variablen vntQuell in die Tabelle in Spalte A geschrieben.
Danach wird Spalte A mit Excel-Sortier-Funktion sortiert.
Im nächsten Schritt wird in einer For/Next-Schleife Spalte A nach doppelten Einträgen durchsucht.
Wenn gefunden, werden die Zeilen mit den doppelten Einträgen gelöscht.
Im letzten Schritt wird nun der Variablen vntZiel der übrig gebliebene Inhalt aus Spalte A mit Hilfe der Array-Funktion übergeben.
Ok, nun sind die Inhalte in der Zielvariablen vntZiel sortiert; das war nicht deine Vorgabe.
Aber vielleicht hilft es ja trotzdem.
Tut es das denn?
Ciao
Thorsten

Anzeige
AW: VBA - Array-Werte einsortieren
21.02.2016 13:51:20
Christian
Hallo Thorsten,
vielen Dank für deinen Vorschlag. Aber die Einträge dürfen eben nicht alphabtisch oder numerisch sortiert werden, sondern sollen nach der Position ihres Auftretens einsortiert werden.
Bsp: in vntQuell(1) steht "dn" zwischen "cn" und "h3" ("dn" könnte hier auch "xyx" heißen).
Der Eintrag "dn" fehlt bei der Basis "vntQuell(0)". Dann müsste per VBA gesucht werden, ob es weitere Übereinstimmen zwischen vntQuell(0) und vntQuell(1) gibt (hier "h3") und der Eintrag "dn" in vntZiel vor "h3" einsortiert werden.
Grüße
Christian

mist!^^ :-)..ich versuch mal was...owT
21.02.2016 13:54:06
Oberschlumpf

ich weiß leider auch nix...wer anders bitte..owT
21.02.2016 14:26:25
Oberschlumpf

Anzeige
AW: VBA - Array-Werte einsortieren
21.02.2016 16:52:57
Peter
Hallo Christian,
dann versuche ich einmal mein Glück.
Sub Array_Versuch()
Dim vntQuell(2)  As Variant
Dim vntZiel      As Variant
Dim liIdx        As Integer
Dim liIdx2       As Integer
Dim lloRow       As Long
Dim lloInsert    As Long
Dim bGefunden    As Boolean
vntQuell(0) = Array("cn", "h3", "e2", "lo", "te", "no", "cc")
vntQuell(1) = Array("cn", "dn", "h3", "e2", "lo", "no")
vntQuell(2) = Array("aa", "dn", "h3", "bb", "e2", "lo", "no", "f1")
lloRow = 1
With ThisWorkbook.Worksheets("Tabelle2") ' den Tabellenblattnamen ggf. anpassen!
.Range("A1:A25").ClearContents ' den Hilfsbereich leeren/löschen
'        den ersten Array in den Hilfsbereich (Spalte A) kopieren
For liIdx = 0 To UBound(vntQuell(0))
.Range("A" & lloRow).Value = vntQuell(0)(liIdx)
lloRow = lloRow + 1
Next liIdx
'         die weiteren Arrays non hinten abarbeiten
For liIdx = 1 To 2 ' die Anzahl 2 ggf. auf die vorhandenen Array anpassen
lloInsert = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
For liIdx2 = UBound(vntQuell(liIdx), 1) To 0 Step -1
For lloRow = 1 To .Cells(.Rows.Count, 1).End(xlUp).Row
If vntQuell(liIdx)(liIdx2) = .Range("A" & lloRow).Value Then
bGefunden = True
Exit For
End If
Next lloRow
If bGefunden Then
bGefunden = False
lloInsert = lloRow
Else
.Range("A" & lloInsert).Insert Shift:=xlDown
.Range("A" & lloInsert).Value = vntQuell(liIdx)(liIdx2)
End If
Next liIdx2
Next liIdx
vntZiel = Array(.Range("A1:A" & .Cells(.Rows.Count, 1).End(xlUp).Row).Value)
End With
End Sub

Gruß Peter

Anzeige
das funktioniert prima - vielen Dank
21.02.2016 18:40:26
Christian
Hallo Peter,
das funktioniert prima.
Auf die Idee, das Array von hinten zu durchlaufen, wäre ich nie gekommen.
Vielen Dank
Gruß Christian

Meine Variante benötigt die UDF VJoin, ...
21.02.2016 19:55:39
Luc:-?
…Christian,
die in aktueller Version Vs1.4 in hochgeladenen BspDateien des Archivs enthalten ist:
Sub Array_Reihenfolge()
Dim arL As Long, ix As Long, vntQuell(2), vQ, vntZiel
vntQuell(0) = Array("cn", "h3", "e2", "lo", "te", "no", "cc")
vntQuell(1) = Array("cn", "dn", "h3", "e2", "lo", "no")
vntQuell(2) = Array("aa", "dn", "h3", "bb", "e2", "lo", "no", "f1")
With WorksheetFunction
arL = .Max(UBound(vntQuell(0)), UBound(vntQuell(1)), UBound(vntQuell(2)))
For Each vQ In vntQuell
If UBound(vQ) VJoin(.Transpose(.Transpose(vntQuell)), , cxRTrue))
End With
ActiveWindow.RangeSelection.Resize(1, UBound(vntZiel) + 1) = vntZiel
    Rem Das gesuchte Ergebnis ist so falsch:
'   vntZiel = Array("cn", "aa", "dn", "h3", "bb", "e2", "lo", "te", "no", "cc", "f1")
'   Entweder  Array("cn", "aa", "h3", "dn", "e2", "lo", "bb", "te", "no", "cc", "f1")
'   …oder     Array("cn", "h3", "e2", "lo", "te", "no", "cc", "dn", "aa", "bb", "f1")
'   …m.nur 1× .Transpose; sonst unlogisch, da weder zeilen- noch spaltenwss Vorgehen!
End Sub
Gruß, Luc :-?
Besser informiert mit …
Anzeige

315 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige