Anzeige
Archiv - Navigation
1492to1496
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 löschen und einfügen

Zeilen löschen und einfügen
30.05.2016 08:42:47
Philipp
Hi Zusammen,
Ich muss mich wieder an Euch wenden, da ich sowas von komplett auf dem Schlauch stehe.
Ich habe eine Tabelle mit zwei Blättern. Blatt 1 enthält Daten die teilweise nach Blatt 2 kopiert werden sollen. Blatt 2 ist folgendermaßen aufgebaut:
A | B | C | D
Suchbegriff1 | Referenz | Preis | Kommentar
Eintrag | Nummer | Euros | blah
Eintrag | Nummer | Euros | blah
Eintrag | Nummer | Euros | blah
Leerzeile
Suchbegriff2 | Referenz | Preis | Kommentar
Eintrag | Nummer | Euros | blah
Leerzeile
Suchbegriff3 | Referenz | Preis | Kommentar
Eintrag | Nummer | Euros | blah
Eintrag | Nummer | Euros | blah
Eintrag | Nummer | Euros | blah
usw.
Für das Kopieren selektiere ich den Suchbegriff und führe dann das Makro aus. Das Kopieren _ klappt zumindest für den ersten Suchbegriff. Nun habe ich mein Makro dahingehend erweitert, dass es erst prüft, wieviele Einträge überhaupt zu kopieren sind, anschließend den aktuellen Bereich auf Blatt 2 löscht, neue Zeilen einfügt und dann die Daten aus Blatt 1 wieder übernimmt. Mein Problem momentan ist, dass

Range(ActiveCell.Offset(1, 0), ActiveCell.Offset(1, 0).End(xlDown)).EntireRow.Delete
im tatsächlichen Makro mehr löscht als es soll; nämlich alle Daten und nicht nur den eigentlichen Bereich, der durch Leerzeilen vom nächsten Bereich getrennt ist. Führe ich diese Anweisung separat aus funktioniert sie einwandfrei. Hier das komplette Makro:

Sub Copy()
Dim a As Long, b As String, c As String, d As Long, i As Long, ix As Integer, Such As String,  _
Treffer As Long
c = ActiveCell
a = ActiveCell.Row + 1
b = ActiveCell.Offset(1, 0).Value
d = ActiveCell.Row + 1
With Application
.ScreenUpdating = False
StatusCalc = .Calculation  'Berechnungs-Status merken
.Calculation = xlCalculationManual
.EnableEvents = False
End With
'Zählen wieviele Einträge dem Suchkriterium entsprechen
Such = ActiveCell.Value
Treffer = 0
For i = 13 To 10000
With Worksheets("Blatt1")
If .Cells(i, "I") = c Then
Treffer = Treffer + 1
End If
End With
Next i
'Kopieren
If b = "" Then 'nur kopieren oder zusätzlich löschen/einfügen
For i = 13 To 10000 'Bereiche in Quelle (noch variabel gestalten auf tatsächlichen Bereich)
With Worksheets("Blatt1") ' Quelle
If .Cells(i, "I") = c Then 'Prüfen aus Suchbegriff
Worksheets("Blatt2").Cells(a, 1).Value = Worksheets("Blatt1").Cells(i, 1).Value
Worksheets("Blatt2").Cells(a, 2).Value = Worksheets("Blatt1").Cells(i, 2).Value
Worksheets("Blatt2").Cells(a, 3).Value = Worksheets("Blatt1").Cells(i, 3).Value
Worksheets("Blatt2").Cells(a, 4).Value = Worksheets("Blatt1").Cells(i, 12). _
Value
Worksheets("Blatt2").Cells(a, 5).Value = Worksheets("Blatt1").Cells(i, 10). _
Value
a = a + 1
Else
End If
End With
Next i
Else
Range(ActiveCell.Offset(1, 0), ActiveCell.Offset(1, 0).End(xlDown)).EntireRow.Delete ' _
vorhanden Bereich löschen
For ix = a To Treffer Step 1
ActiveSheet.Cells(ix, 1).EntireRow.Insert ' neue Zeilen einfügen
Next ix
For i = 13 To 10000 'Bereiche in Quelle
With Worksheets("Blatt1")
If .Cells(i, "I") = c Then
Worksheets("Blatt2").Cells(d, 1).Value = Worksheets("Blatt1").Cells(i, 1).Value
Worksheets("Blatt2").Cells(d, 2).Value = Worksheets("Blatt1").Cells(i, 2).Value
Worksheets("Blatt2").Cells(d, 3).Value = Worksheets("Blatt1").Cells(i, 3).Value
Worksheets("Blatt2").Cells(d, 4).Value = Worksheets("Blatt1").Cells(i, 12). _
Value
Worksheets("Blatt2").Cells(d, 5).Value = Worksheets("Blatt1").Cells(i, 10). _
Value
d = d + 1
Else
End If
End With
Next i
End If
With Application
.ScreenUpdating = True
.Calculation = StatusCalc
.EnableEvents = True
End With
End Sub

Das ist sicher verbesserungsfähig (z. B. statt des Aktivierens der einzelnen Suchbegriffe könnte ich versuchen alle Suchbegriffe aus Blatt 1 zu ermitteln und Blatt 2 dementsprechend automatisch strukturieren zu lassen oder ich könnte den Suchbereich dynamisch an den tatsächlichen Bereich anpassen). Aber mein Level ist noch nicht hoch genug ;)
Gruß und Danke im Voraus,
Philipp

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

Betreff
Datum
Anwender
Anzeige
AW: Zeilen löschen und einfügen
31.05.2016 23:01:36
Piet
Hallo Philipp,
ist das wirklich das Original Makro und ist das so korrekt gelaufen? Mein PC sagt Nein!
Diee Stelle ist bei mir unstimmig: - da ergibt sich bei mir keine Aenderung! (Excel 2003)
ActiveSheet.Cells(ix, 1).EntireRow.Insert ' neue Zeilen einfügen
Bei der Insert Zeile fehlt die Anweisung wohin geschoben werde3n soll, nach unten oder seitlich?
Bei mir tut sich da nichts! Im Makro selbst gibt es noch einige Ungereimtheiten, 1 Variable fehlt.
Mit Option Explicit an oberster Stelle im Modul erkennt man: - StatusCalc fehlt, ist nicht definiert.
Die "Such" Variable bleibt ungenutzt, verglichen wird die Spalte "I" mit Variable -c-
Geprüft wird für die 1. For Next Schleife ob "b" leer ist. Was ist mit der/den naechsten Zeile/n?
Beim Löschen, dem eigentlichen Problem, überspringt ActiveCell.Offset(1, 0).End(xlDown) die Leerzeile.
Somit muss falsch gelöscht werden! Und gleich die naechste Ungereimtheit?
Range(ActiveCell.Offset(1, 0), ActiveCell.Offset(1, 0).End(xlDown)).EntireRow.Delete
löscht doch im Blatt1 die Zeilen nach unten! Das sind aber doch die Zeilen die ins Blatt2 kopiert werden sollen.
Oder bezieht sich diese AktivZell auf Blatt2? Ist das Blatt2 aktiviert? Das ist aus dem Makro nicht ersichtlich.
Man sieht nur AktivCell, aber nicht welches Blatt gerade aktiv ist?
So wie es jetzt im Einsatz ist muss das Makro ja jedesmal auf eine AktiveZelle gesetzt werden.
Das dürfte bei 13000 Zeilen unsinnig sein. Ich glaube das ganze Makro sollte überarbeitet werden.
Dazu müsste ich aber wissen was es mit Spalte "I" auf sich hat, und was ist mit den alten Werten?
Die werden ja unweigerlich überschrieben. Ist das so gewünscht?
Bevor man das Makro bereinigen kann sollten wir etwas mehr über die Funktion wissen.
Oder eine kleine Beispieldatei mit Fantasie Daten zum ansehen wie die Lösung sein soll.
Zu der Trefferzahl noch eine Frage. Kommt der Suchbegriff nur einmal vor, oder wiederholt
der Suchbegriff nach 100-200 Zeilen tiefer noch einmal? Dann würde Treffer nicht stimmen,
weil andere Suchbegriffe dazwischen liegen.
mfg Piet

Anzeige
AW: Zeilen löschen und einfügen
01.06.2016 10:47:31
Philipp
Hi Piet,
Danke für die Analyse. Der Code ist nicht optimal, das ist mir durchaus bewusst :/ Es ist eher wie Frankensteins Monster: Zusammengeschustert aber funktional ^^ Zu den Anmerkungen:
ActiveSheet.Cells(ix, 1).EntireRow.Insert ' neue Zeilen einfügen 
Fügt unterhalb der aktviven Zelle soviele neue Zeilen ein, wie in "Treffer" gespeichert sind. Wenn man den Code bis zu

Range(ActiveCell.Offset(1, 0), ActiveCell.Offset(1, 0).End(xlDown)).EntireRow.Delete
ausführt, den Bereich unterhalb der aktiven Zelle einfärbt und das Makro dann in Einzelschritten weiter ausführt, kann man sehen wie die neuen Zellen eingefügt werden.
Die "Such" Variable bleibt ungenutzt, verglichen wird die Spalte "I" mit Variable -c-
"Such" wird anfangs definiert

Such = ActiveCell.Value
Damit zähle ich auf Blatt1 in Spalte "I" das Vorkommen des Begriffs in der aktiven Zelle. Beim Einfügen hätte ich mir den Vergleich mit "c" wahrscheinlich schenken können.
Geprüft wird für die 1. For Next Schleife ob "b" leer ist. Was ist mit der/den naechsten Zeile/n?
Die nächsten Zellen sind egal. Ich setzte Blatt2 vor dem ersten Lauf fertig auf. D.h. Ich formatiere die Überschrift des Moduls und führ das Makro aus. Dann die nächste Überschrift und wieder das Makro. Letztendlich wird das Makro im Betrieb dann keine Leerzeilen mehr sehen und direkt mit dem Löschen anfangen.
Range(ActiveCell.Offset(1, 0), ActiveCell.Offset(1, 0).End(xlDown)).EntireRow.Delete löscht doch im Blatt1 die Zeilen nach unten! Das sind aber doch die Zeilen die ins Blatt2 kopiert werden sollen.
Ich arbeite lediglich aus Blatt2 heraus. Blatt1 bleibt unberührt. Wenn ich anstelle von ".EntireRow.Delete" ".Select" nehmen, dann wird ganz brav der Bereich unterhalb der Aktiven Zelle bis zur nächsten Leerzeile ausgewählt. Nur beim Löschen geht dann irgendwas schief.
So wie es jetzt im Einsatz ist muss das Makro ja jedesmal auf eine AktiveZelle gesetzt werden
Korrekt. Ich gehe zu den jeweiligen Überschriften und aktiviere den Modulnamen. Wie gesagt ist das nicht optimal. Besser wäre einersetis ein tatsächliches Copy&Paste, da ich dabei das Zellenformat (Füllung) übernehmen könnte. Momentan kopiere ich das "x" aus "recommended" mit und färbe über bedingte Formatierung. Andererseits wäre es cool, wenn das Makro selbstständig nach den Modulnamen suchen und Blatt2 entsprechend aufbauen würde ...
Dann würde Treffer nicht stimmen, weil andere Suchbegriffe dazwischen liegen
"Treffer" liefert schon die korrekte Anzahl, trotz anderen Suchbegriffen.
Leider ist meine Beispieldatei 29kb zu groß :/ und geteilte Archive sind nicht zulässig. Heute Abend kann ich per Dropbox was bereitstellen.

Anzeige
AW: Zeilen löschen und einfügen
01.06.2016 15:02:17
Piet
Hllo Philipp
wenn die Datei zu gross ist könntest du sie als ZIP verpacken, dann wird sie kleiner.
Es gingen auch 2 Beispieldateien, wenn du ein Tabellenblatt in eine zweite Datei kopierst.
Das hier zusammen setzen ist kein Problem. - Hast du vorher den UserRange reduziert?
Wenn man nur Daten löscht merkt sich Excel trotzdem den ursprünglichen UsedRange.
Den kannst du reduzieren durch Löschen der Zeilen und Spalten bis Blattende mit Zeile/Spalte löschen.
Das reduziert den UsedRange auf den kleinst möglichen Wert. Vielleicht kommst du so unter 330kb.
mfgf Piet

Anzeige
AW: Zeilen löschen und einfügen
01.06.2016 20:39:42
Piet
Hallo Philipp,
es gibt eine Beispieldatei von mir. Ich denke du wirst überrascht sein.
Es gibt ingesamt drei Makros, eine korrigierte Originalversion von dir,
eine verbesserte Originalversion, und eine neue Makrolösung von mir.
Die Fehler habe ich in der Original Version extra erlaeutert.
Die neue Lösung bearbeitet direkt das ganze Blatt, kopiert alle "PT, W, WA"
Das ganze funktioniert über eine Do Loop Schleife. Würde mich interessieren
wie lange das Programm für ein ganzes Blatt braucht. Kann ich nicht sagen.
Die Grundidee zum kopieren war schon gut durchdacht. Bei jedem Programm schleichen
sich immer wieder Denkfehler ein, dann funktioniert es nicht richtig. Passiert mir auch.
Der Fehler das beim Zeilen Einfügen Fettdruck und Mittig Format kopiert wurde ist beseitigt.
Vorsichtshalber aber bitte zuerst einmal deine Daten von 13000 in der Beispieldatei testen
ob ich keinen Fehler gemacht habe. Ich bin auch nur ein Mensch. Im Beispiel können keine
Originaldaten zerstört werden.
Würde mich sehr freuen wenn das neue Programm jetzt zufriedenstellend laeuft.
mfg Piet
https://www.herber.de/bbs/user/105915.xls
Anzeige

300 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige