Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
512to516
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
512to516
512to516
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

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.

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

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige