Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Zeilen aus Array schnell entfrenen

Forumthread: Zeilen aus Array schnell entfrenen

Zeilen aus Array schnell entfrenen
09.11.2004 17:35:50
Lupus
Hallo Excel-User,
Wie kann man in einem zweidimensionalen Array bestimmte „Zeilen“ löschen / in ein neues Array schreiben?
Zum Beispiel soll die Zeile des Arrays „Array_Parent(20, 100)“ in ein neues Array „Array_Child(20,?)“ geschrieben werden, wenn in „Spalte 17“ eine „0“ steht.
For i = 1 To 20
If Array_Parent(i,17) = 0 Then
Schreibe die gesamte Zeile in ein neues Array (Array_Child)
oder lösche diese Zeile
Next
Gruß Lupus
p.s.: Vielen Dank an den Ratgeber der mir bezüglich der Combobox-Columnhead-Beschriftung geantwortet hat. Mir fehlte leider die Zeit für die Rückantwort.
Anzeige

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

Betreff
Datum
Anwender
Anzeige
AW: Zeilen aus Array schnell entfrenen
10.11.2004 22:54:25
Nepumuk
Hallo Wolf,
ich schon wieder :-)
Da kannst du nur mit Schleifen arbeiten. Aber das geht so schnell, da musst du dir nicht den Kopf zerbrechen, was es noch zu verbessern gäbe.
Gruß
Nepumuk
AW: Zeilen aus Array schnell entfrenen
Lupus
Hallo Nepumuk,
danke, schön mal wieder was von Dir zu hören.
Im Prinzip habe ich mein Problem gelöst, in dem ich eine doppelte For Next-Schleife konstruiert habe und dann jedes einzelne Feld des Array-Parent in das Array-Child schreibe. Aber bei mir dauert das ziemlich lange. Bei einem Array von 20 x 5000 Felder dauert das bei mir über 5 Minuten. Vielleicht hängt das auch mit der Installation von XP SP2 zusammen. Die Maus ist langsamer und stockt in Spielen. Jetzt deinstalliere ich wieder SP2.
Hast Du vielleicht einen Tip, wo man gezielt über die Handhabung von Arrays nachlesen kann? Mir ist zum Beispiel nicht ganz klar, wann man die Dimensionierung eines Arrays mit und ohne Klammern schreibt?
Dim Array_1 As Variant
Dim Array_1() As Variant
Gruß Lupus
Anzeige
AW: Zeilen aus Array schnell entfrenen
11.11.2004 19:42:28
Nepumuk
Hallo Wolf,
da ist was faul, denn ein Test mit diesem Array: arr(1 To 200, 1 To 50000) dauert gerade mal 0,15625 Sekunden. Ich habe Excel2000 mit SP3 allerdings unter Windows2000. Hast du WindowsXP ? Ich habe schon öfters gehört, das es da Probleme gibt.
Gruß
Nepumuk
AW: Array-Code optimieren?
12.11.2004 11:39:28
Lupus
Hallo Nepumuk,
habe mein Code auf einem anderen Rechner geprüft, und dort wird er wesentlich schneller abgearbeitet, dennoch ist er für die Datenmenge zu langsam (ca 2,5 Sek.).
Könntest Du mal auf meinen Code schauen,ob man ihn noch etwas optimieren kann?
Option Explicit
Option Base 1
Public arrParent As Variant
Public arrChild As Variant
Public LetzteZeile As Integer, k As Integer

Private Sub UserForm_Initialize()
Dim arrTemp() As Variant
Dim i As Integer, j As Integer, l As Integer
Dim intZahl As Integer
With Worksheets(1)
LetzteZeile = .Cells(Rows.Count, 1).End(xlUp).Row
arrParent = .Range(.Cells(2, 1), .Cells(LetzteZeile, 17))
End With
For i = 1 To LetzteZeile - 1
If arrParent(i, 17) = "1" Then
k = k + 1
End If
Next
'Hier ist der Flaschenhals
For i = 1 To LetzteZeile - 1
If arrParent(i, 17) = "0" Then
GoTo weiter
End If
l = l + 1
If l > k Then GoTo Ende
For j = 1 To 11
ReDim Preserve arrTemp(1 To k, 1 To 17)
arrTemp(l, j) = arrParent(i, j)
Next
arrChild = arrTemp
weiter:
Next
Ende:
End Sub

Gruß Lupus
p.s.: Hoffentlich fällt dieser Beitrag nicht aus der Liste!
Anzeige
AW: Array-Code optimieren?
12.11.2004 18:07:43
Nepumuk
Hi Wolf,
0,125 Sekunde bei 12.000 Zeilen in arrParent und 6000 Zeilen ArrChild. Ist das in Ordnung?


Private Sub UserForm_Initialize()
    Dim intRowIndex As Integer, intColumnIndex As Integer, intRowCount As Integer
    With Worksheets(1)
        arrParent = .Range(.Cells(2, 1), .Cells(.Cells(Rows.Count, 1).End(xlUp).Row, 17))
    End With
    For intRowIndex = 1 To UBound(arrParent)
        If arrParent(intRowIndex, 17) = 1 Then intRowCount = intRowCount + 1
    Next
    ReDim arrTemp(1 To intRowCount, 1 To 17)
    intRowCount = 0
    For intRowIndex = 1 To UBound(arrParent)
        If arrParent(intRowIndex, 17) = 1 Then
            intRowCount = intRowCount + 1
            For intColumnIndex = 1 To 11
                arrTemp(intRowCount, intColumnIndex) = arrParent(intRowIndex, intColumnIndex)
            Next
        End If
    Next
    arrChild = arrTemp
End Sub


Gruß
Nepumuk
Anzeige
AW: Array-Code optimieren?
12.11.2004 21:55:54
Lupus
Hallo Nepumuk,
interessante Code-Umstellung, viiiiiiielen Dank, jetzt geht die Post ab.
Noch eine kleine Frage zum Verständnis zu ReDim und ReDim Preseve.
Wann benutzt man ReDim und wann ReDim Preseve? Ich mach das immer durch Ausprobieren.
In meinem alten Code wurde das Array innerhalb der Schleife immer neu dimensioniert ( ReDim Preserve arrTemp(1 To k, 1 To 17), kam hierdurch die Geschwindigkeitsbremse des Codes?
Man soll sich ja nicht selber loben, aber eigentlich ist dies ein interessanter und lehrreicher Thread geworden, den man für viele Sachen gebrauchen kann.
Gruß Lupus
Anzeige
AW: Array-Code optimieren?
12.11.2004 22:17:53
Nepumuk
Hi Wolf,
da waren mehrere angezogene Handbremsen.
dein Code:


For i = 1 To LetzteZeile - 1
    If arrParent(i, 17) = "0" Then
        GoTo weiter ' Zusätzliche Anweisung die abgearbeitet werden muss
    End If
    l = l + 1 'Zusätzlicher Zähler
    If l > k Then GoTo Ende 'Zusätzliche Abfrage
    For j = 1 To 11
        ReDim Preserve arrTemp(1 To k, 1 To 17) 'bei jedem Wert Platz im Arbeitsspeicher resevieren
        arrTemp(l, j) = arrParent(i, j)
    Next
    arrChild = arrTemp 'jedes mal wenn arrTemp geändert dann an arrChild übergeben = Hauptbremse
weiter:
Next
Ende:


Preserve benötigst du, wenn du die Werte im Array behalten willst. Redim ohne Presever löscht die Inhalte im Array. Aber, mit Preserve kannst du nur die letzte Dimension eines Arrays ändern.
Beispiel:


Public Sub test()
    Dim strArray() As String 'dynamisches Array anlegen
    
    ReDim strArray(1 To 10, 1 To 10, 1 To 10) 'Array dimensionieren
    
    ReDim strArray(1 To 5, 1 To 10, 1 To 10) 'irgendeine Dimension ohne Preserve geht
    
    ReDim Preserve strArray(1 To 5, 1 To 10, 1 To 5) 'letzte Dimension mit Preserve geht
    
    ReDim Preserve strArray(1 To 5, 1 To 5, 1 To 5) 'ein andere als die letzte Dimension mit Preserve geht nicht
End Sub


Jetzt klarer? Steht aber auch in der Hilfe!
Anzeige
;
Anzeige
Anzeige

Infobox / Tutorial

Zeilen aus Array schnell entfernen


Schritt-für-Schritt-Anleitung

Um in einem zweidimensionalen Array (z.B. Array_Parent) bestimmte Zeilen zu entfernen und in ein neues Array (z.B. Array_Child) zu schreiben, kannst du die folgende VBA-Prozedur verwenden:

Option Explicit
Public arrParent As Variant
Public arrChild As Variant

Private Sub UserForm_Initialize()
    Dim LetzteZeile As Integer
    Dim k As Integer
    Dim i As Integer

    With Worksheets(1)
        LetzteZeile = .Cells(Rows.Count, 1).End(xlUp).Row
        arrParent = .Range(.Cells(2, 1), .Cells(LetzteZeile, 17))
    End With

    For i = 1 To LetzteZeile - 1
        If arrParent(i, 17) = "0" Then
            k = k + 1
        End If
    Next i

    ReDim arrChild(1 To k, 1 To 17)
    k = 0

    For i = 1 To LetzteZeile - 1
        If arrParent(i, 17) = "0" Then
            k = k + 1
            For j = 1 To 17
                arrChild(k, j) = arrParent(i, j)
            Next j
        End If
    Next i
End Sub

Diese Prozedur liest die Daten aus einem Arbeitsblatt, zählt die Zeilen mit einer "0" in Spalte 17 und kopiert diese in ein neues Array.


Häufige Fehler und Lösungen

  1. Dauer der Ausführung: Wenn der Code zu lange dauert, könnte es an der Verwendung von ReDim Preserve innerhalb der Schleife liegen. Dies verlangsamt die Ausführung erheblich, da bei jedem Schritt die Array-Dimensionierung neu durchgeführt wird.

    Lösung: Dimensioniere das Array vor der Schleife, um die Geschwindigkeit zu erhöhen.

  2. Typenkonflikte: Achte darauf, dass die Datentypen in den Arrays übereinstimmen. Wenn du ein Variant verwendest, stelle sicher, dass du die richtigen Werte zuweist.


Alternative Methoden

Eine alternative Methode zur Bearbeitung von Arrays ist die Verwendung von Collection oder Dictionary-Objekten. Diese Objekte ermöglichen eine flexiblere Handhabung von Daten und können die Performance in bestimmten Fällen verbessern.

Beispiel mit Collection:

Dim coll As Collection
Set coll = New Collection

For i = 1 To UBound(arrParent)
    If arrParent(i, 17) = "0" Then
        coll.Add arrParent(i)
    End If
Next i

' Umwandlung in Array
arrChild = Application.Transpose(coll)

Praktische Beispiele

Beispiel 1: Du möchtest alle Zeilen aus einem Array, bei denen in Spalte 17 eine "1" steht, in ein neues Array kopieren:

For i = 1 To LetzteZeile
    If arrParent(i, 17) = "1" Then
        ' Zeile in arrChild kopieren
    End If
Next i

Beispiel 2: Ändere den Code, um eine andere Bedingung zu testen, z.B. um nur Zeilen mit einem bestimmten Wert in einer anderen Spalte zu kopieren.


Tipps für Profis

  • Vermeide GoTo: Versuche, die Verwendung von GoTo zu minimieren, da dies den Code schwerer lesbar macht. Nutze stattdessen strukturierte Programmierung mit Schleifen und Bedingungen.

  • Verwende UBound: Nutze UBound für die Dimensionierung von Arrays, um sicherzustellen, dass du die richtige Größe verwendest und Fehler zu vermeiden.

  • Optimiere Schleifen: Überlege, wie viele Schleifen du benötigst. Oft kannst du mehrere Bedingungen in einer Schleife abarbeiten.


FAQ: Häufige Fragen

1. Wie kann ich die Größe eines Arrays dynamisch ändern? Du kannst die Funktion ReDim verwenden, um die Größe eines Arrays zu ändern. Wenn du die bestehenden Werte beibehalten möchtest, benutze ReDim Preserve.

2. Was ist der Unterschied zwischen ReDim und ReDim Preserve? ReDim ändert die Größe eines Arrays und löscht alle bestehenden Werte. ReDim Preserve behält die Werte in allen Dimensionen, außer der letzten, bei.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige