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

schneller löschen?

schneller löschen?
21.03.2018 12:19:50
Burak
Guten Morgen!
Heute geht es darum, dass aus importierten Daten je nach Wunsch die nicht erwünschten rausgeschmissen werden.
Es wird ein Start- und ein Enddatum über eine InputBox in Variablen geschrieben (StartDatum und EndDatum).
In Spalte E steht das Datum und in Spalte F die Uhrzeit!
EIN (Arbeits-)Tag besteht aus 3 Schichten.
Die Frühschicht von 06:00 - 13:59 Uhr
Die Spätschicht von 14:00 - 21:59 Uhr
Die Nachtschicht von 22:00 - 05:59 Uhr
Jetzt wird Zeile für Zeile in einer Schleife erst geprüft, ob der Wert in der Datumsspalte älter als das eingegebene Startdatum
oder
2 Tage weiter als das gewünschte Enddatum ist. (2 Tage, weil die Nachtschicht des Enddatums ja datumtechnisch 1 Tag weiter geht als das eingegebene Enddatum)
Im 2. Schritt werden vom ersten Tag alle Daten vor 06:00:00 Uhr entfernt (mittels >0,25)
und im 3. Schritt alle Daten vom Tag nach dem eingegebenen EndDatum ab 06:00 Uhr (mittels >=0,25)

'Zeilen zählen
Zeilenzahl = .Range("B1").CurrentRegion.Rows.Count
'Zielbereich festlegen
For j = 2 To Zeilenzahl
'Datum außerhalb Einträge entfernen
If .Range("E" & j).Value  EndDatum + 1 Then
.Rows(j).Delete
j = j - 1
'Einträge vor der ersten Frühschicht entfernen
ElseIf .Range("E" & j).Value = StartDatum And .Range("F" & j).Value = 0.25 Then
.Rows(j).Delete
j = j - 1
End If
Next j
Datenansicht:
Hilfstabelle

 ABCDEF
1BarcodeMasterbarcodeSchichtLP NutzenDatumUhrzeit
234203420153123NS612.03.201805:58:06
334203420153119NS612.03.201805:59:01
434203420153101FS612.03.201806:01:53
534203420153095FS612.03.201806:02:52
656405640044145FS612.03.201813:58:48
756405640044151FS612.03.201813:59:48
856405640044169SS612.03.201814:01:47
956405640044193SS612.03.201814:02:45
1040724072252078SS212.03.201821:59:20
1140724072252222SS212.03.201821:59:44
1240724072252294NS212.03.201822:07:16
1340724072252298NS212.03.201822:07:47
1434303430154057NS613.03.201805:58:48
1534303430154051NS613.03.201805:59:44
1634303430154752FS613.03.201806:04:01
1734303430154746FS613.03.201806:05:26

Der Vorgang braucht definitiv zu lange, und ich weiß nich warum. Sollte eigentlich schnell gehen, oder?
Sind For-Schleifen grundsätzlich langsam?
Freundliche Grüße

6
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: schneller löschen?
21.03.2018 12:36:27
Rudi
Hallo,
auf die Schnelle:
Dim rngDel As Range
'Zeilen zählen
Zeilenzahl = .Range("B1").CurrentRegion.Rows.Count
'Zielbereich festlegen
For j = 2 To Zeilenzahl
'Datum außerhalb Einträge entfernen
If .Cells(j, 5).Value  EndDatum + 1 Then
If rngDel Is Nothing Then
Set rngDel = .Rows(j)
Else
Set rngDel = Union(rngDel, .Rows(j))
End If
'Einträge vor der ersten Frühschicht entfernen
ElseIf .Cells(j, 5).Value = StartDatum And .Cells(j, 6).Value = 0.25 Then
If rngDel Is Nothing Then
Set rngDel = .Rows(j)
Else
Set rngDel = Union(rngDel, .Rows(j))
End If
End If
Next j
If Not rngDel Is Nothing Then rngDel.Delete
Gruß
Rudi
Anzeige
Läuft! Super! Danke! o.w.T.
21.03.2018 12:48:55
Burak
AW: schneller löschen?
21.03.2018 12:46:01
Peter(silie)
Hallo,
keine Ahnung was für dich schnell oder langsam ist...
Mit dem Code unten hat es für 570 Zeilen 0,24ms gedauert.
Tabellen Blatt Code:

Option Explicit
Sub a()
Test (Date + 5), (Date + 15)
End Sub
Sub Test(ByVal StartDatum As Date, ByVal EndDatum As Date)
Dim vData       As Variant
Dim indizes()   As Long
Dim i           As Long
Dim j           As Long
Dim t As Double
t = Timer_.MicroTimer
With Me
i = .Range("B1").CurrentRegion.Rows.Count
vData = .Range(.Cells(1, 5), .Cells(i, 6)).Value
i = 0
For j = UBound(vData, 1) To LBound(vData, 1) Step -1
If vData(j, 1)  EndDatum + 1 Then
ReDim Preserve indizes(i)
indizes(i) = j
i = i + 1
ElseIf vData(j, 1) = StartDatum And vData(j, 2) = 0.25 Then
ReDim Preserve indizes(i)
indizes(i) = j
i = i + 1
End If
Next j
Application.ScreenUpdating = False
For j = LBound(indizes) To UBound(indizes)
.Cells(indizes(j), 1).EntireRow.Delete
Next j
Application.ScreenUpdating = True
End With
Debug.Print Round((Timer_.MicroTimer - t), 2) & "ms"
End Sub

Timer_ Modul Code:
#If VBA7 Then
Private Declare PtrSafe Function getFrequency Lib "kernel32" Alias _
"QueryPerformanceFrequency" (cyFrequency As Currency) As Long
Private Declare PtrSafe Function getTickCount Lib "kernel32" Alias _
"QueryPerformanceCounter" (cyTickCount As Currency) As Long
#Else
Private Declare Function getFrequency Lib "kernel32" Alias _
"QueryPerformanceFrequency" (cyFrequency As Currency) As Long
Private Declare Function getTickCount Lib "kernel32" Alias _
"QueryPerformanceCounter" (cyTickCount As Currency) As Long
#End If
Public Function MicroTimer() As Double
' returns seconds
' uses Windows API calls to the high resolution timer
Dim cyTicks1 As Currency
Dim cyTicks2 As Currency
Static cyFrequency As Currency
MicroTimer = 0
' get frequency
If cyFrequency = 0 Then getFrequency cyFrequency
' get ticks
getTickCount cyTicks1
getTickCount cyTicks2
If cyTicks2 
Hier die bsp Datei: https://www.herber.de/bbs/user/120560.xlsm
Anzeige
AW: schneller löschen?
21.03.2018 14:06:19
Burak
wir reden aber von mehreren hunderttausend Zeilen :D
verkürzt
21.03.2018 12:46:38
Rudi

Dim rngDel As Range
'Zeilen zählen
Zeilenzahl = .Range("B1").CurrentRegion.Rows.Count
'Zielbereich festlegen
For j = 2 To Zeilenzahl
'Datum außerhalb Einträge entfernen
Select Case .Cells(j, 5) + .Cells(j, 6)   'Datum+Zeit
Case startDatum + 0.25 To endDatum + 1 + 0.249999
'nix machen
Case Else
'Zeile merken
If rngDel Is Nothing Then
Set rngDel = .Rows(j)
Else
Set rngDel = Union(rngDel, .Rows(j))
End If
End Select
'Einträge vor der ersten Frühschicht entfernen
Next j
If Not rngDel Is Nothing Then rngDel.Delete

Anzeige
AW: schneller löschen?
21.03.2018 13:30:00
Daniel
Hi
was hier langsam ist, ist das Löschen der Zeilen.
jedesmal, wenn du eine Zeile löschst, muss Excel eine Vielzahl von Aktionen im Hintergrund ausführen.
ein Weg zum Beschleunigen wäre also, nicht jede Zeile einzeln, sondern möglichst viele Zeilen in einem Schritt zu löschen.
das löschen von 1000 Zeilen im Block dauert auch nicht länger als das Löschen einer Zeile, weil Excel dann diese Aktionen für alle Zeilen in einem Schritt ausführen kann
eine Möglichkeit wäre also, die Tabelle nach Datum + Uhrzeit zu sortieren und dann die Zeilennummer zu finden bis zu der du löschen musst und die Zeilennummer zu finden, ab der du löschen musst.
dazu müsstest du in einer Hilfsspalte dann Datum und Zeit zusammenaddieren und mit VERGLEICH (in VBA Worksheetfunction.Match die Zeilennummern ermitteln)
es gibt aber noch eine andere Methode, mit der du sehr schnell Zeilen aus einer Tabelle entfernen kannst, ohne die Tabelle zu sortieren:
das ist Daten - Datentools - Duplikate entfernen
hier zu schreibt man in eine Hilfsspalte am Tabellenende eine Formel, welche alle zu löschenden Zeilen mit 0 markiert und die anderen mit der Zeilennummer.
in die Überschriftenzeile kommt ebenfalls die 0
dann wendet man auf die Tabelle das DuplikateEntfernen an mit der Hilfsspalte als Kriterium und die unnötigen Zeilen verschwinden.
Code dafür sieht so aus
Sub test()
Dim Startdatum As String
Dim Enddatum As String
Startdatum = InputBox("Start")
Enddatum = InputBox("Ende")
If IsDate(Startdatum) And IsDate(Enddatum) Then
With ActiveSheet.Cells(1, 1).CurrentRegion
With .Columns(.Columns.Count + 1)
.FormulaLocal = "=wenn(oder((E1+F1)=" & CDbl(CDate(Enddatum)) + 1.25 & ");0;Zeile())"
.Cells(1, 1).Value = 0
.EntireRow.RemoveDuplicates .Column, xlNo
.ClearContents
End With
End With
End If
End Sub
gruß Daniel
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige