Anzeige
Archiv - Navigation
1628to1632
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

Optimierung von VBA Code - leere Zeilen löschen

Optimierung von VBA Code - leere Zeilen löschen
12.06.2018 15:25:31
VBA
Hallo,
ich habe ein Blatt mit sehr viele Datensätze (bis zu ca. 100.000 Zeilen - die Zeilenanzahl ist aber jedesmal variable).
Ich habe naivenhaft ein Makro gebastelt, das ohne Fehlermeldung funktioniert. Allerdings dauert es Stunden bis alles erledigt ist.
FRAGE: Kann mir BITTE jemand den Code so optimieren, dass die Durchlaufszeit des Makros wesentlich verkürzt wird?
Makro soll folgendes tun:
1. Wenn in Spalte G leere Zellen gibt, dann die ganze Zeile löschen
2. Wenn in Spalte G ein Betrag steht, aber in Spalte A in der dazu gehörigen Zeile nichts steht, dann sollen die Daten von der vorherigen Zeile aus der Spalte A-D reinkopiert werden.
Vielen Dank im Voraus für Eure Tipps!!
Hier kommt der Code:
Sub LoeschenLeereZelleninSpalteG()‎
Dim lgCount As Long
Dim lgLetzte As Long
lgLetzte = ActiveSheet.Cells(Rows.Count, 7).End(xlUp).Row
For lgCount = lgLetzte To 2 Step -1‎
‎  If Cells(lgCount, 7) = "" Then Rows(lgCount).Delete
Next
lgLetzte = ActiveSheet.Cells(Rows.Count, 7).End(xlUp).Row
For lgCount = lgLetzte To 2 Step -1‎
‎ If Cells(lgCount, 1) = "" Then
‎  Range(Cells(lgCount - 1, 1), Cells(lgCount - 1, 4)).Copy Range(Cells(lgCount, 1),  _
Cells(lgCount, 4))‎
‎  End If
‎  ‎
Next
End Sub

5
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Rückfragen
12.06.2018 16:15:21
Zwenn
Hallo Meli,
Im weitesten Sinne zu 1.
  • Enthält die Tabelle Formeln?

  • Zu 2.
  • Du befüllst die Spalten A bis D von unten nach oben. Das bedeutet, wenn es zwei Zeilen übereinander gibt, in denen in Spalte A nix drin steht, kopierst Du leere Inhalte. Das muss also meines Erachtens nach von oben nach unten passieren. Wobei dann zu beachten ist, dass bei zwei Zeilen untereinander, in denen in Spalte A nix steht, der gleiche Inhalt aus der Zeile vor der ersten landet, usw.

  • Was ist für den Fall, das bereits die erste abgefragte Zeile in Spalte A keinen Inhalt hat? Darüber gibt es dann ja faktisch nix, was kopiert werden kann.

  • Viele Grüße,
    Zwenn
    Anzeige
    AW: Rückfragen
    12.06.2018 16:45:27
    Norman
    Bei mir hat es geholfen, das Bildschrimupdate zu deaktivieren.
    Dafür dieser Befehl:
    Application.ScreenUpdating = False
    Application.ScreenUpdating = True
    Dazu würde ich beide Abfragen in eine Schleife packen. Dann muss er nicht die ganze Tabelle zweimal durchlaufen.
    Ungefähr so:
    Sub LoeschenLeereZelleninSpalteG()‎
    Dim lgCount As Long
    Dim lgLetzte As Long
    Application.ScreenUpdating = False ' Live Anzeige ausschalten
    lgLetzte = ActiveSheet.Cells(Rows.Count, 7).End(xlUp).Row
    For lgCount = lgLetzte To 2 Step -1‎
    If Cells(lgCount, 7) = "" Then
    Rows(lgCount).Delete
    if else Cells(lgCount, 1) = "" Then
    Range(Cells(lgCount - 1, 1), Cells(lgCount - 1, 4)).Copy Range(Cells(lgCount, 1), Cells( _
    lgCount, 4))‎
    ‎  	End If
    Next
    Application.ScreenUpdating = True ' Live Anzeige wieder einschalten
    End Sub
    
    Ungetestet / kein Gewähr!
    Anzeige
    AW: Versuch's mal so,...
    12.06.2018 16:27:01
    Michael
    Hallo!
    Hab's kurz riskiert ohne genauere Spezifikationen, ich hoffe ich bereue das nicht ;-):
    Sub a()
    Dim Ws As Worksheet: Set Ws = ActiveSheet
    Dim rDel As Range, rFill As Range, a, i&, j&
    Application.ScreenUpdating = False
    With Ws
    Set rDel = .Columns(7).SpecialCells(xlCellTypeBlanks)
    rDel.EntireRow.Delete
    Set rFill = .Range(.Cells(1, 1), .Cells(.Rows.Count, 7).End(xlUp))
    a = rFill
    For i = LBound(a, 1) + 1 To UBound(a, 1)
    If a(i, 7)  "" And a(i, 1) = "" Then
    For j = 1 To 4
    a(i, j) = a(i - 1, j)
    Next j
    End If
    Next i
    rFill = a
    End With
    End Sub
    
    LG
    Michael
    Anzeige
    AW: Optimierung von VBA Code - leere Zeilen lösc
    12.06.2018 18:02:17
    VBA
    Hi
    erstmal ne Frage zu deiner Version:
    stimmt Excel XP?
    das kann nämlich maximal 65536 Zeilen verarbeiten und keine 100.000.
    aber probier mal diesen Code, der sollte mit allen Excelversionen funktionieren:
    Sub xxx()
    With ActiveSheet.UsedRange
    With .Columns(.Columns.Count + 1)
    .FormulaR1C1 = "=IF(RC7="""",1,"""")"
    .Formula = .Value
    .Cells(1, 1).ClearContents
    .EntireRow.Sort key1:=.Cells(1, 1), order1:=xlAscending, Header:=xlYes
    If .Cells(2, 1).Value = 1 Then .SpecialCells(xlCellTypeConstants, 1).EntireRow.Delete
    .ClearContents
    End With
    End With
    With ActiveSheet.UsedRange
    With .Columns(.Columns.Count + 1).Resize(.Rows.Count - 1, 4).Offset(1, 0)
    .Select
    .FormulaR1C1 = "=IF(RC1="""",R[-1]C[" & 1 - .Column & "],RC[" & 1 - .Column & "])"
    .Copy
    .Offset(0, 1 - .Column).PasteSpecial xlPasteValues
    .ClearContents
    End With
    End With
    End Sub
    
    Gruß Daniel
    Anzeige
    AW: Optimierung von VBA Code - leere Zeilen löschen
    13.06.2018 14:12:24
    VBA
    DANKE an alle. Werde es die nächsten Tage ausprobieren (und notfalls nochmal nachfragen).

    353 Forumthreads zu ähnlichen Themen

    Anzeige
    Anzeige
    Anzeige

    Beliebteste Forumthreads (12 Monate)

    Anzeige

    Beliebteste Forumthreads (12 Monate)

    Anzeige
    Anzeige
    Anzeige