Microsoft Excel

Herbers Excel/VBA-Archiv

Informationen und Beispiele zum Thema MsgBox
BildScreenshot zu MsgBox MsgBox-Seite mit Beispielarbeitsmappe aufrufen

Mehrere Zeilen aus Array löschen | Herbers Excel-Forum


Betrifft: Mehrere Zeilen aus Array löschen von: pastinake
Geschrieben am: 20.01.2012 11:13:10

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

  

Betrifft: AW: Mehrere Zeilen aus Array löschen von: Rudi Maintaire
Geschrieben am: 20.01.2012 11:47:55

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


  

Betrifft: AW: Mehrere Zeilen aus Array löschen von: pastinake
Geschrieben am: 20.01.2012 12:02:09

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


  

Betrifft: AW: Mehrere Zeilen aus Array löschen von: pastinake
Geschrieben am: 20.01.2012 12:43:24

Zusatz:
Natürlich kommt dann ein .delete in den Code
Der Select diente lediglich zum Testen

Bernd


  

Betrifft: AW: Mehrere Zeilen aus Array löschen von: Christian
Geschrieben am: 20.01.2012 13:02:12

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


  

Betrifft: AW: Mehrere Zeilen aus Array löschen von: pastinake
Geschrieben am: 20.01.2012 13:46:28

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


  

Betrifft: Na, bei 'ner Datenbank kannst du doch... von: Christian
Geschrieben am: 20.01.2012 14:17:42

... 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


  

Betrifft: kannst mal hier den unterschied testen. von: Tino
Geschrieben am: 20.01.2012 14:44:53

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


  

Betrifft: AW: kannst mal hier den unterschied testen. von: pastinake
Geschrieben am: 20.01.2012 15:34:07

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


  

Betrifft: AW: kannst mal hier den unterschied testen. von: Tino
Geschrieben am: 20.01.2012 15:48:54

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


  

Betrifft: AW: kannst mal hier den unterschied testen. von: Christian
Geschrieben am: 20.01.2012 15:43:08

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


  

Betrifft: AW: kannst mal hier den unterschied testen. von: Tino
Geschrieben am: 20.01.2012 15:57:18

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


  

Betrifft: AW: kannst mal hier den unterschied testen. von: Christian
Geschrieben am: 20.01.2012 16:19:19

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


  

Betrifft: SQL ist nicht die Lösung von: pastiknake
Geschrieben am: 20.01.2012 17:20:01

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


  

Betrifft: AW: SQL ist nicht die Lösung von: Christian
Geschrieben am: 20.01.2012 18:26:38

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


  

Betrifft: @Christian, da hast Du recht. oT. von: Tino
Geschrieben am: 20.01.2012 17:23:18




  

Betrifft: AW: Mehrere Zeilen aus Array löschen von: Tino
Geschrieben am: 20.01.2012 12:16:38

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


  

Betrifft: AW: Mehrere Zeilen aus Array löschen von: pastinake
Geschrieben am: 20.01.2012 12:26:27

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


  

Betrifft: AW: Mehrere Zeilen aus Array löschen von: Tino
Geschrieben am: 20.01.2012 12:45:27

Hallo,
mein Code ist für größere Tabellen gedacht in der viele Zeilen ausgeblendet sind.


Gruß Tino


Beiträge aus den Excel-Beispielen zum Thema "Mehrere Zeilen aus Array löschen"