Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
900to904
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
900to904
900to904
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Makro zum Zeilenlöschen

Makro zum Zeilenlöschen
27.08.2007 15:01:21
Nils
Moin Moin,
ich habe erneut ein Problem ein Makro zu bauen. Ich wäre über schnelle HIlfe sehr dankbar!
Und zwar habe ich wieder eine Excelliste mit Daten. Die Daten sollen erst in eine neue Arbeitsmappe kopiert werden. Danach soll in dieser Liste soll eine Spalte (D) über prüft werden ob eine bestimmte Zahl (106) enthalten ist. Wenn dies der Fall ist soll die gesamte Zeile bestehen bleiben. Ist dieses jedoch nciht der Fall soll die gesamte Zeile gelöscht werden. Wenn dies abgeschlossen ist soll diese neue Arbeitsmappe unter einem neuen Namen gespeichert werden.
Eure HIlfe wäre SUper!
Danke im Vorraus,
Mit freundlichen Grüßen
Nils Louwien

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

Betreff
Datum
Anwender
Anzeige
AW: Makro zum Zeilenlöschen - Frage
27.08.2007 15:25:00
fcs
Hallo Nils,
welche Daten sollen denn in die neue Arbeitsmappe kopiert werden?
Das komplette aktive Tabellenblatt?
Der Zellbereich eines Tabellenblatt? Wenn Ja welcher?
Die komplette Arbeitsmappe?
Nach Klärung dieser Frage kann man an die Lösung des Gesamtproblems gehen.
Gruß
Franz

AW: Makro zum Zeilenlöschen - Frage
27.08.2007 15:54:00
Nils
Moin Franz,
das aktuelle Tabellenblatt soll Kopiert erden. Ich bin gespannt!
Lieben Dank!

AW: Makro zum Zeilenlöschen - Frage
27.08.2007 16:26:17
fcs
Hallo Nils,
mit dem aktuellen Tabellenblatt hast du zum Glück die einfachste Variante erwischt.
Gruß
Franz

Sub aTest()
Dim wks As Worksheet, wb As Workbook, spalte As Integer, wert, Zeile As Long
spalte = 4 ' zu prüfende Spalte
wert = 106 'prüfwert
'Aktives Blatt Kopieren
ActiveSheet.Copy
Set wb = ActiveWorkbook
Set wks = wb.Worksheets(1)
With wks
'Daten ab letzter Zeile rückwärts prüfen und ggf. Zeile löschen
For Zeile = .Cells.SpecialCells(xlCellTypeLastCell).Row To 1 Step -1
If .Cells(Zeile, spalte).Value  wert Then
.Rows(Zeile).Delete Shift:=xlShiftUp
End If
Next
End With
'Speichern unter Dialog anzeigen
Application.Dialogs(xlDialogSaveAs).Show "TestDatei.xls"
End Sub


Anzeige
AW: Makro zum Zeilenlöschen - Frage
27.08.2007 16:35:00
Nils
Hey Franz,
im Ansatz hat es shcon funktioniert, aber er lässt zum Beispiel Zeilen drin mit 706, 707, 806, 906, 1006, 1106 und 1206. Hat das nen Grund?
Bin jetzt erst mal im Feierabend, abe rgucke nachher nochmal von zuhause nach deiner Antwort, vielen Dank shcon mal für deine Mühe!!!

AW: Makro zum Zeilenlöschen - Frage
27.08.2007 16:49:00
fcs
Hallo Nils,
ich hab keine Erklärung, warum Zeilen mit den angegebenen Einträgen nicht gelöscht werden.
Einzige Idee: In der Tabelle werden verbundene Zellen verwendet oder andere Formate die einen Eintrag in dieser Spalte vorgaukeln.
Kannst du mal eine Tabelle mit ein paar Beispieldaten zwecks Ursachenforschung hochladen? ggf. vorher sensible Daten in Tabelle löschen. Eigentlich bräuchte ich nur die Tabelle mit Daten in Spalte D.
Gruß
Franz

Anzeige
AW: Makro zum Zeilenlöschen - Frage
27.08.2007 20:02:00
Nils
Moin Moin,
vielen Dank nochmals für die Mühe, hier ist der Pfad zur Datei:
https://www.herber.de/bbs/user/45449.xls
Die Daten kommen aus einer Query abfrage aus einer Datenbank.
Mfg
Nils

AW: Makro zum Zeilenlöschen - Frage
27.08.2007 23:41:02
fcs
Hallo Nils,
das Makro funktioniert mit der Datei einwandfrei, außer dass es wegen der großen Zeilenzahl sehr lange benötigt. Die von dir beschriebenen Fehler konnte ich nicht feststellen.
Ich hab das Makro geringfügig angepasst, so dass die Bildschirmaktualisierung während der Makro-Aktionen deaktiviert ist und Makro schneller läuft. Zusätzlich wird in der Statuszeile der Fortschritt der Bearbeitung angezeigt.
Ich hab auch eine Variante gebastelt, die die Tabelle zunächst sortiert (Sortierung ist nicht notwendig, wenn die Daten immer nach dem Feld "f54s_bumo" sortiert von der Queryabfrage geliefert werden!).
Danach werden die 1. und letzte Zeile mit Eintrag "106" ermittelt und zum Schluss die zu löschenden Zeilen blockweise gelöscht. So dauert die ganze Makroausführung höchstens 1 bis 2 Sekunden.
Als kleines Goody wird zum Schluß das als Dezimalzahl geschriebene Datum in Spalte 3 in das Excelinterne Datumsformat umgewandelt. Diese Funktion kannst du ja wieder löschen, wenn du sie nicht brauchst.
Gruß
Franz

Sub aTest()
Dim wks As Worksheet, wb As Workbook, spalte As Integer, wert As Variant, Zeile As Long
Dim Zaehler As Long, Zeilen As Long
spalte = 4 ' zu prüfende Spalte
wert = 106 'prüfwert
'Aktives Blatt Kopieren
ActiveSheet.Copy
Set wb = ActiveWorkbook
Set wks = wb.Worksheets(1)
Application.ScreenUpdating = False
Zaehler = 1
With wks
'Daten ab letzter Zeile rückwärts prüfen und ggf. Zeile löschen
Zeilen = .Cells.SpecialCells(xlCellTypeLastCell).Row
For Zeile = Zeilen To 2 Step -1
Application.StatusBar = "Bearbeite Zeile " & Zaehler & " von " & Zeilen
If .Cells(Zeile, spalte).Value  wert Then
.Rows(Zeile).Delete Shift:=xlShiftUp
End If
Zaehler = Zaehler + 1
Next
End With
Application.StatusBar = False
Application.ScreenUpdating = True
'Speichern unter Dialog anzeigen
Application.Dialogs(xlDialogSaveAs).Show "TestDatei.xls"
End Sub
'Variante
Sub bTest()
Dim wks As Worksheet, wb As Workbook, spalte As Integer, wert As Variant, Zeile As Long
Dim Zeilen As Long, Zelle1 As Range, Zelle2 As Range
spalte = 4 ' zu prüfende Spalte
wert = 106 'prüfwert
'Aktives Blatt Kopieren
ActiveSheet.Copy
Set wb = ActiveWorkbook
Set wks = wb.Worksheets(1)
Application.ScreenUpdating = False
Zaehler = 1
With wks
'letzte Zeile mit Daten
Zeilen = .Cells.SpecialCells(xlCellTypeLastCell).Row
'Daten nach Spalte D sortieren
.Range(.Cells(1, 1), .Cells(Zeilen, 5)).Sort Key1:=.Cells(1, spalte), _
order1:=xlAscending, header:=xlYes
'1. Zeile mit Wert suchen
Set Zelle1 = .Columns(spalte).Find(What:=wert, after:=.Cells(1, spalte), _
LookIn:=xlValues, Lookat:=xlWhole, Searchdirection:=xlNext)
'Letzte Zeile mit Wert suchen
Set Zelle2 = .Columns(spalte).Find(What:=wert, after:=.Cells(Zeilen + 1, spalte), _
LookIn:=xlValues, Lookat:=xlWhole, Searchdirection:=xlPrevious)
'Daten prüfen und ggf. Zeilen löschen
If Zelle1 Is Nothing Then
MsgBox "Wert " & wert & " wurde in Tabelle nicht gefunden!"
Else
Select Case Zelle1.Row
Case 2
If Zelle2.Row 


Anzeige
AW: Makro zum Zeilenlöschen - Frage
28.08.2007 09:25:00
Nils
Da mein Standartrechner nicht mitkahm hat die Firma einen neuen Hochleistungsrechner spendiert, das gesamte Marko dauert bei mir knapp 2 sekunden.
Und es funktioniert suuper!
Vielen Tausend Dank!
Vor allem das Goodie ist genial!
Gracias!

AW: Makro zum Zeilenlöschen - Frage
28.08.2007 10:00:00
Nils
Hey, jetzt habe ich doch noch mal eine Frage......
Und zwar dachte ich jetzt das ich in diesem Makro die Zahl einfach ändern kann die überprüft werden soll, so dass ich unterscheidliche Makros habe die die Originalliste nach unterschiedlichen Zahlen in der selben Spalte filtert. ALso Makro a filtert nach 106, dann kopiere ich das Makro und ändere die zahl in 206 und dann filtert das Makro B nach 206. Allerdings kommt dann eine Debugmeldung für folgende Zeile:
.Range(.Rows(2) + 1, .Rows(Zeilen)).Delete
Könntest du mir eventuell nochmals helfen?
Ganz lieben Gruß
Nils

Anzeige
AW: Makro zum Zeilenlöschen - Frage
28.08.2007 20:14:22
fcs
Hallo Nils,
da hatte ich leider nicht alle Varianten getestet, do dass der Fehler durchgerutscht ist.
Die Zeile muss lauten:

.Range(.Rows(Zelle2.Row + 1), .Rows(Zeilen)).Delete


Du muss du nicht unbedingt für jeden Wert ein eigenes Makro anlegen, um die Datei nach _ verschiedenen Werten zu filtern. Wenn du die Zeile


wert = 106 'prüfwert
durch
wert = InputBox("Prüfwert?", "Eingabe Prüfwert") 'prüfwert
If wert = "" Then Exit Sub 'Abbrechen wurde gewählt
wert = Val(wert) 'Text der Eingabebox in Zahl umwandeln.

ersetzt, dann kannst du den Prüfwert nach dem Start des Makros in dem Eingabedialog eingeben.
Gruß
Franz

Anzeige
AW: Makro zum Zeilenlöschen
27.08.2007 15:34:44
DirkP
Hallo Nils,
lege folgenden Code auf einen beliebigen Button in Deiner Makro-Umgebung (Alt+F11, Einfügen Userform, Einfügen Button).

Private Sub CommandButton1_Click()
Dim WbQuelle As Workbook
Dim WbNeu As Workbook
Dim LetzteZeile As Integer
Dim i As Integer
Dim Sh As Worksheet
Set WbQuelle = ThisWorkbook
Set WbNeu = Workbooks.Add
WbQuelle.Sheets("tabelle1").Activate
'Range anpassen für Deine Tabelle!!!
WbQuelle.Sheets("tabelle1").Range("a1:f40").Select
Selection.Copy
WbNeu.Sheets("tabelle1").Activate
ActiveSheet.Paste
LetzteZeile = 40 'oder halt irgendetwas dynamisches, je nachdem wieviel Zeilen
Set Sh = WbNeu.Sheets("Tabelle1")
For i = LetzteZeile To 1 Step -1
If Sh.Cells(i, 4) = 106 Then   '4 ist Spalte D
Sh.Rows(i).Delete
End If
Next
WbNeu.SaveAs ("c:\myfiles\neu.xls")
WbNeu.Close
End Sub


Hoffe es hilft!

Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige