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

Zeilen nach Kriterien ausschneiden

Zeilen nach Kriterien ausschneiden
14.08.2006 09:03:35
otto
Hi,
ich suche nach einem schnellen Makro, mit dem ich aus ca. 3.000 Zeilen diejenigen in denen sich das Wort "Stahl" befindet (egal in welcher Spalte), ausschneiden und in einem anderen Tabellenblatt wieder einfügen kann.
Alternativ müsste das ganze auch spaltenbezogen funktionieren, also wenn Suchbegriff in einer bestimmten Spalte steht.
Danke in Voraus
otto

15
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Zeilen nach Kriterien ausschneiden
14.08.2006 10:47:14
Erich
Hallo Otto,
Du kannst FindDeleteRow aufrufen oder - wenn Du die Sekunden wissen willst - test.
Ist das schnell genug?
Option Explicit
Dim StatCal As XlCalculation, StatScr As Boolean, StatEvt As Boolean
Sub FindDeleteRow()
Dim rngQ As Range, rngF As Range, lngQ As Long, lngZ As Long, intC As Integer
Sheets("Tabelle1").Select
Set rngQ = Cells  '  Columns(2) ' wenn nur die 2. Spalte durchsucht werden soll
Beschleuniger "ein"
intC = rngQ.Cells(1).Column
lngZ = Sheets("Tabelle2").Cells(Rows.Count, intC).End(xlUp).Row
Set rngF = rngQ.Find(What:="Stahl", After:=Cells(Rows.Count, intC), LookIn:=xlValues, _
LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlPrevious, MatchCase:=False)
Do While Not rngF Is Nothing
With rngF.EntireRow
lngQ = .Row
lngZ = lngZ + 1
.Copy Sheets("Tabelle2").Cells(lngZ, 1)
.Delete
Set rngF = rngQ.Find(What:="Stahl", After:=Cells(lngQ, intC), _
SearchDirection:=xlPrevious)
End With
Loop
Beschleuniger ' "aus"
End Sub
'   Beschleuniger _______ Parameter: "ein" oder "normal" ______ Erich G./12.03.2006
' Im Modul vor den Prozeduren:
'   Dim StatCal As XlCalculation, StatScr As Boolean, StatEvt As Boolean
' Aufruf:
'   Beschleuniger "ein"
'   ....Code....
'   Beschleuniger
Sub Beschleuniger(Optional strEA As String)
If LCase(strEA) = "ein" Then
StatCal = Application.Calculation
StatScr = Application.ScreenUpdating
StatEvt = Application.EnableEvents
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
Application.EnableEvents = False
ElseIf LCase(strEA) = "normal" Then
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
Application.EnableEvents = True
Else
Application.Calculation = StatCal
Application.ScreenUpdating = StatScr
Application.EnableEvents = StatEvt
End If
End Sub
Sub test()
Dim sek As Double
sek = Timer
FindDeleteRow
MsgBox Format(Timer - sek, "0.0000")
End Sub
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
Anzeige
AW: Zeilen nach Kriterien ausschneiden
14.08.2006 11:02:20
fcs
Hallo Otto,
hier mein Vorschlag, mit den Hauptprozeduren gibts du den Suchbegriff, die Spalte und die Titelzeilen vor.
Dann wird die Subroutine aufgerufen.

Sub Stahl_suchen_Spalte3()
'Sucht im aktiven Blatt in Spalte3 nach dem Wort "Stahl" und kopiert Zeilen in ein neues Blatt
'Anzahl Titelzeilen = 1
Call SuchenBegriff("Stahl", 3, 1)
End Sub
Sub Stahl_suchen()
'Sucht im aktiven Blatt (Spalte = 0) nach dem Wort "Stahl" und kopiert Zeilen in ein neues Blatt
'Anzahl Titelzeilen = 1
Call SuchenBegriff("Stahl", 0, 1)
End Sub
Private Sub SuchenBegriff(Suchen As Variant, Spalte As Integer, Titelzeilen As Integer)
'Sucht im aktiven Blatt nach dem Suchbegriff und kopiert Zeilen in ein neues Blatt
'Bei Spalte = 0 wird im gesamten Blatt gesucht
Dim wksNeu As Worksheet, wksAkt As Worksheet, Zelle As Range
Dim Bereich As Range, Adresse1 As String, Zeile As Long
Suchen = "Stahl"
Set wksAkt = ActiveSheet
ZeileAkt = Titelzeilen + 1 'Zeile ab der im aktuellen Blatt die Suche beginnen soll
ZeileNeu = Titelzeilen + 1 'Zeile ab der im neuen Blatt Daten eingefügt werden sollen
With wksAkt
' Datenbereich im aktuellen Blatt
If Spalte = 0 Then 'Gesamtes Blatt
Set Bereich = .Range(.Cells(ZeileAkt, 1), .Cells(.UsedRange.Row + .UsedRange.Rows.Count - 1, _
.UsedRange.Column + .UsedRange.Columns.Count - 1))
Else 'nur in Spalte
Set Bereich = .Range(.Cells(ZeileAkt, Spalte), .Cells(.UsedRange.Row + .UsedRange.Rows.Count - 1, Spalte))
End If
Set Zelle = Bereich.Find(What:=Suchen, LookIn:=xlValues, Lookat:=xlPart, SearchOrder:=xlByRows)
If Zelle Is Nothing Then
MsgBox "Der Suchbegriff: "" & Suchen & "" wurde nicht gefunden"
Exit Sub
Else
ActiveWorkbook.Worksheets.Add After:=wksAkt
Set wksNeu = ActiveSheet
If Titelzeilen > 0 Then
'Titelzeilen werden kopiert
wksAkt.Range(wksAkt.Cells(1, 1), wksAkt.Cells(1, Titelzeilen)).EntireRow.Copy Destination:=wksNeu.Cells(1, 1)
wksNeu.Cells(Titelzeilen + 1, 1).Select
Application.ActiveWindow.FreezePanes = True
End If
Application.ScreenUpdating = False
Adresse1 = Zelle.Address
Zeile = Zelle.Row
Do
wksAkt.Rows(Zelle.Row).Copy Destination:=wksNeu.Cells(ZeileNeu, 1)
ZeileNeu = ZeileNeu + 1
' Falls Suchbegriff mehrfach in Zeile vorkommt, dann nicht kopieren
Do
Set Zelle = Bereich.FindNext(After:=Zelle)
Loop Until Zelle.Row <> Zeile Or Zelle.Address = Adresse1
Zeile = Zelle.Row
Loop Until Zelle.Address = Adresse1
End If
Application.CutCopyMode = False
Application.ScreenUpdating = False
End With
End Sub

gruss
Franz
Anzeige
AW: Zeilen nach Kriterien ausschneiden
14.08.2006 12:50:12
otto
Hi,
Danke, funktioniert super, nur die Zeilen sollen nicht kopiert sondern ausgeschnitten werden, und die entstehenden Leerzeilen müssen gelöscht werden.
otto
AW: Zeilen nach Kriterien ausschneiden
14.08.2006 13:45:33
fcs
Hallo Otto,
hier die angepasste Version, die ausschneidet und Leerzeilen entfernt
gruss
Franz

Sub Stahl_suchen_Spalte3()
'Sucht im aktiven Blatt in Spalte3 nach dem Wort "Stahl" und kopiert Zeilen in ein neues Blatt
'Anzahl Titelzeilen = 1
Call SuchenBegriff("Stahl", 3, 1)
End Sub
Sub Stahl_suchen()
'Sucht im aktiven Blatt (Spalte = 0) nach dem Wort "Stahl" und kopiert Zeilen in ein neues Blatt
'Anzahl Titelzeilen = 1
Call SuchenBegriff("Stahl", 0, 1)
End Sub
Private Sub SuchenBegriff(Suchen As Variant, Spalte As Integer, Titelzeilen As Integer)
'Sucht im aktiven Blatt nach dem Suchbegriff, kopiert Zeilen in ein neues Blatt und löscht Leerzeilen
'Bei Spalte = 0 wird im gesamten Blatt gesucht
Dim wksNeu As Worksheet, wksAkt As Worksheet, Zelle As Range
Dim Bereich As Range, Adresse1 As String, Zeile As Long
Set wksAkt = ActiveSheet
ZeileAkt = Titelzeilen + 1 'Zeile ab der im aktuellen Blatt die Suche beginnen soll
ZeileNeu = Titelzeilen + 1 'Zeile ab der im neuen Blatt Daten eingefügt werden sollen
With wksAkt
' Datenbereich im aktuellen Blatt
If Spalte = 0 Then 'Gesamtes Blatt
Set Bereich = .Range(.Cells(ZeileAkt, 1), .Cells(.UsedRange.Row + .UsedRange.Rows.Count - 1, _
.UsedRange.Column + .UsedRange.Columns.Count - 1))
Else 'nur in Spalte
Set Bereich = .Range(.Cells(ZeileAkt, Spalte), .Cells(.UsedRange.Row + .UsedRange.Rows.Count - 1, Spalte))
End If
Set Zelle = Bereich.Find(What:=Suchen, LookIn:=xlValues, Lookat:=xlPart, SearchOrder:=xlByRows)
If Zelle Is Nothing Then
MsgBox "Der Suchbegriff: """ & Suchen & """ wurde nicht gefunden"
Exit Sub
Else
ActiveWorkbook.Worksheets.Add After:=wksAkt
Set wksNeu = ActiveSheet
If Titelzeilen > 0 Then
'Titelzeilen werden kopiert
wksAkt.Range(wksAkt.Cells(1, 1), wksAkt.Cells(1, Titelzeilen)).EntireRow.Copy Destination:=wksNeu.Cells(1, 1)
wksNeu.Cells(Titelzeilen + 1, 1).Select
Application.ActiveWindow.FreezePanes = True
End If
Application.ScreenUpdating = False
Do
Zeile = Zelle.Row
wksAkt.Rows(Zeile).Cut Destination:=wksNeu.Cells(ZeileNeu, 1) 'Zeile ausschneiden und einfügen
wksAkt.Rows(Zeile).Delete shift:=xlUp 'Leere Zeile Löschen
ZeileNeu = ZeileNeu + 1
Set Zelle = Bereich.FindNext
Loop Until Zelle Is Nothing
End If
Application.CutCopyMode = False
Application.ScreenUpdating = False
End With
End Sub

Anzeige
AW: Zeilen nach Kriterien ausschneiden
15.08.2006 08:06:09
otto
Hi,
Code mit ausschneiden funktioniert leider nicht (Fehlermeldung und Leerzeilen werden nicht gelöscht.) Habe Datei mal hochgeladen.
https://www.herber.de/bbs/user/35802.xls
otto
AW: Zeilen nach Kriterien ausschneiden
15.08.2006 08:06:24
otto
Hi,
Code mit ausschneiden funktioniert leider nicht (Fehlermeldung und Leerzeilen werden nicht gelöscht.) Habe Datei mal hochgeladen.
https://www.herber.de/bbs/user/35802.xls
otto
AW: Zeilen nach Kriterien ausschneiden
15.08.2006 12:48:57
Erich
Hallo Otto,
warum verwendest Du nicht eine der fünf Routinen von Franz, Dir und mir, die ich in
https://www.herber.de/bbs/user/35790.xls
gestern 17:15:45 hochgeladen habe? Die löschen alle die gefundenen Zeilen und laufen fehlerlos durch.
Nebenbei: Was meinst du zu dem Zeitvergleich in der Mappe?
Die Fehlermeldung taucht bei Deinem neuen Code auf, wenn Find nichts mehr findet -
dann liefert Find Nothing anstelle eines Range-Objekts.
Das fragt man beim Loop ab:
Loop Until Zelle Is Nothing
Zelle.Address, Zelle.Row usw. sind schlicht nicht definiert, wenn Zelle = Nothing ist.
Noch eine Frage: Ist
"Falls Suchbegriff mehrfach in Zeile vorkommt, dann nicht kopieren" (Kommentar in Deinem Code)
eine neue Anforderung an die Prozedur?
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
Anzeige
AW: Zeilen nach Kriterien ausschneiden
15.08.2006 15:20:07
otto
Hallo Erich,
Code funktioniert super, trotzdem noch eine Frage.
Brauche eine Anpassung.
Mein Suchbegriff wird im Tabellenblatt "Stamm" gefunden. Dann wird die Zeile der Fundstelle ins Tabellenblatt "Übersicht" Zeile 3 kopiert, anschließend werden die dazugehörigen Daten aus dem Blatt "Bestand" ins Blatt "Übersicht" ab Zeile 10 eingefügt.
Nach der Bearbeitung müssen dann alle gefüllten Zeilen aus "Übersicht" wieder in den "Bestand" eingefügt werden.
Habs leider nicht geschafft den Code anzupassen:
Option Explicit
Dim StatCal As XlCalculation, StatScr As Boolean, StatEvt As Boolean
Public

Sub FindDeleteRow2()
Dim rngQ As Range, rngF As Range, lngQ As Long, lngZ As Long, intC As Integer
Rows(1).Copy Sheets("Übersicht_eg2").Cells(1, 1)
Set rngQ = Cells  '  Columns(2) ' wenn nur die 2. Spalte durchsucht werden soll
Beschleuniger "ein"
intC = rngQ.Cells(1).Column
lngZ = Sheets("Übersicht_eg2").Cells(Rows.Count, intC).End(xlUp).Row
If lngZ < 9 Then lngZ = 9
Set rngF = rngQ.Find(what:="Stahl", After:=Cells(1, 1), LookIn:=xlValues, _
lookat:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False)
Do While Not rngF Is Nothing
With rngF.EntireRow
lngQ = .Row - 1
lngZ = lngZ + 1
.Copy Sheets("Übersicht_eg2").Cells(lngZ, 1)
.Delete
Set rngF = rngQ.FindNext
End With
Loop
Beschleuniger ' "aus"
End Sub

Gruß otto
Anzeige
AW: Zeilen nach Kriterien ausschneiden
15.08.2006 18:15:02
Erich
Hallo Otto,
was meinst Du mit "Bearbeitung"? Ist das eine manuelle Bearbeitung?
Oder wird "Übersicht" durch irgend ein weiteres Makro bearbeitet?
Und wie sollen die Zeilen dann wieder in den Bestand "eingefügt" werden?
Soll jeder Satz dort eingefügt werden, wo er vorher stand?
Oder ist die Sortierung egal? (Dann könntest Du auch das schnellere Makro verwenden...)
Geht es jetzt nicht um ein zweites Makro zum Zurück-Kopieren der Sätze, wann auch immer?
Ist es überhaupt sinnvoll, die Sätze erst aus Bestand nach Übersicht zu schieben und dann wieder zurück?
Eine einfachere Alternative wäre, in "Bestand" eine Spalte "Bearb" einzufügen
und das Find-Makro dort ein Kennzeichen setzen zu lassen.
Dann kannst Du alle Sätze mit Bearb-Kennzeichen an den Anfang oder ans Ende sortieren
und direkt in "Bestand" bearbeiten.
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
Anzeige
AW: Zeilen nach Kriterien ausschneiden
16.08.2006 11:06:29
otto
Hallo,
die Sätze direkt im Bestand zu bearbeiten wäre eine Möglichkeit. Nach den gefundenen Datensätzen sollten aber 10 Leerzeilen sein, die nach Bearbeitung der Datensätze wieder gelöscht werden.
kannst du mir dafür vielleicht ein Code-Beispiel geben?
also: Datensätze suchen - ausschneiden und ab zeile 10 einfügen - 10 Leerzeilen anhängen
Code zum Leerzeilen löschen
Melde mich dann aber frühestens Ende August wieder - URLAUB!!
Gruß otto
AW: Geschlossen - wg. Urlaub (oT)
16.08.2006 19:06:18
Erich
AW: Zeilen nach Kriterien ausschneiden
15.08.2006 15:21:37
otto
Hallo Erich,
Code funktioniert super, trotzdem noch eine Frage.
Brauche eine Anpassung.
Mein Suchbegriff wird im Tabellenblatt "Stamm" gefunden. Dann wird die Zeile der Fundstelle ins Tabellenblatt "Übersicht" Zeile 3 kopiert, anschließend werden die dazugehörigen Daten aus dem Blatt "Bestand" ins Blatt "Übersicht" ab Zeile 10 eingefügt.
Nach der Bearbeitung müssen dann alle gefüllten Zeilen aus "Übersicht" wieder in den "Bestand" eingefügt werden.
Habs leider nicht geschafft den Code anzupassen:
Option Explicit
Dim StatCal As XlCalculation, StatScr As Boolean, StatEvt As Boolean
Public

Sub FindDeleteRow2()
Dim rngQ As Range, rngF As Range, lngQ As Long, lngZ As Long, intC As Integer
Rows(1).Copy Sheets("Übersicht_eg2").Cells(1, 1)
Set rngQ = Cells  '  Columns(2) ' wenn nur die 2. Spalte durchsucht werden soll
Beschleuniger "ein"
intC = rngQ.Cells(1).Column
lngZ = Sheets("Übersicht_eg2").Cells(Rows.Count, intC).End(xlUp).Row
If lngZ < 9 Then lngZ = 9
Set rngF = rngQ.Find(what:="Stahl", After:=Cells(1, 1), LookIn:=xlValues, _
lookat:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False)
Do While Not rngF Is Nothing
With rngF.EntireRow
lngQ = .Row - 1
lngZ = lngZ + 1
.Copy Sheets("Übersicht_eg2").Cells(lngZ, 1)
.Delete
Set rngF = rngQ.FindNext
End With
Loop
Beschleuniger ' "aus"
End Sub

Gruß otto
Anzeige
AW: Zeilen nach Kriterien ausschneiden
14.08.2006 12:32:35
otto
Hi, gehs nicht kürzer, z.Zt. mache ich es so:

Sub Schaltfläche50_BeiKlick()
Sheets("Stamm").Select
Dim Begriff
Begriff = ActiveCell.Value
Rows(ActiveCell.Row).Select
Selection.Copy
Sheets("Übersicht").Select
Rows("3:3").Select
ActiveSheet.Paste
Cells(10, 1).Select
Dim Zeile, az
Sheets("Bestand").Select
For Zeile = 2 To 3000
Cells(1, 1).Select
On Error GoTo Ende
Cells.Find(What:=Begriff).Activate
az = ActiveCell.Row
If ActiveCell = Begriff Then
Rows(az).Cut
Sheets("Übersicht").Select
ActiveSheet.Paste
Cells(ActiveCell.Row + 1, 1).Select
Sheets("Bestand").Select
Rows(az).Delete Shift:=xlUp
End If
Next Zeile
Application.CutCopyMode = False
Ende:
End Sub

Gruß otto
Anzeige
AW: Zeilen nach Kriterien ausschneiden
14.08.2006 14:31:30
fcs
Hallo Otto,
ich habe deinen Code einmal etwas bereinigt um die die vielen "Select"-Anweisungen. Die Ausführung sollte jetzt wesentlich schneller sein.
gruss
Franz

Private Sub CommandButton1_Click()
Dim Begriff, wksStamm As Worksheet, wksBestand As Worksheet, wksUeber As Worksheet
Dim ZeileUeber As Long, az As Long, Zelle As Range
Begriff = ActiveCell.Value
Set wksStamm = ThisWorkbook.Worksheets("Stamm")
Set wksBestand = ThisWorkbook.Worksheets("Bestand")
Set wksUeber = ThisWorkbook.Worksheets("Übersicht")
wksStamm.Rows(ActiveCell.Row).Copy Destination:=wksUeber.Rows("3:3")
ZeileUeber = 10 'Zeile ab der in der Übersicht die gefundenen Zeilen eingefügt werden sollen
Set Zelle = wksBestand.Cells.Find(what:=Begriff, LookIn:=xlValues, lookat:=xlPart)
If Zelle Is Nothing Then GoTo Ende 'Suchbegriff nicht gefunden
Application.ScreenUpdating = False
Do
az = Zelle.Row
wksBestand.Rows(az).Cut Destination:=wksUeber.Cells(ZeileUeber, 1)
ZeileUeber = ZeileUeber + 1
wksBestand.Rows(az).Delete Shift:=xlUp
Set Zelle = wksBestand.Cells.Find(what:=Begriff, LookIn:=xlValues, lookat:=xlPart)
Loop Until Zelle Is Nothing
Application.CutCopyMode = False
Application.ScreenUpdating = True
Ende:
End Sub

Anzeige
AW: Zeilen nach Kriterien ausschneiden
14.08.2006 17:15:45
Erich
Hallo Otto,
wenn du in der hier hochgeladenen Mappe das Makro "test" laufen lässt,
bekommst du die von den verschiedenen Prozeduren benötigte Zeit angezeigt.
Das schnellste Makro hat den Nachteil, dass Sätze mit dem Suchbegriff in umgekehrter Reihenfolge kopiert werden,
aber das ist ja vielleicht gleichgültig.
Hier die Mappe:
https://www.herber.de/bbs/user/35790.xls
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige