Wenn Daten übereinstimmen, dann in ein neues Excelblatt übernehmen

Hallo,

vielleicht kann mir jemand noch einmal bei folgendem Problem in Excel helfen.
Ich habe eine Excel Tabelle (hier  vereinfacht dargestellt)
Spalte A SpalteB Spalte C Geb.Spalte D mit Text
5             Müller   11.11.70        Wegfall zum 1.10.14
usw.

Jetzt möchte ich, wenn in Spalte D Wegfall (das zum ist ständig ein anderers Datum) reingeschrieben wird, Excel mir die gesamte Zeile in ein neues Tabellenblatt rüberkopiert. Ganz perfekt wäre es, wenn dann diese rüberkopierten Daten in der Ursprungsdatei gleich gelöscht werden. Aber ich glaube, das wäre zu viel verlangt. Wichtig ist dieses rüberkopieren in ein anderes Tabellenblatt, welchs ich dann einfach Wegfällebenannt habe. Geht das wirklich nur mit einer Matrixformel?

Ich bin gespannt und danke schon mal sehr!
tausenschön

Hallo tausendschön,

also, ob das über Formeln oder Matrixformeln geht, wage ich zu bezweifeln (Experten vor). Wenn’s aber eine VBA-Lösung sein darf: Kopiere den Code in den Codebereich der Tabelle, in der du die Eingaben („Wegfall …“) machst:

Private Sub Worksheet\_Change(ByVal Target As Range)
 If Target.Column 4 Then Exit Sub
 If Left(LCase(Target.Value), 11) = "wegfall zum" Then
 With Worksheets("Wegfälle")
 .Rows(.Cells(.Rows.Count, 1).End(xlUp).Row + 1).Value = Rows(Target.Row).Value
 End With
 Application.EnableEvents = False
 Rows(Target.Row).Delete xlUp
 Application.EnableEvents = True
 End If
End Sub

Gruß, Andreas

Hallo Andreas,
ich bin fasziniert, aber verstehe leider nur Bahnhof. Das ist doch ein Makro. ich würde es schon mal gern testen, aber ich weiß überhaupt nicht, wo ich es hinkopieren soll. In das Tabellenblatt Wegfall, aber wohin? Leider keine Ahnung.
Gruß tausenschön

Sorry tausendschön,

da hatte ich wohl ein bisschen zu viel vorausgesetzt.
Ja, das ist ein Makro, und zwar ein sog. Ereigniss-Makro. Es wird immer dann automatsich aufgerufen, wenn sich in einer Zelle etwas ändert.
Öffne mal den VBA-Editor. Das geht z.B., indem du einen Rechtsklick auf den Blattreiter machst, und zwar auf den Reiter des Blattes, in das du deine Eingaben machst (NICHT das Blatt „Wegfälle“!). Aus dem Menü wählst du jetzt „Code anezigen“. Dann öffnet sich der VBA-Editor. In das große Fenster rechts (das ist der Codebereich für das angeklickte Tabelleblatt) fügst du meinen Code ein. Jetzt kannst du den VBA-Editor wieder zu machen.
Immer wenn du jetzt in Spalte D in eine Zelle einen Text eingibst, der mit „Wegfall zum“ beginnt, wird die gesamte Zeile in die nächste freie Zeile im Blatt „Wegfälle“ kopiert. „Freie Zeile“ heißt hier die Zeile unter der letzten, in der in Spalte A noch etwas steht.
Anschließend wird in deinem Engabeblatt die aktuelle Zeile gelöscht und alle Zeilen darunter, werden nach oben geschoben.

Melde dich, wenn du genauere Erläuterungen zu dein einzelnen Codezeilen möchtest. Du sollst ja hier eigentlich nicht nur eine Problemlösung bekommen, sondern eher Hilfe zur zukünftigen Selbsthilfe.

Gruß, Andreas

Hallo Andreas,
ja, es ist so, du hast zu viel vorausgesetzt.
Aber deine Erläuterungen sind ganz super und ich werde es auch morgen mal testen und dir nat. berichten. Danke nochmal und bis morgen
Gruß tausendschön

Hallo Andreas,
also, ich habe deine Idee mit dem Mako mal mit meiner kleinen Beispiel-Datei getestet. Es hat auf Anhieb funktioniert. Genau so wollte ich es haben Super genial und danke, danke, danke! Allerdings habe ich das Makro erst einmal gar nicht verstanden, dann habe ich versucht es zu verstehen. Denn fest stand ja, dass ich es für meine richtige Datei benötige und es nat. anpassen muss. Unter Verstehen stelle ich mir etwas anderes vor, aber ich habe es angepasst und getestet. Auch das hat gleich beim 1. Mal geklappt.
Habe ich es so einigermaßen richtig übersetzt?
Schaue dir das Arbeitsblatt an, ändere den Bereich, wenn in der Spalte 4 (was ja die Spalte in meinem Bsp. D war) Wegfall zum ist. Dann alle Werte die links (in der Spalte) stehen, dann in das Arbeitsblatt Wegfälle geben. Dann die ganze Zeile in dem Arbeitsblatt (Ursprungsarbeitsblatt) in der Anwendung löschen (also aktivieren, wenn es wahr ist).
Köntnest du es mir mal noch fachmännisch richtig erläutern?
Ich danke dir sehr für deine Hilfe!
Gruß tausenschön

Hallo Andreas,
also, ich habe deine Idee mit dem Mako mal mit meiner kleinen Beispiel-Datei getestet. Es hat auf Anhieb funktioniert. Genau so wollte ich es haben Super genial und danke, danke, danke! Allerdings habe ich das Makro erst einmal gar nicht verstanden, dann habe ich versucht es zu verstehen. Denn fest stand ja, dass ich es für meine richtige Datei benötige und es nat. anpassen muss. Unter Verstehen stelle ich mir etwas anderes vor, aber ich habe es angepasst und getestet. Auch das hat gleich beim 1. Mal geklappt.
Habe ich es so einigermaßen richtig übersetzt?
Schaue dir das Arbeitsblatt an, ändere den Bereich, wenn in der Spalte 4 (was ja die Spalte in meinem Bsp. D war) Wegfall zum ist. Dann alle Werte die links (in der Spalte) stehen, dann in das Arbeitsblatt Wegfälle geben. Dann die ganze Zeile in dem Arbeitsblatt (Ursprungsarbeitsblatt) in der Anwendung löschen (also aktivieren, wenn es wahr ist).
Köntnest du es mir mal noch fachmännisch richtig erläutern?
Ich danke dir sehr für deine Hilfe!
Gruß tausendschön

Hilfe zur Selbsthilfe
Hi tausendschön,

deine Ideen waren doch schon recht richtig.
Ich habe dir hier den Makro nochmal mit ausführlichen Kommentaren gespickt. Ich denke, damit fällt das Verstehen leichter.

Gruß, Andreas

Private Sub Worksheet\_Change(ByVal Target As Range)
' Der Name Worksheet\_Change wird von VBA vergeben. Es ist die Ereignis-Routine,
' die immer dann automatisch aufgerufen wird, wenn sich auf dem Tabellenblatt,
' in dessen Codebereich sie steht, etwas an den Zellinhalten ändert.
' Die Variable Target stellt den Zellenbereich dar, in dem sich etwas geändert hat.

 If Target.Column 4 Then Exit Sub
 ' Wenn die Spalte in der Target steht ungleich 4 ist (also ungleich Spalte D ist),
 ' wird die Routine gleich wieder beendet.

 If Left(LCase(Target.Value), 11) = "wegfall zum" Then
 ' Target steht also jetzt in Spalte D.
 ' Es wird getestet, welchen Inhalt die geäderte Zelle hat:
 ' Target.Value ist der gesamte Inhalt
 ' Lcase macht aus allen Großbuchstaben Kleinbuchstaben.
 ' Eine Vorsichtgsmaßnahme, falls dir beim Tippen sowas wie "WEgfall" passiert
 ' Left(..., 11) holt sich nur die linken 11 Zeichen des gesamten (durch LCase
 ' kleingeschriebenen) Inhalts.

 With Worksheets("Wegfälle")
 ' Wenn zwischen den Zeilen With und End With ein Objektbezeichner mit einem Punkt
 ' begonnen wird, bezieht sich dieses Objekt auf dasjenige in der With-Zeile.
 ' Das kann viel Schreibarbeit sparen, wenn man sich auf Unter-Unter...Objekte bezieht

 .Rows(.Cells(.Rows.Count, 1).End(xlUp).Row + 1).Value = Rows(Target.Row).Value
 ' Jetzt werden die Daten kopiert.
 ' Rechts vom Gleichheitszeichen steht, wo sie herkommen:
 ' Target.Row ist die Zeilennummer der gänderten Zelle.
 ' Rows(Target.Row) ist also die gesamte Zeile.
 ' Rows(Target.Row).Value sind die Inhalte der Zellen in der Zeile
 ' Links vom Gleichheitszeichen steht, wo die Daten hin sollen.
 ' Da der Datenursprung eine ganze Zeile ist, muss das Ziel auch eine
 ' ganze Zeile sein.
 ' Es soll die erste freie Zeile von oben benutzt werden.
 ' .Rows bezieht sich nun auf eine Zeile im Blatt "Wegfälle" (siehe With-Anweisung).
 ' Jetzt kommt eine etwas verschrobene (aber sehr sinnvolle) "Berechnung",
 ' in welche Zeile die Daten sollen:
 ' .Rows.Count ist die maximale Anzahl der Zeilen im Blatt "Wegfälle".
 ' Wohlgemerkt, nicht die gefüllten Zeilen ,sondern alle (möglichen).
 ' Da die maximale Zeilenzahl bei verschiedenen Excel-Versionen verschieden ist,
 ' benutzt man keine feste Zahl, sondern .Rows.Count, um flexibel zu sein.
 ' .Cells(.Rows.Count, 1) ist also die Zelle in Spalte A (die 1 in der Klammer)
 ' und in der allerletzten möglichen Zeile.
 ' .End(xlUp) ist so viel wie das Drücken von Strg+Pfeil nach Oben.
 ' Wir suchen also von der allerletzten Zelle in Spalte A aus die erste Zelle darüber,
 ' die nicht leer ist.
 ' .Row ist die Zeilennummer dieser Zelle.
 ' Dies ist also die letzte belegte Zelle. Mit +1 kommen wir in die erste freie.
 ' Warum dieser Umweg des Von-Unten-Schauens?
 ' Es könnte ja sein, dass zwischen den gefüllte Zeilen irgendwo Leerzeilen sind.
 ' Sucht man von oben und findet eine Leere Zeile, weiß man nicht ob noch gefüllte kommen.

 End With
 ' Wurde oben erklärt.

 Application.EnableEvents = False
 ' Wir wollen jetzt gleich die Zeile im Eingabeblatt löschen.
 ' Das ist aber auch eine Veränderung des Blattinhaltes.
 ' Damit sich die Routine dabei nicht wieder selbst aufruft,
 ' deaktivieren wir die Reaktion von VBA auf Ereignisse
 ' für den nächsten Schritt.

 Rows(Target.Row).Delete xlUp
 ' Rows (Objektbezeichner ohne Punkt) bezieht sich immer auf das aktive Blatt)
 ' Target.Row ist wieder die Zeilennummer der geänderten Zelle,
 ' also ist Rows(Target.Row) die gesamte Zeile.
 ' Delete löscht dise Zeile
 ' xlUp gibt an, dass die nachfolgenden Zeilen nach oben geschoben werden sollen.
 ' Ich hab's nicht getestet, aber ich glaube, man könnte das weglassen.
 ' Was soll auch sonst mit nachfolgenden Zeile passieren?

 Application.EnableEvents = True
 ' Reaktion auf Ereignisse wird wieder eingeschaltet.

 End If
 ' All das ist nur passiert, wenn ... siehe oben.

End Sub
' Feddisch
1 Like

Hallo Andreas,

danke für deine nette Beurteilung. Aber wenn ich deine Erläuterungen lese dann komme ich mir ziemlich dämlich vor. Ich werde mich aber damit beschäftigen. Danke noch einmal für deine tolle Hilfe und ich wünsche dir noch eine schöne Zeit!
Gruß tausendschön

Hallo tausendschön,

du hast gar keinen Grund, dir dämlich (ist das Gegenstück „herrlich“?) vorzukommen. Jeder fängt mal an und jeder kommt mal weiter. Dafür ist u.a. dieses Forum da (noch, so lange es das in dieser Form noch gibt. Habe gerade gelesen, dass die Androhung des „Neue“ nun für September geplant ist).
Wenn du noch weitere Fragen zum Code oder zu anderen VBA-Dingen hast, jederzeit, gerne auch per Mail. Immer schön, wenn ich Leuten helfen kann, dazu zu lernen.

Gruß, Andreas

1 Like

ich danke und ich komme auch gern wieder darauf zurück.
Gruß tausendschön

1 Like