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

Zeilen schnell löschen

Zeilen schnell löschen
08.08.2017 11:20:56
lutz
Hallo liebe Excel-Profis,
ich habe ein Problem bei dem mich die Recherche leider nicht weitergebracht hat.
Ich muß in einem Tabellentblatt viele Zeilen löschen und das für eine Liste von Mitarbeitern und nach dem löschen müssen Pivots aktualisiert werden und die Datei anschliessend nach Mitarbeiter gespeichert werden.
Ziel ist es, die Datei je Mitarbeiter nur mit seinen Daten abzuspeichern und zu versenden
Das löschen bekomme ich so hin aber es ist sehr sehr langsam:
Sub B_loeschNot()
Dim JCvariable As String
JCvariable = Worksheets("Namen").Range("A6").Value
'hier müsste die Schleife für jeden Eintrag ab A6 bis A? starten
Sheets("Daten").Select
Call Speed_on
'Macro das aktualisierungen etc, ausschaltet
'** Ermittlung der letzten Zeile in Spalte A
lz = Cells(Rows.Count, 1).End(xlUp).Rows.Row
'** Durchlauf aller Zeilen
For t = lz To 2 Step -1 'Zählung rückwärts bis Zeile 2
'Abfragen, ob in der ersten Spalte der Buchstabe "x" steht
If Cells(t, 4).Value  JCvariable Then
Rows(t).Delete Shift:=xlUp
End If
Next t
Call Speed_off
'Jetzt müssten die Pivots refreshed werden
'Jetzt Die Datei unter dem Namen der Variablen JCvariable speichern
'Nächster eintrag in "Namen" ab A6
End Sub

Die Frage ist wie man das für jeden Mitarbeiter macht denn nach dem ersten mal speichern hat man ja nur noch die Daten vom ersten Mitarbeiter?
Es wäre zumindest schon eine große Hilfe, wenn man die Zeilen schneller löschen könnte. Vielleicht geht das auch schneller wenn man mit Autofilter alle selektiert die nicht die Variable sind und dann die gefundenen einfach löscht? Ich weiß aber nicht wie das per Makro geht.
Vielen lieben Dank für Eure Hilfe und viele Grüße Lutz

11
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Zeilen schnell löschen
08.08.2017 11:39:08
Werner
Hallo Lutz,
sehe ich das richtig, du löschst Daten, die du nach dem Löschen eigentlich noch brauchst?
Warum benutzt du denn nicht den Autofilter. Datensatz nach dem Namen des entsprechenden Mitarbeiters filtern - Filterergebnis in ein neues Tabellenblatt kopieren - dieses Blatt unter dem Mitarbeiternamen speichern - nach dem Speichern Daten im neuen Tabellenblatt löschen - gleiches Spiel von vorne mit dem Namen des nächsten Mitarbeiter.
Gruß Werner
AW: Zeilen schnell löschen
08.08.2017 12:09:02
lutz
Hallo Werner,
vielen lieben Dank für Deine Antwort.
Das ist eine Datei mit downgeloadeten Werten und diversen Pivots die sich alle auf die Tabelle Daten beziehen - deswegen benötige ich die Daten in dieser Tabelle...
Ich habe jetzt etwas zum schnellen löschen gefunden:
Sub AKillen()
On Error GoTo Fehler
Dim TB
Dim SP%, ZE&, LR&
Dim t
Dim JCvariable As String
JCvariable = Worksheets("Namen").Range("A6").Value
t = Timer
Set TB = Sheets("Daten")
SP = 58 'Spalte BF
ZE = 3 'Werte ab Zeile 3
With TB
If .AutoFilterMode Then .AutoFilterMode = False ' Autofilter ausschalten
LR = .Cells(Rows.Count, SP).End(xlUp).Row 'letzte Zeile der Spalte
.Columns(SP).AutoFilter Field:=1, Criteria1:="" & JCvariable
.Rows(ZE & ":" & LR).Delete Shift:=xlUp
.AutoFilterMode = False
End With
'MsgBox Round(Timer - t, 1)
Err.Clear
Fehler:
If Err.Number  0 Then MsgBox "Fehler: " & Err.Number & vbLf & Err.Description: Err.Clear
End Sub
Das geht schon mal super. Was mir fehlt ist die Schleife über die Namen.
Die Frage wäre, ob man am Anfang des Makros die Ursprungsdatei geöffnet lässt und als erste Aktion unter dem Namen des MA in Zelle A6 speichert; dann die Daten löscht, aktualisiert, speichert, schliesst und wieder zur Ursprungsdatei wechselt und dann den nächsten Namen abarbeitet?
Das Problem mit den Gesamt-Daten habe ich immer - der Mitarbeiter soll ja nur seine eigenen Daten bekommen/sehen können.
Viele Grüße Lutz
Anzeige
AW: Zeilen schnell löschen
08.08.2017 13:02:32
mmat
Hallo Lutz,
>> Die Frage wäre, ob man am Anfang des Makros die Ursprungsdatei ... usw.
Also, ich würde die Ursprungsdatei stets unverändert lassen.
Du machst einfach eine neue Datei
Kopierst alle benötigten Arbeitsblätter dahin
Machst die individuellen Anpassungen
Speicherst die Datei unter dem individuellen Namen und schließt sie
Gesteuert wird das ganze mit einer Schleife über die Liste der Namen
JCvariable muss der Prozedur AKillen als Parameter übergeben werden, dann ist auch die Flexibel genug
Hilft das ?
AW: Zeilen schnell löschen
08.08.2017 13:34:21
lutz
Hallo MMat,
vielen Dank für Deine Antwort.
Vom Grundsatz her hilft mir das aber mein Problem ist dann immer die Umsetzung...
Und es ist ja auch immer ganz gut wenn man weiß was man warum macht damit man später auch Änderungen vornehmen kann.
Ich bin jetzt einen Schritt weiter:
Sub ASichern()
On Error GoTo Fehler
Dim TB
Dim SP%, ZE&, LR&
Dim t
Dim JCvariable As String
JCvariable = Worksheets("Namen").Range("A6").Value
t = Timer
Set TB = Sheets("Daten")
SP = 58 'Spalte BF
ZE = 3 'Werte ab Zeile 3
With TB
If .AutoFilterMode Then .AutoFilterMode = False ' Autofilter ausschalten
LR = .Cells(Rows.Count, SP).End(xlUp).Row 'letzte Zeile der Spalte
.Columns(SP).AutoFilter Field:=1, Criteria1:="" & JCvariable
.Rows(ZE & ":" & LR).Delete Shift:=xlUp
.AutoFilterMode = False
End With
'MsgBox Round(Timer - t, 1)
Err.Clear
Fehler:
If Err.Number  0 Then MsgBox "Fehler: " & Err.Number & vbLf & Err.Description: Err.Clear
Dim Neuer_Dateiname
Dim DateiName As String
DateiName = Left(ActiveWorkbook.FullName, Len(ActiveWorkbook.FullName) - 5)
Neuer_Dateiname = DateiName & JCvariable & ".xlsb"
If Neuer_Dateiname = False Then Exit Sub
ActiveWorkbook.SaveAs Filename:=Neuer_Dateiname
Workbooks.Open DateiName & ".xlsb"
End Sub
Das funktioniert: er löscht die Daten, speichert unter neuem Namen und öffnet die Ursprungsdatei wieder.
Was mir jetzt fehlt ist eine Schleife über die Namen - von Zelle A6 der Tabelle Namen bis zum letzten Namen in Spalte A.
Viele Grüße Lutz
Anzeige
AW: Zeilen schnell löschen
08.08.2017 13:49:56
mmat
ich hab hier mal auf die schnelle ein grobes Gerüst zusammengebaut. AKillen wiederhol ich jetzt net noch mal, "JCvariable" muß halt in den Prozedurkopf und die Zeile wo ein Wert aus A6 gelesen wird muß weg
Sub DateienErstellen()
Dim lr As Long, n As Long
lr = Cells(Rows.Count).End(xlUp).Row
For n = 6 To lr 'Schleife über Namen
BearbeiteFall (Cells(n, 1))
Next
End Sub
Sub BearbeiteFall(MaName As String)
Dim aw As Workbook
Set aw = ActiveWorkbook
Workbooks.Add
aw.Sheets("NameDesSheetsDassZuKopierenIst").Copy
'... ggf weitere sheets kopieren
Worksheets("NameDesScheetsMitDerTabelleDieZuFilternIst").Select
AKillen (MaName) 'Zeilen filtern
ActiveWorkbook.SaveAs MaName + ".xlsx"
ActiveWorkbook.Close False
End Sub
Sub akillen (JCvariable as string)

Anzeige
AW: Zeilen schnell löschen
08.08.2017 14:06:01
lutz
Hallo mmat,
vielen lieben Dank - eine Sache ist mir noch unklar - die einzelnen Namen bei Akillen:
Sub DateienErstellen()
Dim lr As Long, n As Long
Worksheets("Namen").Select   'den Blattnamen muß man ja mitteilen?
lr = Cells(Rows.Count).End(xlUp).Row
For n = 6 To lr 'Schleife über Namen
BearbeiteFall (Cells(n, 1))
Next
End Sub

Sub BearbeiteFall(MaName As String)
Dim DateiName As String 'Basisdatei in der alle Daten sind
Dim aw As Workbook
Set aw = ActiveWorkbook
Workbooks.Add
'Eigentlich muss ich keine Sheets kopieren?! Es ist ja eine Datei mit zig Tabellen und Pivots
' aw.Sheets("NameDesSheetsDassZuKopierenIst").Copy
'... ggf weitere sheets kopieren
' Worksheets("NameDesScheetsMitDerTabelleDieZuFilternIst").Select
akillen (MaName) 'Zeilen filtern
ActiveWorkbook.SaveAs MaName + ".xlsb"
ActiveWorkbook.Close False
Dim DateiName As String
Workbooks.Open DateiName & ".xlsb" ''Basisdatei in der alle Daten sind
End Sub

Sub akillen(JCvariable As String)
On Error GoTo Fehler
Dim TB
Dim SP%, ZE&, lr&
Dim t
Dim JCvariable As String
JCvariable = Worksheets("Namen").Range("A6").Value ' hier steht ja fest A6 das müsste ja  _
eine Schleife sein?
t = Timer
Set TB = Sheets("Daten")
SP = 58 'Spalte BF
ZE = 3 'Werte ab Zeile 3
With TB
If .AutoFilterMode Then .AutoFilterMode = False ' Autofilter ausschalten
lr = .Cells(Rows.Count, SP).End(xlUp).Row 'letzte Zeile der Spalte
.Columns(SP).AutoFilter Field:=1, Criteria1:="" & JCvariable
.Rows(ZE & ":" & lr).Delete Shift:=xlUp
.AutoFilterMode = False
End With
Err.Clear
Fehler:
If Err.Number  0 Then MsgBox "Fehler: " & Err.Number & vbLf & Err.Description: Err.Clear
End Sub

Wie bekomme ich die Schleife über die Namen in AKillen hin?
Vielen Dank und viele Grüße Lutz
Anzeige
AW: nächster schritt
08.08.2017 14:20:01
mmat
Die Schleife über die Namen ist ganz oben (Ja, den Namen des Blattes wo die Namen drinnestehen mußt du da eintragen)
Für jeden Namen wird die Prozedur BearbeiteFall aufgerufen
(Da ist ein Fehler, dass muß " lr = Cells(Rows.Count,1).End(xlUp).Row" heissen)
Bearbeite Fall legt eine neue Tabelle an, die dem Inhalt der alten entspricht. Wenn das zuviele Sheets sind, dann gibt's andere Möglichkeiten, die Datei zu duplizieren ohne das Original zu verändern.
In Akillen muß die die Zeilen

Dim JCvariable As String
JCvariable = Worksheets("Namen").Range("A6").Value ' hier steht ja fest A6 das müsste ja  _
eine Schleife sein?

löschen
"Dim t" und "t=timer" braucht du auch nicht
Anzeige
AW: nächster schritt
08.08.2017 15:06:03
lutz
Hallo mmat,
vielen Dank - leider habe ich das so nicht hinbekommen (keine Ahnung wo der Fehler lag).
Ich habe es mal so weitergemacht dass ich es verstehe:
Sub ASichern()
On Error GoTo Fehler
Dim TB
Dim SP%, ZE&, lr&
Dim t
Dim JCvariable As String
Dim lrs As Long
Dim n As Long
lrs = Worksheets("Namen").Cells(Rows.Count, 1).End(xlUp).Row
For n = 6 To lrs 'Schleife über Namen
JCvariable = Worksheets("Namen").Cells(n, 1).Value
Set TB = Sheets("Daten")
SP = 58 'Spalte BF
ZE = 3 'Werte ab Zeile 3
With TB
If .AutoFilterMode Then .AutoFilterMode = False ' Autofilter ausschalten
lr = .Cells(Rows.Count, SP).End(xlUp).Row 'letzte Zeile der Spalte
.Columns(SP).AutoFilter Field:=1, Criteria1:="" & JCvariable
.Rows(ZE & ":" & lr).Delete Shift:=xlUp
.AutoFilterMode = False
End With
Err.Clear
Fehler:
If Err.Number  0 Then MsgBox "Fehler: " & Err.Number & vbLf & Err.Description: Err.Clear
ActiveWorkbook.RefreshAll
Dim Neuer_Dateiname
Dim DateiName As String
DateiName = Left(ActiveWorkbook.FullName, Len(ActiveWorkbook.FullName) - 5)
Neuer_Dateiname = DateiName & JCvariable & ".xlsb"
If Neuer_Dateiname = False Then Exit Sub
ActiveWorkbook.SaveAs Filename:=Neuer_Dateiname
Workbooks.Open DateiName & ".xlsb"
Next n
End Sub

Das klappt auch super - er erzeugt eine Datei nach der anderen mit dem richtigen Namen:)
Leider lässt er die neu erstellten Namensdateien alle offen stehen und dann raucht Excel irgendwann wegen Speicherplatz ab.
Das heißt nach jeder Schleife müsste die alte Datei gelöschen werden (wohl die vorletzte wiel er aus der letzten ja das Makro aufruft das noch läuft?)
Weisst Du wie man das hinbekommt?
Vielen Dank für Deine Hilfe ohne die ich nie so weit gekommen wäre
Viele Grüße Lutz
Anzeige
AW: nächster schritt
08.08.2017 16:01:53
mmat
Ich hätte ja beinahe geschrieben, dass hinter
"ActiveWorkbook.SaveAs Filename:=Neuer_Dateiname"
einfach nur ein "ActiveWorkbook.close false" gehört, aber in welchem Workbook läuft eigentlich das Makro ?
Ich kann ja verstehen, dass du lieber deinen eigenen Weg gehen möchtest, aber ich muss dem nicht unbedingt folgen ...
AW: nächster schritt
09.08.2017 09:20:36
Lutz
Hallo mmat,
vielen Dank noch einmal für Deine Hilfe.
Es läuft jetzt und zwar so:
ub ASichern()
On Error GoTo Fehler
Dim TB
Dim SP%, ZE&, lr&
Dim t
Dim JCvariable As String
Dim JCvariableKill As String
Dim lrs As Long
Dim n As Long
Dim Prefix As String
Prefix = Worksheets("VAR").Range("B7").Value & "_"
Worksheets("Name").Range("E4:F2028").ClearContents
Worksheets("Name").Range("A4:C2028").Copy
Worksheets("Name").Range("E4").PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False
lrs = Worksheets("Name").Cells(Rows.Count, 5).End(xlUp).Row
For n = 4 To lrs 'Schleife über Namen
JCvariable = Worksheets("Name").Cells(n, 5).Value
JCvariableKill = Worksheets("Name").Cells(n, 7).Value
Set TB = Sheets("Daten")
SP = 58 'Spalte BF
ZE = 3 'Werte ab Zeile 3
With TB
If .AutoFilterMode Then .AutoFilterMode = False ' Autofilter ausschalten
lr = .Cells(Rows.Count, SP).End(xlUp).Row 'letzte Zeile der Spalte
.Columns(SP).AutoFilter Field:=1, Criteria1:="" & JCvariable
.Rows(ZE & ":" & lr).Delete Shift:=xlUp
.AutoFilterMode = False
End With
Err.Clear
Fehler:
If Err.Number 0 Then MsgBox "Fehler: " & Err.Number & vbLf & Err.Description: Err.Clear
ActiveWorkbook.RefreshAll
Dim Neuer_Dateiname
Dim DateiName As String
DateiName = Left(ActiveWorkbook.FullName, Len(ActiveWorkbook.FullName) - 5)
If n GROESSER 6 Then
Dim DateiNameKill As String
DateiNameKill = StrReverse(Split(StrReverse(DateiName), "\")(0)) & Prefix & JCvariableKill & ".xlsb"
Workbooks(DateiNameKill).Close savechanges:=False
End If
Neuer_Dateiname = DateiName & Prefix & JCvariable & ".xlsb"
If Neuer_Dateiname = False Then Exit Sub
ActiveWorkbook.SaveAs Filename:=Neuer_Dateiname
Workbooks.Open DateiName & ".xlsb"
Next n
End Sub
Ich muss immer den vorletzten schliessen aber erst ab dem 3ten Namen. Geht wunderbar, für 50 Namen unter 5 Minuten Laufzeit.
Es sieht so aus als wenn das Makro aus der Startdatei und aus der ersten Namensdatei läuft (wenn man die erste Namensdatei schliesst ist das Makro zu Ende).
Nochmals vielen Dank für Deine Hilfe.
Viele Grüße Lutz
Anzeige
AW: Zeilen schnell löschen
08.08.2017 13:03:37
lutz
Sorry - hatte vergessen das auf Offen zu stellen...
Hallo Werner,
vielen lieben Dank für Deine Antwort.
Das ist eine Datei mit downgeloadeten Werten und diversen Pivots die sich alle auf die Tabelle Daten beziehen - deswegen benötige ich die Daten in dieser Tabelle...
Ich habe jetzt etwas zum schnellen löschen gefunden:
Sub AKillen()
On Error GoTo Fehler
Dim TB
Dim SP%, ZE&, LR&
Dim t
Dim JCvariable As String
JCvariable = Worksheets("Namen").Range("A6").Value
t = Timer
Set TB = Sheets("Daten")
SP = 58 'Spalte BF
ZE = 3 'Werte ab Zeile 3
With TB
If .AutoFilterMode Then .AutoFilterMode = False ' Autofilter ausschalten
LR = .Cells(Rows.Count, SP).End(xlUp).Row 'letzte Zeile der Spalte
.Columns(SP).AutoFilter Field:=1, Criteria1:="" & JCvariable
.Rows(ZE & ":" & LR).Delete Shift:=xlUp
.AutoFilterMode = False
End With
'MsgBox Round(Timer - t, 1)
Err.Clear
Fehler:
If Err.Number  0 Then MsgBox "Fehler: " & Err.Number & vbLf & Err.Description: Err.Clear
End Sub

Das geht schon mal super. Was mir fehlt ist die Schleife über die Namen.
Die Frage wäre, ob man am Anfang des Makros die Ursprungsdatei geöffnet lässt und als erste Aktion unter dem Namen des MA in Zelle A6 speichert; dann die Daten löscht, aktualisiert, speichert, schliesst und wieder zur Ursprungsdatei wechselt und dann den nächsten Namen abarbeitet?
Das Problem mit den Gesamt-Daten habe ich immer - der Mitarbeiter soll ja nur seine eigenen Daten bekommen/sehen können.
Viele Grüße Lutz
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige