Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: VBA Zeilen verschieben wenn Bedingungen erfüllt

VBA Zeilen verschieben wenn Bedingungen erfüllt
04.07.2013 15:44:56
Jochen
Hallo zusammen,
ich habe hier ein Problem bei dem ich absolut nicht weiterkomme.
Ich habe eine Projektübersicht (Tabelle1) in Excel. Nun würde ich gerne wenn ein Projekt abgeschlossen ist, dieses komplett in ein Archivtabellenblatt (Tabelle2)verschieben.
In Spalte B habe ich die Prohektnummern, in Spalte C die Anzahl an Zeilen für dieses Projekt und in Spalte D den Projektstatus.
Wenn nun bei einem Projekt alle Zeilen z.B. Projekt 1 Zeilen 1-4 den Status 6 erreicht haben, so soll dieses Projket von Tabelle 1 nach Tabelle 2 verschoben werden.
Kann mir hier einer einen Tipp geben wie ich dies am Besten realisiere?
Mein bisheriger Versuch scheitert immer daran die Werte für ein gesamtes Projekt zu vergleichen, einzelne Zeilen in welchen die Bedingung Status 6 erfüllt sind zu verschieben funktioniert.
Dank im voraus,
Gruß
Jochen

Anzeige

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

Betreff
Datum
Anwender
Anzeige
AW: VBA Zeilen verschieben wenn Bedingungen erfüllt
04.07.2013 16:37:15
Oberschlumpf
Hi Jochen
Hast du ne Bsp-Datei?
Ciao
Thorsten

AW: VBA Zeilen verschieben wenn Bedingungen erfüllt
05.07.2013 15:13:51
fcs
Hallo Jochen,
mit folgendem Makro werden die abgeschlossenen Projekte ins Archiv kopiert und anschließend gelöscht.
Gruß
Franz Sub Copy_Projekte_Status6() Dim wksQ As Worksheet, wksZ As Worksheet Dim ZeileQ As Long, ZeileAnz As Long, ZeileZ As Long Const Zeile1 = 2 '1. Zeile mit einem Projektnamen - ggf. anpassen !! Set wksQ = Worksheets("Tabelle1") 'Projektübersicht - Tabellename ggf. anpassen Set wksZ = Worksheets("Tabelle2") 'Archivblatt - Tabellename ggf. anpassen With wksZ 'nächste freie Zeile im Zielblatt ZeileZ = .Cells(.Rows.Count, 4).End(xlUp).Row + 1 End With With wksQ If Zeile1 > .Cells(.Rows.Count, 3).End(xlUp).Row Then MsgBox "Keine Projekte in Projektübersicht eingetragen" Else ZeileQ = Zeile1 ' Do ZeileAnz = .Cells(ZeileQ, 3).Value 'Prüfen, ob in Spalte D alle Zeilen des Projekts den Wert 6 haben If Application.WorksheetFunction.CountIf(.Range(.Cells(ZeileQ, 4), _ .Cells(ZeileQ + ZeileAnz - 1, 4)), 6) = ZeileAnz Then With .Range(.Rows(ZeileQ), .Rows(ZeileQ + ZeileAnz - 1)) .Copy Destination:=wksZ.Cells(ZeileZ, 1) .ClearContents End With ZeileZ = ZeileZ + ZeileAnz End If ZeileQ = ZeileQ + ZeileAnz Loop Until IsEmpty(.Cells(ZeileQ, 4)) 'Leerzeilen löschen With .Range(.Cells(Zeile1, 4), .Cells(ZeileQ, 4)) If Application.WorksheetFunction.CountBlank(.Cells) = 1 Then MsgBox "Keine abgeschlossenen Projekte vorhanden" Else .SpecialCells(xlCellTypeBlanks).EntireRow.Delete shift:=xlShiftUp MsgBox "Abgeschlossene Projekte ins Archivblatt verschoben" End If End With End If End With End Sub

Anzeige
AW: VBA Zeilen verschieben wenn Bedingungen erfüllt
05.07.2013 15:29:10
Jochen
Hallo Franz,
erstmal Danke für Deine Hilfe, ich werde den Code am Montag mal ausprobieren.
Gruß
Jochen

AW: VBA Zeilen verschieben wenn Bedingungen erfüllt
08.07.2013 11:39:22
Jochen
Servus,
ich habe den Code nun mal probiert, irgendwie scheint das nicht ganz zu funktionieren, kann aber auch daran liegen das ich keine Zeile mit nem Projektnamen habe welche ich anpassen könnte. Es gibt nur spalten mit Projektnummern oder auch Projektnamen. Der Code verschiebt mir momentan immer die Zeile welche ich oben als Const Zeile1 angebe. Eventuell mache ich auch etwas falsch?

Anzeige
ähhh?
08.07.2013 20:57:06
Oberschlumpf
Hi Jochen
Wenn du gemerkt hast, dass der Code von Franz noch nicht läuft, wieso zeigst du nicht spätestens jetzt ne Bsp-Datei?
Ciao
Thorsten

AW: VBA Zeilen verschieben wenn Bedingungen erfüllt
08.07.2013 23:09:36
fcs
Hallo Jochen,
gemäß deiner Beschreibung in der Frage
In Spalte B habe ich die Prohektnummern, in Spalte C die Anzahl an Zeilen für dieses Projekt und in Spalte D den Projektstatus.
müssten deine Daten etwa wie folgt aussehen.
Tabelle1

 ABCDEF
1 ProjektName/-Nr.ZeilenStatusFeld01Feld02
2 B46A001A001
3   5A002A002
4   6A003A003
5   4A004A004
6 A123436A005A005
7   6A006A006
8   6A007A007
9 D13A008A008
10 Projekt E26A009A009
11   4A010A010
12 345626A011A011
13   6A012A012


Excel Tabellen im Web darstellen >> Excel Jeanie HTML 4
Damit funktioniert mein Makro.
Woher sollen wir denn wissen was du evtl falsch machst, wenn wir deinen Tabellenaufbau nicht kennen?
Den 2-mal gemachten Tipp, eine Beispieldatei (mit ggf. anonymisierten Testdaten) hier hochzuladen, solltest du spätestens jetzt beachten.
Gruß
Franz

Anzeige
AW: VBA Zeilen verschieben wenn Bedingungen erfüllt
09.07.2013 08:51:03
Jochen
Hallo zusammen,
ich hatte eigentlich eine Testmappe hochgeladen, scheint aber irgenwie nicht funktioniert zu haben, also ein neuer Versuch anbei...
hier der Link:

Die Datei https://www.herber.de/bbs/user/86257.xlsm wurde aus Datenschutzgründen gelöscht


Gruß
Jochen

Anzeige
AW: VBA Zeilen verschieben wenn Bedingungen erfüllt
09.07.2013 10:41:02
fcs
Hallo Jochen,
bei dem Aufbau der Daten muss die Anzahl Zeilen je Projekt etwas anders ermittelt werden.
Ansonsten passt mein Makro schon.
Gruß
Franz
Sub Copy_Projekte_Status6()
Dim wksQ As Worksheet, wksZ As Worksheet
Dim ZeileQ As Long, ZeileAnz As Long, ZeileZ As Long, Zeilen As Long
Const Zeile1 = 2 '1. Zeile mit einem Projektnamen - ggf. anpassen !!
Set wksQ = Worksheets("Tabelle1") 'Projektübersicht - Tabellename ggf. anpassen
Set wksZ = Worksheets("Tabelle2") 'Archivblatt - Tabellename ggf. anpassen
With wksZ
'nächste freie Zeile im Zielblatt
ZeileZ = .Cells(.Rows.Count, 4).End(xlUp).Row + 1
End With
With wksQ
If Zeile1 > .Cells(.Rows.Count, 3).End(xlUp).Row Then
MsgBox "Keine Projekte in Projektübersicht eingetragen"
Else
Zeilen = .Cells(.Rows.Count, 2).End(xlUp).Row
ZeileQ = Zeile1 '
Do
'Anzahl Projektzeilen ermitteln
ZeileAnz = Application.WorksheetFunction.CountIf(.Range(.Cells(Zeile1, 2), _
Cells(Zeilen, 2)), .Cells(ZeileQ, 2).Value)
'Prüfen, ob in Spalte D alle Zeilen des Projekts den Wert 6 haben
If Application.WorksheetFunction.CountIf(.Range(.Cells(ZeileQ, 4), _
.Cells(ZeileQ + ZeileAnz - 1, 4)), 6) = ZeileAnz Then
With .Range(.Rows(ZeileQ), .Rows(ZeileQ + ZeileAnz - 1))
.Copy Destination:=wksZ.Cells(ZeileZ, 1)
.ClearContents
End With
ZeileZ = ZeileZ + ZeileAnz
End If
ZeileQ = ZeileQ + ZeileAnz
Loop Until IsEmpty(.Cells(ZeileQ, 4))
'Leerzeilen löschen
With .Range(.Cells(Zeile1, 4), .Cells(ZeileQ, 4))
If Application.WorksheetFunction.CountBlank(.Cells) = 1 Then
MsgBox "Keine abgeschlossenen Projekte vorhanden"
Else
.SpecialCells(xlCellTypeBlanks).EntireRow.Delete shift:=xlShiftUp
MsgBox "Abgeschlossene Projekte ins Archivblatt verschoben"
End If
End With
End If
End With
End Sub

Anzeige
AW: VBA Zeilen verschieben wenn Bedingungen erfüllt
09.07.2013 11:17:08
Jochen
Hallo Franz,
perfekt, habe es gerade getestet.
eine kleine Frage noch, in meinem Quellblatt sind Formeln hinterlegt, wie kann ich Ihm sagen das in der Zieltabelle nur die Werte geschrieben werden sollen, war das nicht irgendwas mit "paste special" oder so ähnlich? Wenn ja, wo muss ich das einfügen?
Danke erstmal für Deine Mühe, und sorry das der Upload der Testdatei nicht gleich funktioniert hat...
Gruß
Jochen

Anzeige
AW: VBA Zeilen verschieben wenn Bedingungen erfüllt
09.07.2013 21:14:19
fcs
Hallo Jochen,
dann muss du den Kopierabschnitt des Makros wie folgt anpassen:
            With .Range(.Rows(ZeileQ), .Rows(ZeileQ + ZeileAnz - 1))
.Copy
wksZ.Cells(ZeileZ, 1).PasteSpecial Paste:=xlPasteFormats
wksZ.Cells(ZeileZ, 1).PasteSpecial Paste:=xlPasteValues
.ClearContents
End With

Gruß
Franz

Anzeige
AW: VBA Zeilen verschieben wenn Bedingungen erfüllt
10.07.2013 08:49:42
Jochen
Hallo Franz,
jetzt funktioniert wirklich alles perfekt, vielen Dank für Deine tolle Unterstützung.
Gruß
Jochen
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige
Anzeige

Infobox / Tutorial

VBA zum automatischen Verschieben von Zeilen bei erfüllten Bedingungen


Schritt-für-Schritt-Anleitung

Um in Excel Zeilen automatisch zu verschieben, wenn eine Bedingung erfüllt ist, kannst du ein VBA-Makro verwenden. Hier ist eine Schritt-für-Schritt-Anleitung:

  1. Öffne deine Excel-Datei mit der Projektübersicht (Tabelle1) und dem Archivblatt (Tabelle2).

  2. Öffne den VBA-Editor mit ALT + F11.

  3. Füge ein neues Modul hinzu: Klicke mit der rechten Maustaste auf "VBAProject (deine Datei)" > Einfügen > Modul.

  4. Kopiere den folgenden Code in das Modul:

    Sub Copy_Projekte_Status6()
        Dim wksQ As Worksheet, wksZ As Worksheet
        Dim ZeileQ As Long, ZeileAnz As Long, ZeileZ As Long, Zeilen As Long
        Const Zeile1 = 2 '1. Zeile mit einem Projektnamen - ggf. anpassen
        Set wksQ = Worksheets("Tabelle1") 'Projektübersicht
        Set wksZ = Worksheets("Tabelle2") 'Archivblatt
    
        With wksZ
            ZeileZ = .Cells(.Rows.Count, 4).End(xlUp).Row + 1
        End With
    
        With wksQ
            If Zeile1 > .Cells(.Rows.Count, 3).End(xlUp).Row Then
                MsgBox "Keine Projekte in Projektübersicht eingetragen"
            Else
                Zeilen = .Cells(.Rows.Count, 2).End(xlUp).Row
                ZeileQ = Zeile1
                Do
                    ZeileAnz = Application.WorksheetFunction.CountIf(.Range(.Cells(Zeile1, 2), .Cells(Zeilen, 2)), .Cells(ZeileQ, 2).Value)
                    If Application.WorksheetFunction.CountIf(.Range(.Cells(ZeileQ, 4), .Cells(ZeileQ + ZeileAnz - 1, 4)), 6) = ZeileAnz Then
                        With .Range(.Rows(ZeileQ), .Rows(ZeileQ + ZeileAnz - 1)
                            .Copy Destination:=wksZ.Cells(ZeileZ, 1)
                            .ClearContents
                        End With
                        ZeileZ = ZeileZ + ZeileAnz
                    End If
                    ZeileQ = ZeileQ + ZeileAnz
                Loop Until IsEmpty(.Cells(ZeileQ, 4))
    
                With .Range(.Cells(Zeile1, 4), .Cells(ZeileQ, 4))
                    If Application.WorksheetFunction.CountBlank(.Cells) = 1 Then
                        MsgBox "Keine abgeschlossenen Projekte vorhanden"
                    Else
                        .SpecialCells(xlCellTypeBlanks).EntireRow.Delete shift:=xlShiftUp
                        MsgBox "Abgeschlossene Projekte ins Archivblatt verschoben"
                    End If
                End With
            End If
        End With
    End Sub
  5. Schließe den VBA-Editor und speichere deine Datei als Makro-fähige Excel-Datei (.xlsm).

  6. Starte das Makro über ALT + F8, wähle Copy_Projekte_Status6 und klicke auf "Ausführen".


Häufige Fehler und Lösungen

  • Problem: Das Makro verschiebt immer die gleiche Zeile.

    • Lösung: Stelle sicher, dass der Wert von Zeile1 korrekt ist und dass die Projektnummern in Spalte B korrekt hinterlegt sind.
  • Problem: Fehlermeldungen beim Ausführen des Makros.

    • Lösung: Überprüfe die Blattnamen in deinem Code. Sie müssen genau mit den Namen in deiner Excel-Datei übereinstimmen.

Alternative Methoden

Wenn du keine VBA-Makros verwenden möchtest, kannst du auch folgende Methoden nutzen:

  • Filter verwenden: Filtere die Projekte mit Status 6 und kopiere die gefilterten Zeilen manuell in ein anderes Tabellenblatt.
  • Pivot-Tabellen: Nutze Pivot-Tabellen, um abgeschlossene Projekte zusammenzufassen und diese dann in ein anderes Blatt zu übertragen.

Praktische Beispiele

Hier ist ein Beispiel für eine Projektübersicht:

Projektname Zeilen Status
Projekt 1 4 6
Projekt 2 3 5
Projekt 3 2 6

Mit dem Makro wird "Projekt 1" und "Projekt 3" automatisch ins Archivblatt verschoben, wenn der Status 6 erreicht ist.


Tipps für Profis

  • Code optimieren: Du kannst den Code weiter optimieren, indem du Fehlerbehandlungen einfügst, um sicherzustellen, dass das Makro auch bei unerwarteten Eingaben stabil bleibt.
  • Automatisierung: Überlege, das Makro regelmäßig automatisch auszuführen, z.B. beim Öffnen der Datei, um die Übersichtlichkeit zu erhöhen.

FAQ: Häufige Fragen

1. Wie kann ich sicherstellen, dass nur die Werte und nicht die Formeln kopiert werden? Du kannst den Kopierabschnitt im Makro anpassen und PasteSpecial verwenden, um nur die Werte zu übertragen.

.Copy
wksZ.Cells(ZeileZ, 1).PasteSpecial Paste:=xlPasteValues
.ClearContents

2. Funktioniert das Makro in allen Excel-Versionen? Das Makro sollte in allen modernen Excel-Versionen funktionieren, die VBA unterstützen (Excel 2010 und neuer). Achte darauf, dass Makros in deinen Excel-Einstellungen aktiviert sind.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige