Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Inhalte eines Arrays in ein anderes Array kopieren

Forumthread: Inhalte eines Arrays in ein anderes Array kopieren

Inhalte eines Arrays in ein anderes Array kopieren
04.06.2008 18:40:26
Karsten
Hallo,
ich habe mir ein Array wie folgt gebaut und im Deklarationsbereich eines Moduls hinterlegt.
'Globale Variablen
Public Type Ergebnisse
Spt As Integer
Verein As String
Punkte As Integer
TG As Integer
TK As Integer
TD As Integer
End Type
In einer Sub Prozedur ist das Array nun wie folgt deklariert.
Dim ErgebnisArray(34) As Ergebnisse
Anschließend fülle ich mit diversen Berechnungen dieses Array und kann die Werte ausgeben.
'Alle Daten in das Array "Ergebnisse" einlesen
With ErgebnisArray(Spt)
.Spt = Spt
.Verein = Verein(a, b)
.Punkte = Punkte(a, b)
.TG = Tore_geschossen(a, b)
.TK = Tore_kassiert(a, b)
.TD = Tordifferenz(a, b)
Debug.Print .Spt, .Punkte, .TG, .TK, .TD, .Verein
End With
Nun möchte ich die Inhalte des Arrays "Ergebnisse" in das Array "Platzierungen" Kopieren/übergeben und anschließend in Abhängigkeit des entsprechenden Spieltages (Spt), der Punkte (Punkte), der geschossennen Tore (TG), der kassierten Tore (TK) und der Tordifferenz (TD) absteigend sortieren.
Kann jemand helfen? Im Forum/Archiv bin ich nicht fündig geworden.
Gruß Karsten

Anzeige

2
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Inhalte eines Arrays in ein anderes Array kopieren
06.06.2008 19:04:00
fcs
Hallo Karsten,
um ein via Typen deklariertes Array zu sortieren ist mir die folgende Lösung eingefallen.
Dabei werden die Werte, nach denen das Array sortiert werden soll in ein temporäres 1-spaltiges Array eingelesen.
Gleichzeitig werden die Originaldaten komplett in ein temporäres Typen-Array mit der gleichen Struktur einglesen.
In einer Function wird dann die neue Reihenfolge gemäß Werten und Sortierung ermittelt.
Das Ergebnis wird dann verwendet, um die Daten aus dem temporären Typen-Array in der neuen Reihenfolge in das Plazierungsarray zu schreiben.
In meinem Beispiel wird nach 3 Werten (TG, TD, Punkte) jeweils absteigendend sortiert.
Ich werde nochmals versuchen die Routinen zu vereinfachen (mehr Funktionen in Sub-Routinen zu verlagern). Aber für kleine Arrays mit wenig Zeilen funktionierts wenigstens.
https://www.herber.de/bbs/user/52893.xls
Falls du die Daten aus dem ErgebnisArray in ein "normales" Array mit 34 Zeilen/6 Spalten schreiben willst, dann geht das ähnlich wie das Ausfüllen der Tabelle am Ende der Routine.
Gruß
Franz

Anzeige
AW: Inhalte eines Arrays in ein anderes Array kopi
07.06.2008 05:33:29
fcs
Hallo Karsten,
bei meiner 1. Anwort fehleten leider die Makros in der Datei.
Hier jetzt die der VBA-Code.
Ich hab noch etwas optimiert.
Die Daten des ErgebnisArray werden in ein Temporäres Array mit 6 Spalten geschrieben und dann zusammen mit der Sortierreihenfolge und Sortierart an eine Sub-routine übergeben.
Diese Sortiert das Temporäre Array, dessen Daten dann in der Hauptroutine weiterverarbeitet werden können.
Für andere Sortierungen müssen nur die Arrays für Spalten und Sortierart angepasst werden.
Gruß
Franz

'Globale Variablen
Public Type Ergebnisse
spt As Integer
Verein As String
Punkte As Integer
TG As Integer
TK As Integer
TD As Integer
End Type
Sub aaaTest()
'In einer Sub Prozedur ist das Array nun wie folgt deklariert.
Dim ErgebnisArray(1 To 34) As Ergebnisse
Dim spt As Long, Verein, Punkte, Tore_geschossen, Tore_kassiert, Tordifferenz
Dim a, b
Dim Zeile As Long, spalte As Long, strSort As String
Dim PlazierungArray() As Ergebnisse, ArrayTemp()
'Anschließend fülle ich mit diversen Berechnungen dieses Array und kann die Werte ausgeben.
'Alle Daten in das Array "Ergebnisse" einlesen
GoTo Weiter01
With ErgebnisArray(spt)
.spt = spt
.Verein = Verein(a, b)
.Punkte = Punkte(a, b)
.TG = Tore_geschossen(a, b)
.TK = Tore_kassiert(a, b)
.TD = Tordifferenz(a, b)
Debug.Print .spt, .Punkte, .TG, .TK, .TD, .Verein
End With
Weiter01:
'Testdaten einlesen
For Zeile = 2 To 35
With ErgebnisArray(Zeile - 1)
.spt = Cells(Zeile, 1)
.Verein = Cells(Zeile, 2)
.Punkte = Cells(Zeile, 3)
.TG = Cells(Zeile, 4)
.TK = Cells(Zeile, 5)
.TD = Cells(Zeile, 6)
Debug.Print .spt, .Punkte, .TG, .TK, .TD, .Verein
End With
Next
'Daten in temporäres Array einlesen
ReDim ArrayTemp(LBound(ErgebnisArray) To UBound(ErgebnisArray), 1 To 6)
ReDim PlazierungArray(LBound(ErgebnisArray) To UBound(ErgebnisArray))
For Zeile = LBound(ErgebnisArray) To UBound(ErgebnisArray)
ArrayTemp(Zeile, 1) = ErgebnisArray(Zeile).spt
ArrayTemp(Zeile, 2) = ErgebnisArray(Zeile).Verein
ArrayTemp(Zeile, 3) = ErgebnisArray(Zeile).Punkte
ArrayTemp(Zeile, 4) = ErgebnisArray(Zeile).TG
ArrayTemp(Zeile, 5) = ErgebnisArray(Zeile).TK
ArrayTemp(Zeile, 6) = ErgebnisArray(Zeile).TD
Next
'Array nach Spalten 3,6,4 / Punkte,TD, TG jeweils absteigend sortieren
strSort = SortArray(arrWerte:=ArrayTemp, varReihenfolge:=Array(3, 6, 4), _
varAufsteigend:=Array(False, False, False))
If strSort  "" Then
MsgBox strSort
Else
'Daten ins Plazierungsarray schreiben
For Zeile = LBound(PlazierungArray) To UBound(PlazierungArray)
With PlazierungArray(Zeile)
.spt = ArrayTemp(Zeile, 1)
.Verein = ArrayTemp(Zeile, 2)
.Punkte = ArrayTemp(Zeile, 3)
.TG = ArrayTemp(Zeile, 4)
.TK = ArrayTemp(Zeile, 5)
.TD = ArrayTemp(Zeile, 6)
Debug.Print .spt, .Punkte, .TG, .TK, .TD, .Verein
End With
Next
'Daten in Tabelle schreiben
Zeile = 2
spalte = 12
For spt = LBound(ArrayTemp) To UBound(ArrayTemp)
Cells(Zeile, spalte) = ArrayTemp(spt, 1)      'spt
Cells(Zeile, spalte + 1) = ArrayTemp(spt, 2)  'Verein
Cells(Zeile, spalte + 2) = ArrayTemp(spt, 3)  'Punkte
Cells(Zeile, spalte + 3) = ArrayTemp(spt, 4)  'TG
Cells(Zeile, spalte + 4) = ArrayTemp(spt, 5)  'TK
Cells(Zeile, spalte + 5) = ArrayTemp(spt, 6)  'TD
Zeile = Zeile + 1
Next
End If
ReDim ArrayTemp(0)
End Sub
Function SortArray(arrWerte As Variant, varReihenfolge As Variant, _
varAufsteigend As Variant) As String
'Sortieren eines mehr-spaltigen 2-dimesionalen Arrays
'Erstellt: fcs 2008-06-07
'Excel-Version: 97
'arrWerte = 2-dimensionales Array
'varReihenfolge = Angabe der Sortierreihenfolge mit den Spaltennummern als Array
'varAufsteigen = Angabe der Sortierung als Array, False=absteigend, True=Aufsteigend
Dim intSort As Integer 'Schleifenzähler für die Sortierreihenfolge
Dim arrSort()      'In diesem Array wird die neue Reihenfolge aus der Sortierung erstellt
Dim arrTempWerte() 'Speichert die Werte des gesamten Arrays vor dem nächsten Sortierlauf
Dim arrVergleich() 'Speichert die Werte aus der zu vergleichenden Spalte
Dim arrTemp()      'Speichert die Vergleichswerte in der neuen Reihenfolge
Dim lngZA&, lngZE& 'Long-Variablen - Array-Größe-Zeilen
Dim lngSA&, lngSE& 'Long-Variablen - Array-Größe-Spalten
Dim lngI&, lngJ&, lngK&, lngF&, lngTemp& 'Long-Variablen - Schleifenzähler
Dim bolVergleich As Boolean
On Error GoTo Fehler
'Prüfung der Parameter
If UBound(arrWerte, 1) = LBound(arrWerte, 1) Then
'Das Datenfeld enthält nur eine Zeile keine Sortierung
GoTo Fehler
End If
If Not IsArray(arrWerte) Then SortArray = "Die übergebenen Daten sind kein Array"
'Anzahl Sortierparameter im Array
If UBound(varReihenfolge)  UBound(varAufsteigend) Then
SortArray = SortArray & vbLf & "Die Variablen ""varReihenfolge"" und ""varAufsteigend""" _
& " müssen die gleiche Anzahl Werte im Array haben!"
End If
'Spaltennummern im Array
For lngI = LBound(varReihenfolge) To UBound(varReihenfolge)
If IsNumeric(varReihenfolge(lngI)) Then
If varReihenfolge(lngI)  UBound(arrWerte, 2) Then
SortArray = SortArray & vbLf & "Die Nummer(n) der zu sortierende(n) Spalte(n) " _
& " müssen innerhalb der Spaltennummern des Arrays liegen!"
Exit For
End If
Else
SortArray = SortArray & vbLf & "Für die Reihenfolge der zu sortierende(n) Spalte(n) " _
& " dürfen nur ganze Zahlen angegeben werden!"
Exit For
End If
Next
'True/False im Array
For lngI = LBound(varAufsteigend) To UBound(varAufsteigend)
If IsNumeric(varAufsteigend(lngI)) Then
If Not (varAufsteigend(lngI) = True Or varAufsteigend(lngI) = False) Then
SortArray = SortArray & vbLf & "Die Werte für die Sortierung dürfen nur " _
& " den Wert False oder True haben!"
Exit For
End If
Else
SortArray = SortArray & vbLf & "Die Werte für die Sortierung dürfen nur " _
& " den Wert False oder True haben!"
Exit For
End If
Next
If SortArray  "" Then GoTo Fehler
'Array-Größen einlesen
'Zeilen
lngZA = LBound(arrWerte, 1)
lngZE = UBound(arrWerte, 1)
'Spalten
lngSA = LBound(arrWerte, 2)
lngSE = UBound(arrWerte, 2)
'Sortier-Reihenfolge in umgekehrter Reihenfolge des Arrays abarbeiten
For intSort = UBound(varReihenfolge) To LBound(varReihenfolge) Step -1
'Temporäre Arrays redimensionieren und so auf Null setzen
ReDim arrTempWerte(lngZA To lngZE, lngSA To lngSE)
ReDim arrVergleich(lngZA To lngZE)
ReDim arrSort(lngZA To lngZE)
ReDim arrTemp(lngZA To lngZE)
'Aktuelle Werte und die Werte der Vergleichsspalte in Arrays einlesen
For lngI = lngZA To lngZE
For lngJ = lngSA To lngSE
arrTempWerte(lngI, lngJ) = arrWerte(lngI, lngJ)
Next
arrVergleich(lngI) = arrWerte(lngI, varReihenfolge(intSort))
Next
'Zeilezähler-Startwert für temporäres Array setzen und Werte einlesen
lngTemp = lngZA
arrSort(lngTemp) = lngZA
arrTemp(lngTemp) = arrVergleich(lngTemp)
'2 bis letzten Wert des Arrays vergleichen
For lngI = lngZA + 1 To lngZE
bolVergleich = False
' Vergleichswert mit den Werten im Temporären/Sortierten Array vergleichen
For lngK = lngZA To lngTemp
If (varAufsteigend(intSort) = False And arrTemp(lngK)  arrVergleich(lngI)) Then
'vorhandene Daten im temporären Array und Sortier-Array _
ab Position um eins im Array verschieben
For lngF = lngTemp + 1 To lngK + 1 Step -1
arrTemp(lngF) = arrTemp(lngF - 1)
arrSort(lngF) = arrSort(lngF - 1)
Next
'Vergleichswert an Position einfügen
arrTemp(lngK) = arrVergleich(lngI)
'Zeilennummer im Sortierarray an Position eintragen
arrSort(lngK) = lngI
bolVergleich = True
Exit For
End If
Next
'Temp-Zähler um 1 erhöhen
lngTemp = lngTemp + 1
If bolVergleich = False Then
'Vergleichswert in Temp-Array eintragen
arrTemp(lngTemp) = arrVergleich(lngI)
'Zeile des Vergleichswertes im Sort-Array eintragen
arrSort(lngTemp) = lngI
End If
Next
'Daten in neuer Sortierung zurückschreiben
For lngI = lngZA To lngZE
For lngJ = lngSA To lngSE
arrWerte(lngI, lngJ) = arrTempWerte(arrSort(lngI), lngJ)
Next
Next
Next
SortArray = ""
Fehler:
If Err.Number  0 Then
If SortArray  "" Then SortArray = SortArray & vbLf
SortArray = SortArray & "Fehler Nr. " & Err.Number _
& " ist in Function "" SortArray"" aufgetreten!" & vbLf & Err.Description
End If
' Variablen aufräumen
ReDim arrTempWerte(0)
ReDim arrVergleich(0)
ReDim arrSort(0)
ReDim arrTemp(0)
End Function


Anzeige
;
Anzeige
Anzeige

Infobox / Tutorial

Inhalte eines Arrays in ein anderes Array kopieren


Schritt-für-Schritt-Anleitung

Um die Inhalte eines Arrays in ein anderes Array in Excel zu kopieren, kannst Du die folgende Schritt-für-Schritt-Anleitung verwenden. Diese Methode basiert auf den von Karsten und fcs im Forum diskutierten Ansätzen.

  1. Globales Array deklarieren: Zuerst musst Du ein Typ-Array für die Ergebnisse erstellen. Dies geschieht durch die Deklaration eines neuen Typs:

    Public Type Ergebnisse
       spt As Integer
       Verein As String
       Punkte As Integer
       TG As Integer
       TK As Integer
       TD As Integer
    End Type
  2. Ergebnis-Array erstellen: Deklariere das Ergebnis-Array in einer Sub-Prozedur:

    Dim ErgebnisArray(1 To 34) As Ergebnisse
  3. Daten einlesen: Fülle das Ergebnis-Array mit den benötigten Daten:

    For Zeile = 2 To 35
       With ErgebnisArray(Zeile - 1)
           .spt = Cells(Zeile, 1)
           .Verein = Cells(Zeile, 2)
           .Punkte = Cells(Zeile, 3)
           .TG = Cells(Zeile, 4)
           .TK = Cells(Zeile, 5)
           .TD = Cells(Zeile, 6)
       End With
    Next
  4. Temporäres Array erstellen: Erstelle ein temporäres Array, um die Daten zu sortieren und in das Ziel-Array zu kopieren:

    ReDim ArrayTemp(LBound(ErgebnisArray) To UBound(ErgebnisArray), 1 To 6)
  5. Daten sortieren: Verwende eine Sortierfunktion, um die Daten im temporären Array zu sortieren:

    strSort = SortArray(arrWerte:=ArrayTemp, varReihenfolge:=Array(3, 6, 4), varAufsteigend:=Array(False, False, False))
  6. Daten in das Ziel-Array kopieren: Schreibe die sortierten Daten in das Platzierungsarray:

    For Zeile = LBound(PlazierungArray) To UBound(PlazierungArray)
       With PlazierungArray(Zeile)
           .spt = ArrayTemp(Zeile, 1)
           .Verein = ArrayTemp(Zeile, 2)
           .Punkte = ArrayTemp(Zeile, 3)
           .TG = ArrayTemp(Zeile, 4)
           .TK = ArrayTemp(Zeile, 5)
           .TD = ArrayTemp(Zeile, 6)
       End With
    Next

Häufige Fehler und Lösungen

  • Fehler bei der Array-Dimensionierung: Achte darauf, dass die Dimensionierung des Arrays korrekt ist. Wenn Du versuchst, auf ein nicht existierendes Element zuzugreifen, wirft Excel einen Laufzeitfehler.

  • Sortierfunktion gibt "Fehler Nr. ..." aus: Prüfe, ob die Parameter für die Sortierfunktion korrekt übergeben werden, insbesondere die Spaltennummern und Sortierreihenfolgen.


Alternative Methoden

Eine andere Methode, um Daten zwischen Arrays zu kopieren, besteht darin, die Application.Transpose-Funktion zu verwenden, um Daten in ein "normales" Array zu übertragen. Diese Methode ist besonders nützlich, wenn Du große Datenmengen verarbeiten musst.

Dim NormalArray As Variant
NormalArray = Application.Transpose(Cells(2, 1).Resize(34, 6).Value)

Praktische Beispiele

Hier ist ein einfaches Beispiel, um die oben genannten Konzepte anzuwenden:

Sub Beispiel()
    Dim ErgebnisArray(1 To 34) As Ergebnisse
    ' ... (Daten einlesen)
    ' Temporäres Array erstellen
    Dim ArrayTemp() As Variant
    ReDim ArrayTemp(1 To 34, 1 To 6)
    ' ... (Daten kopieren)
End Sub

Tipps für Profis

  • Modularisierung des Codes: Teile Deinen Code in kleinere, wiederverwendbare Funktionen auf. Das verbessert die Lesbarkeit und Wartbarkeit Deines VBA-Codes.

  • Fehlerbehandlung einbauen: Implementiere eine Fehlerbehandlung in Deinen Funktionen, um unerwartete Fehler abzufangen. Dies hilft, den Code robuster zu machen.

  • Verwende Option Explicit: Dies zwingt Dich, alle Variablen zu deklarieren, was Fehler im Code vermeiden hilft.


FAQ: Häufige Fragen

1. Wie kann ich ein Array in Excel sortieren?
Du kannst die SortArray-Funktion verwenden, um ein mehrdimensionales Array nach bestimmten Kriterien zu sortieren.

2. Was ist der Unterschied zwischen einem Typ-Array und einem normalen Array in VBA?
Ein Typ-Array ermöglicht es Dir, komplexere Datenstrukturen zu erstellen, während ein normales Array nur einfache Datentypen speichert.

3. Kann ich Daten aus einer Excel-Tabelle direkt in ein Array einlesen?
Ja, Du kannst die Range.Value-Eigenschaft verwenden, um Daten direkt aus einer Excel-Tabelle in ein Array zu laden.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige