Anzeige
Archiv - Navigation
1924to1928
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

VBA - Zeilen in Tabellenblatt verschiebe

VBA - Zeilen in Tabellenblatt verschiebe
20.03.2023 10:16:06
Anne

Hallo zusammen,
ich wende mich mit einem VBA-Problem an euch, da ich hier bereits viele hilfreiche und kompetente Personen unter anderen Beiträgen entdeckt habe.
Ich benötige für meine Excel-Mappe einen VBA Code. Ich habe bereits sehr viele Stunden und Tage in verschiedenen Foren und auch hier nach einer Lösung für mein Problem gesucht, jedoch nichts extakt Passendes gefunden und ich bin leider ein VBA Leie und habe versucht selbst dran rum zu basteln - jedoch vergebens.
Den gerfunden Code poste ich auch unterhalb noch einmal. Ich hoffe, dass sich hier jemand finden lässt der mir seine Hilfe anbietet und mir bei meinem Problem helfen kann!

Zu meiner Excel-Mappe:
Mein Wunsch wäre es, dass bestimmte Zeilen automatisch in andere Tabellenblätter verschoben werden, jenachdem welches "Ereigenis" in Spalte S eintrifft.
Mit Ereigenis meine ich, dass ich gerne Zeilen ausschneiden würde sobald bspw. in Spalte 19 (S) ein "Erledigt" steht und diese soll in das Tabellenblatt "Erledigt" und die darin enthaltene Tabelle "Erledigt" übernommen werden. Es sollen jedoch nur bestimmte Zellen der Spalte kopiert werden.
Ebenso soll das gleiche bei dem "Ereignis" - "Keine" passieren, jedoch nur im Tabellenblatt "Keine" und der Tabelle "Keine".
Die Tabellen fangen immer in Zeile 17 an (ich weiß nicht, ob diese Information nötig ist).
Die Zeile soll aus der aktuellen Tabelle/Tabellenblatt "Montagestatus" dann auch komplett entfernt werden. Hier sollen sich nur aktuelle Aufträge befinden - alle Erledigten oder Keinen sollen dementsprechen in das dazugehörige Blatt einsortiert werden.
Den Code den ich bereits im Internet gefunden habe, funktioniert soweit auch, jedoch weiß ich
- (1) nicht wie ich Codes zusammenführen kann
- (2) nicht wie ich es hinbekomme, dass nur bestimmte Zellen in das gewünschte Blatt übernommen werden
- (3) nicht wie diese auch wirklich in der dazugehörigen Tabelle des Tabellenblattes einsortiert werden (dies ist aktuelle nicht der Fall - die Zeilen werden einfach in die nächste freie Position kopiert)

hier noch einmal kurz zusammengefasst:

Dropdown in Spalte S – Erledigt/Keine/Weitere
• Wenn „Erledigt“ schneide die Zeile aus und füge die Zellen, jedoch nur A bis R, im Tabellenblatt „Erledigt“ in der Tabelle „Erledigt“ ein.
• Wenn „Keine“ schneide die Zeile aus und füge die Zellen, jedoch nur A bis D, im Tabellenblatt „Keine“ in der Tabelle „Keine“ ein.

Bereits vorhandener Code:

Private Sub Worksheet_Change(ByVal Target As Range)
Dim lngErste As Long
If Target.Column = 19 Then
If Target.Count = 1 Then
If Target.Value = "Erledigt" Then
With Worksheets("Erledigt")
lngErste = IIf(IsEmpty(.Cells(.Rows.Count, 1)), _
.Cells(.Rows.Count, 1).End(xlUp).Row, .Rows.Count) + 1
Rows(Target.Row).Copy
.Cells(lngErste, 1).PasteSpecial Paste:=xlValues
Rows(Target.Row).Delete shift:=xlUp
End With
End If
End If
End If
End Sub


Und:

Private Sub Worksheet_Change(ByVal Target As Range)
Dim lngErste As Long
If Target.Column = 19 Then
If Target.Count = 1 Then
If Target.Value = "Keine" Then
With Worksheets("Keine")
lngErste = IIf(IsEmpty(.Cells(.Rows.Count, 1)), _
.Cells(.Rows.Count, 1).End(xlUp).Row, .Rows.Count) + 1
Rows(Target.Row).Copy
.Cells(lngErste, 1).PasteSpecial Paste:=xlValues
Rows(Target.Row).Delete shift:=xlUp
End With
End If
End If
End If
End Sub




Ich würde mich sehr freuen, wenn sich mir jemand annimmt und mir bei der Lösung meines Problems helfen könnte!
Vielen Dank im Vorfeld und liebe Grüße :)

7
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA - Zeilen in Tabellenblatt verschiebe
20.03.2023 11:11:20
Rudi Maintaire
Hallo,
teste mal:
Private Sub Worksheet_Change(ByVal Target As Range)
  Dim lngErste As Long
  If Target.Column = 19 Then
    If Target.Count = 1 Then
      On Error GoTo ERREXIT
      Application.EnableEvents = False
      Select Case Target.Value
        Case "Erledigt"
          With Worksheets("Erledigt")
            lngErste = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
            Cells(Target.Row, 1).Resize(, 18).Copy
            .Cells(lngErste, 1).PasteSpecial Paste:=xlValues
            Target.EntireRow.Delete shift:=xlUp
          End With
        Case "Keine"
          With Worksheets("Keine")
            lngErste = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
            Cells(Target.Row, 1).Resize(, 4).Copy
            .Cells(lngErste, 1).PasteSpecial Paste:=xlValues
            Target.EntireRow.Delete shift:=xlUp
          End With
      End Select
    End If
  End If
ERREXIT:
  Application.EnableEvents = True
End Sub
Gruß
Rudi


Anzeige
AW: VBA - Zeilen in Tabellenblatt verschiebe
20.03.2023 14:45:02
Anne
Hallo Rudi,

ich freue mich rießig - der Code passt perfekt!! Vielen vielen Dank! :-)

Ich hätte tatsächlich eine weitere Frage zu diesem Code bzw. zu meiner Excelmappe :-)

Gibt es auch die Möglichkeit einen weiteren Code an deinen geposteten dran zu hängen, welcher folgendes bewirken soll:

Wenn in Spalte S „Weitere“ eingetragen wird soll die aktuelle Zeile kopiert und unterhalb in der selben Tabelle eingefügt werden – Jedoch auch hier nur die Zellen A bis C und das Datum aus Zelle R soll in der neuen Zeile in Zelle D stehen.
Zum Veranschaulichen eine kleine Tabelle - In den Klammern stehen die Spalten:
Aktuelle Zeile: (A) TK (B) Peter (C) 72819 (D) 03.01.2023 (...) .... (R) 15.02.2023 (S) "Weitere"
Neue Zeile: (A) TK (B) Peter (C) 72819 (D) 15.02.2023 (...) leer (R) leer (S) leer

Im Anschluss soll die Zeile in der „Weitere“ steht jedoch ebenfalls in das Tabellenblatt und die Tabelle „Erledigt“ verschoben werden und aus der aktuellen Tabelle entfernt werden.

Diesen Code habe ich bereits im Internet gefunden – jedoch passt auch dieser nicht genau zu meinen Vorstellungen:

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Count = 1 Then
        If Target.Column = 19 And Target.Row > 19 Then
            If Target = "Weitere" Then
                Application.EnableEvents = False
                Cells(Target.Row + 1, 1).EntireRow.Insert
                Cells(Target.Row, 1).EntireRow.Copy Cells(Target.Row + 1, 1)
                Target.Offset(1, 0).ClearContents
            End If
        End If
    End If
    Application.EnableEvents = True
End Sub



Vielen Dank nochmal für deine Hilfe! :)


Anzeige
AW: VBA - Zeilen in Tabellenblatt verschiebe
20.03.2023 15:53:59
Rudi Maintaire
Hallo,
Diesen Code habe ich bereits im Internet gefunden – jedoch passt auch dieser nicht genau zu meinen Vorstellungen:
dann stell ich mal einen passenden ins Internet ;-)

Private Sub Worksheet_Change(ByVal Target As Range)
  Dim lngErste As Long
  If Target.Column = 19 Then
    If Target.Count = 1 Then
      On Error GoTo ERREXIT
      Application.EnableEvents = False
      Select Case Target.Value
        Case "Erledigt"
          With Worksheets("Erledigt")
            lngErste = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
            Cells(Target.Row, 1).Resize(, 18).Copy
            .Cells(lngErste, 1).PasteSpecial Paste:=xlValues
            Target.EntireRow.Delete shift:=xlUp
          End With
        Case "Keine"
          With Worksheets("Keine")
            lngErste = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
            Cells(Target.Row, 1).Resize(, 4).Copy
            .Cells(lngErste, 1).PasteSpecial Paste:=xlValues
            Target.EntireRow.Delete shift:=xlUp
          End With
        Case "Weitere"
          Cells(Target.Row, 1).Resize(, 4).Copy Cells(Rows.Count, 1).End(xlUp).Offset(1)
          With Worksheets("Erledigt")
            lngErste = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
            Cells(Target.Row, 1).Resize(, 18).Copy
            .Cells(lngErste, 1).PasteSpecial Paste:=xlValues
            Target.EntireRow.Delete shift:=xlUp
          End With
      End Select
    End If
  End If
ERREXIT:
  Application.EnableEvents = True
End Sub
Gruß
Rudi


Anzeige
AW: VBA - Zeilen in Tabellenblatt verschiebe
20.03.2023 16:28:58
Anne
Hallo Rudi,

vielen Dank, dass du dich meinen Problem annimmst und für die schnellen Antworten! :-)

Ich habe den neuen Code soeben getestet - leider klappt dieser nicht vollständig.
Folgende Probleme sind aufgetreten:
(1) Das Datum aus Spalte R wurde nicht in der neuen Zeile für die Spalte D eingesetzt - sondern wurde lediglich das vorherige Datum aus Spalte D übernommen. Ist das überhaupt möglich wie ich es mir vorstelle? :)
- Aus der zu kopierende Zeile soll das Datum aus Spalte R in der kopierten Zeile in Spalte D stehen.

(2) Wenn die Zeile eingefügt wird, werden an bestimmten Punkten über der Zeile dicke Rahmenlinien mit eingefügt - welche da jedoch gar nicht hingehören. Kann man das irgendwie unterbinden?
(3) Und gibt es die Möglichkeit, dass die neue Zeile direkt unter der zu kopierenden Zeile eingefügt wird und nicht ganz am Ende der Tabelle? :)

Ansonsten macht der Code aber was er soll! :-)
Die Zeile wird kopiert und die restlichen Zellen - also ab Zelle D - werden geleert! Und im Anschluss ist die kopierte Zelle aus der Tabelle entfernt und befindet sich mit allen nötigen Daten in der Tabelle "Erledigt" wieder! :)

Vielen Vielen Dank!
Liebe Grüße


Anzeige
AW: VBA - Zeilen in Tabellenblatt verschiebe
20.03.2023 16:58:22
Rudi Maintaire
Hallo,
neuer Versuch:
Private Sub Worksheet_Change(ByVal Target As Range)
  Dim lngErste As Long
  If Target.Column = 19 Then
    If Target.Count = 1 Then
      On Error GoTo ERREXIT
      Application.EnableEvents = False
      Select Case Target.Value
        Case "Erledigt"
          With Worksheets("Erledigt")
            lngErste = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
            Cells(Target.Row, 1).Resize(, 18).Copy
            .Cells(lngErste, 1).PasteSpecial Paste:=xlValues
            Target.EntireRow.Delete shift:=xlUp
          End With
        Case "Keine"
          With Worksheets("Keine")
            lngErste = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
            Cells(Target.Row, 1).Resize(, 4).Copy
            .Cells(lngErste, 1).PasteSpecial Paste:=xlValues
            Target.EntireRow.Delete shift:=xlUp
          End With
        Case "Weitere"
          Target.Offset(1).EntireRow.Insert
          Cells(Target.Row, 1).Resize(, 3).Copy
          Cells(Target.Row + 1, 1).PasteSpecial xlPasteValues
          Cells(Target.Row + 1, 4) = Target.Offset(, -1)
          With Worksheets("Erledigt")
            lngErste = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
            Cells(Target.Row, 1).Resize(, 18).Copy
            .Cells(lngErste, 1).PasteSpecial Paste:=xlValues
            Target.EntireRow.Delete shift:=xlUp
          End With
      End Select
    End If
  End If
ERREXIT:
  Application.EnableEvents = True
End Sub
Gruß
Rudi


Anzeige
AW: VBA - Zeilen in Tabellenblatt verschiebe
20.03.2023 17:14:17
Anne
Super, ich freue mich - der Code klappt einwandfrei!
Ich Danke dir vielmals für deine Unterstützung und deine Zeit! :-)

Liebe Grüße


AW: VBA - Zeilen in Tabellenblatt verschiebe
20.03.2023 12:01:20
Mathias
Hallo Anne,

Hier ein Code, der die Zeile in die entsprechende Tabelle verschiebt und danach die Zeile aus der eigentlichen Tabelle löscht.
Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Column = 20 And (Target.Text = "Erledigt" Or Target.Text = "Keine") Then 'Der Code geht davon aus, dass die LinkedCell von deinem Dropdown in Spalte T ist
        Dim intSpalten As Integer
        Select Case Target.Text
        Case "Erledigt"
            intSpalten = 18
        Case "Keine"
            intSpalten = 4
        End Select
        
        Dim wsZiel As Worksheet
        Set wsZiel = ThisWorkbook.Worksheets(Target.Text)
        
        Dim lngEnd As Long
        lngEnd = GetEnd(wsZiel)
        
        Dim rngStart, rngZiel As Range
        Set rngStart = Range(Target.Worksheet.Cells(Target.Row, 1), Target.Worksheet.Cells(Target.Row, intSpalten))
        Set rngZiel = wsZiel.Range(wsZiel.Cells(lngEnd, 1), wsZiel.Cells(lngEnd, intSpalten))
        rngStart.Cut rngZiel
        
        Target.Worksheet.Rows(Target.Row).Delete
    End If
End Sub

Private Function GetEnd(ByVal wsFindEnd As Worksheet) As Long
    GetEnd = wsFindEnd.Cells(wsFindEnd.Rows.Count, 1).End(xlUp).Row + 1
End Function
Es werden natürlich nur die gewünschten Spalten verschoben.
Bei dem Code wird die Zeile auch nur unten an die Tabelle hinzugefügt. Allerdings kannst du die Tabelle ja einfach neu sortieren.
Die LinkedCell von deinem Dropdown muss dafür in der gleichen Zeile sein, wie die Spalte, die du verschieben möchtest.
Der Code geht davon aus, dass die LinkedCell von deinem Dropdown in Spalte T (20) ist.
Sollte die LinkedCell von deinem Dropdown in einer andere Spalte sein, so müsstest du dies natürlich ändern.

Liebe Grüße
Mathias

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige