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

Mehrere Zeilen aus Array löschen

Mehrere Zeilen aus Array löschen
pastinake
Lieber Leser!
Ich habe per Makro ausgefilterte Zeilennummern in ein Array eingelesen.
Nun möchte ich, dass alle Zeilen aus dem Array (gleichzeitig) selektiert werden.
Mein Makro (Beispiel)
Sub dbReduzieren()
Dim Zeile As Range
Dim LöschZeilen() As Long
Dim x As Long
With ActiveSheet
For Each Zeile In .UsedRange.Rows
If Zeile.Hidden Then
ReDim Preserve LöschZeilen(x)
LöschZeilen(x) = Zeile.row
x = x + 1
End If
Next
If x > 0 Then .Rows(LöschZeilen).Select
End With
End Sub

Lieben Dank für jede Hilfe!
Bernd
AW: Mehrere Zeilen aus Array löschen
20.01.2012 11:47:55
Rudi
Hallo,
lies die lieber in ein Range-Objekt ein.
Sub dbReduzieren()
Dim Zeile As Range
Dim rngRed As Range
With ActiveSheet
For Each Zeile In .UsedRange.Rows
If Zeile.Hidden Then
If rngRed Is Nothing Then
Set rngRed = Zeile
Else
Set rngRed = Union(rngRed, Zeile)
End If
End If
Next
If Not rngRed Is Nothing Then rngRed.Select
End With
End Sub

Aber wozu willst du ausgeblendete Zeilen selektieren?
Gruß
Rudi
AW: Mehrere Zeilen aus Array löschen
20.01.2012 12:02:09
pastinake
Hallo Rudi,
danke,- funktioniert prima.
Der User soll die Möglichkeit haben, ein Datenblatt auf die ausgefilterten Daten (AutoFilter) zu reduzieren.
Dennoch zu meinem Verständnis,- kann ich keine Zeilennummern auf einmal auswählen ?
Danke und Gruß
Bernd
Anzeige
AW: Mehrere Zeilen aus Array löschen
20.01.2012 12:43:24
pastinake
Zusatz:
Natürlich kommt dann ein .delete in den Code
Der Select diente lediglich zum Testen
Bernd
AW: Mehrere Zeilen aus Array löschen
20.01.2012 13:02:12
Christian
Hallo Bernd,
kann ich keine Zeilennummern auf einmal auswählen
doch, einfach mal mit dem Recoder aufnehmen - zB. Range("4:4,7:7,10:10").Select
Dabei darf der String aber nicht länger als 256 Zeichen sein und außerdem sind String-Operationen zeitaufwendig. (Dein "Redim" übrigens auch))
Mit der Union-Methode kann man bestimmt mehr Einzelbereiche zusammenfügen als bei der oben beschriebenen, das wird aber bei mehreren 1000 Ranges sehr sehr langsam.
Bleibt also:
- entweder gleich in der Schleife (dann von hinten nach vorne) deine Zeilen zu löschen oder:
- Verwende den Spezial-Filter - da du hier die ausgeblendeten Zeilen löschen willst, ist das sicher die schnellste Methode.
Probier's einfach mal aus...
Gruß
Christian
Anzeige
AW: Mehrere Zeilen aus Array löschen
20.01.2012 13:46:28
pastinake
Hallo Christian,
nach Meiner/Rudis Methode wird die Datenbank innerhalb von 3 sec von 43421 Zeilen auf 998 reduziert.
Das wird nicht wesentlich schneller gehen,- meine ich!
Dennoch Danke für Deine Gedanken.
Bernd
Na, bei 'ner Datenbank kannst du doch...
20.01.2012 14:17:42
Christian
... gleich mit SQL arbeiten und dir nur die gefilterten Einträge ausgeben lassen.
Bleiben wir aber mal beim Thema "Leere Zeilen in Excel-Tabellen". Im Beispiel-Code wird jede 2 Zeile gelöscht.
- Bei 2000 Zeilen, sprich 1000 Zeilen/Bereiche löschen läuft der Code bei mir ca. 1,5 Sekunden
- bei 4000 Zeilen, sprich 2000 Zeilen/Bereiche löschen läuft der Code bei mir ca. 10 Sekunden
- bei 6000 Zeilen, sprich 3000 Zeilen/Bereiche löschen läuft der Code bei mir ca. 35 Sekunden
...
so lange würde ich nicht warten wollen
Option Explicit
Sub TestIt()
Dim i&, t!
Dim rngUnion As Range
t = Timer
With ActiveSheet
For i = 1 To 6000 Step 2
If rngUnion Is Nothing Then
Set rngUnion = .Rows(i)
Else
Set rngUnion = Union(rngUnion, .Rows(i))
End If
Next
If Not rngUnion Is Nothing Then
rngUnion.Delete
End If
End With
Debug.Print Timer - t
End Sub
Aber wie gesagt, bei 'ner Datenbank gleich SQL statt Nachbearbeitung.
gruß
Christian
Anzeige
kannst mal hier den unterschied testen.
20.01.2012 14:44:53
Tino
Hallo,
zuerst den Button für die Daten drücken damit die Tabelle mit Daten gefüllt wird
und ein Autofilter gesetzt wird.
https://www.herber.de/bbs/user/78530.xls
Das löschen kostet aber nochmals mehr Zeit,
weil die zu löschenden Daten nicht in einem Block zusammen sind.
Gruß Tino
AW: kannst mal hier den unterschied testen.
20.01.2012 15:34:07
pastinake
hmmm....ich kann nicht wiedersprechen ;-)
Um so mehr wundert es mich, dass das Makro (Rudi) in meiner Datenbank so schnell läuft. Scheit dann wohl durch die Struktur begünstigt zu sein.
Aber Dein Beispiel ist mehr als überzeugend ;-)
Gruß
Bernd
Anzeige
AW: kannst mal hier den unterschied testen.
20.01.2012 15:48:54
Tino
Hallo,
habe mal noch mit dem löschen rumgespielt.
Hier werden in meinem Code die Daten sortiert,
so sind die zu löschenden Zeilen in einem Block. (löschen geht so schneller)
Die Reihenfolge der anderen Daten bleibt erhalten.
Vor jedem ausführen muss der 1. Button gedrückt werden, weil die Daten dazwischen gelöscht werden.
https://www.herber.de/bbs/user/78531.xls
Gruß Tino
AW: kannst mal hier den unterschied testen.
20.01.2012 15:43:08
Christian
Hi Tino,
statt 'ner Hilfsspalte kann'ste ja auch gleich 'ne Hilfstabelle nehmen und wie bei Spezialfilter die Daten einfach hin und her kopieren.
Bsp:
Sub TestIt()
Dim i&, t!, wks As Worksheet
t = Timer
Application.ScreenUpdating = False
Set wks = Sheets("Tabelle2")
wks.Cells.Clear
With ActiveSheet
.Columns(1).Resize(, 2).Copy wks.Cells(1, 1)
wks.Columns(1).Resize(, 2).Copy .Cells(1, 1)
If .FilterMode Then .ShowAllData
End With
Application.ScreenUpdating = True
Set wks = Nothing
MsgBox Timer - t
End Sub
ist bei mir ca um Faktor 10 schneller
Gruß
Christian
Anzeige
AW: kannst mal hier den unterschied testen.
20.01.2012 15:57:18
Tino
Hallo,
ja geht auch schnell, aber
die Tabelle muss immer erst erstellt und wieder gelöscht werden
oder man muss speziell eine Tabelle für diese aktion reservieren, gefällt mir persönlich nicht so.
Gruß Tino
AW: kannst mal hier den unterschied testen.
20.01.2012 16:19:19
Christian
Hi Tino,
zugegeben, das ist Gemackssache - ich würde lieber eine lokale oder eine temporäre Hilfs-Tabelle nutzen, als in der Datentabelle eine freie Spalte zu suchen und diese zu manipulieren. Aber da die Daten von Bernd wie er schreibt aus einer Datenbanken stammen, ist das Thema meines Erachtens sowieso hinfällig. Da wäre SQL oder welche Sprache die Datenbank auch immer spricht die erste Lösung.
Gruß
Christian
Anzeige
SQL ist nicht die Lösung
20.01.2012 17:20:01
pastiknake
Meine Datentabelle wird durch ein dynamisches SQL gespeist.
Aber die Datei, die ich dann verschicke, muss durch meine Empfänger bei Bedarf reduziert werden können.
Meine Datenbank versende ich ja nicht.
Auch ein Zugriffskonzept über Datenbankfreigabe ist ausgeschlossen (interne/externe Nutzer)
Lieben Dank Euch beiden für die Lösungsvorschläge. Ich komme so deutlich weiter und kann mein Vorhaben am Montag finalisieren ;-)
Gruß
Bernd
AW: SQL ist nicht die Lösung
20.01.2012 18:26:38
Christian
Hi all,
@Tino: Danke für die Zustimmung und Rückmeldung.
@Bernd: ein Zugriffskonzept über Datenbankfreigabe ist ausgeschlossen (interne/externe Nutzer).
hierzu mein Tipp - ohne weitere Kenntnis und Einblick in deine Datenbank würde ich mal in Richtung Mandanten "schießen". Das setzt natürlich voraus, dass deine Datenbank mandantenfähig ist.
Ansonsten als Behelfslösung Tinos oder meinen Beispiel-Code - bzgl. Laufzeit ist Tino's Ansatz auf meinem Rechner um ca. 10% schneller - da bewegen wir uns aber im Bereich von zehntel Sekunden ... persönlich finde ich meinen Code da einfacher und übersichtlicher - aber wie gesagt, das ist geschmacksache.
Gruß
Christian
Anzeige
@Christian, da hast Du recht. oT.
20.01.2012 17:23:18
Tino
AW: Mehrere Zeilen aus Array löschen
20.01.2012 12:16:38
Tino
Hallo,
das geht so nicht, dass Rangeobjekt kann kein Array verarbeiten.
Hier eine Version mit Hilfsspalte, diese wird wieder gelöscht.
Kannst mal unter xl2003 testen, funktioniert unter xl2007 recht gut.
Sub dbReduzieren()
Dim UnionRange As Range, iCalc%

With Application
    iCalc = .Calculation
    .ScreenUpdating = False
    .EnableEvents = False
    .Calculation = xlCalculationManual
    
        With ActiveSheet.UsedRange
            With .Columns(.Columns.Count).Offset(0, 1) 'Hilfsspalte 
                On Error Resume Next
                 .SpecialCells(xlCellTypeVisible).FormulaR1C1 = 1 'Sichtbare Zellen belegen 
                 Set UnionRange = .SpecialCells(xlCellTypeBlanks).EntireRow 'leere Zellen merken 
                On Error GoTo 0
                .EntireColumn.Delete 'Hilfsspalte löschen 
            End With
        End With
    
    .Calculation = iCalc
    .ScreenUpdating = True
    .EnableEvents = True
End With

If Not UnionRange Is Nothing Then
    UnionRange.Select
    MsgBox "Der Bereich " & UnionRange.Address(0, 0) & " wurde selektiert"
End If
End Sub
Gruß Tino
Anzeige
AW: Mehrere Zeilen aus Array löschen
20.01.2012 12:26:27
pastinake
Hallo Tino,
DANKE für Deine Mühe. Schau Dir mal die Version von Rudi an,- gefällt mir ohne Hilfsspalte besser.
Läuft auch schneller ;-)
Aber auch Deine Version ist clever!
Bernd
AW: Mehrere Zeilen aus Array löschen
20.01.2012 12:45:27
Tino
Hallo,
mein Code ist für größere Tabellen gedacht in der viele Zeilen ausgeblendet sind.
Gruß Tino

308 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige