Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1764to1768
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

Zellwert bedingt, Bereich kopieren

Zellwert bedingt, Bereich kopieren
11.06.2020 11:32:39
Schlandro
Guten Tag in die Runde,
ich arbeite an einer Arbeitsschritt-Übersicht mit verschiedenen Stati die aus einem Datenblatt gezogen werden.
Der Hintergrund dabei ist, dass Arbeitsschritte die vergessen wurden und der nächste auftretende Arbeitschritt in der Übersicht auftauchen soll.
Konkret sollen immer drei Stati miteinander verglichen werden, der ausgewählte Status und der Status aus der Zeile darüber und darunter.
Wenn der Zellwert des Status in der Zeile darüber im Status gleich ist, aber der Status in der Zelle darunter unterschiedlich ist, dann soll die untere Zelle kopiert und auf die Übersichtsseite eingefügt werden.
Bsp. 2.1 Approved, 2.2. Approved, 2.3 Done - Zeile 12 mit 2.3 soll kopiert und auf Übersicht eingefügt werden
Wenn der Zellwert im Status oben und unten gleich ist, aber in der mittleren Zeile nicht, dann soll die mittlere Zelle kopiert werden
Bsp. Approved, Done, Approved - dann soll Zeile mit Status Done kopiert auf der Übersicht eingefügt werden
Ich scheitere dabei den Vergleich der Stati sinvoll in VBA umzusetzen, damit die richtigen Zeilen kopiert werden. Vielleicht hat jemand eine gute Idee und könnte mir weiterhelfen. Anbei ist eine Testdatei.
https://www.herber.de/bbs/user/138218.xlsx
Vielen Dank im voraus und beste Grüße

13
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Zellwert bedingt, Bereich kopieren
11.06.2020 11:36:24
Werner
Hallo,
und was ist, wenn alle drei gleich sind?
Gruß Werner
AW: Zellwert bedingt, Bereich kopieren
11.06.2020 11:45:11
Schlandro
Hallo Werner,
wenn alle drei Stati gleich sind soll nichts kopiert werden.
Grüße
AW: Zellwert bedingt, Bereich kopieren
11.06.2020 12:49:44
Werner
Hallo,
teste mal:
Option Explicit
Public Sub aaa()
Dim i As Long, loLetzte As Long, strMitte As String
Dim strOben As String, strUnten As String
Application.ScreenUpdating = False
With Worksheets("Datenblatt")
loLetzte = .Cells(.Rows.Count, "B").End(xlUp).Row
For i = 4 To loLetzte - 1 Step 3
strMitte = .Cells(i, "B")
strOben = .Cells(i, "B").Offset(-1)
strUnten = .Cells(i, "B").Offset(1)
If strMitte = strOben And strMitte  strUnten Then
.Cells(i, "A").Offset(1).Resize(1, 4).Copy
With Worksheets("Übersicht")
.Range("A" & .Cells(.Rows.Count, "A").End(xlUp).Offset(1).Row) _
.PasteSpecial Paste:=xlPasteValues
End With
ElseIf strOben = strUnten And strMitte  strOben Then
.Cells(i, "A").Resize(, 4).Copy
With Worksheets("Übersicht")
.Range("A" & .Cells(.Rows.Count, "A").End(xlUp).Offset(1).Row) _
.PasteSpecial Paste:=xlPasteValues
End With
End If
Next i
End With
Application.CutCopyMode = False
End Sub
Gruß Werner
Anzeige
AW: Zellwert bedingt, Bereich kopieren
12.06.2020 15:53:36
Schlandro
Hallo Werner,
vielen Dank für die Hilfe. Der code funktioniert mit der Testdatei soweit. Ich wollte den Code jetzt etwas erweitern bin dabei jedoch auf neue Probleme gestoßen.
Zum einen wollte ich je nach Bedingung, dass der kopierte Text in eine andere Zeile in der Überischt eingefügt wird. Jedoch funktioniert es nicht wie gewünscht, den Fehler finde ich nicht.
Zum anderen wollte ich alle Zeilen kopieren in dem der Status Done vermerkt ist und auf der Übersicht einfügen. Mein 'Sub-kopieren' funktionert allerdings nicht.
Meine dritte Frage ist: Wenn das Makro atomatisch starten soll beim Öfnnen der Datei, muss ich _ dann mit dem Befehl

Private Sub - call sub arbeiten?
Anbei ist die Testdatei mit dem Code:  _
https://www.herber.de/bbs/user/138247.xlsm
Der Code:
Option Explicit

Public Sub aaa()
Dim i As Long, loLetzte As Long, strMitte As String
Dim strOben As String, strUnten As String
Application.ScreenUpdating = False
' Übersicht soll erneuert werden
Sheets("Übersicht").Select
Rows("4:24").Select
Selection.ClearContents
Rows("28:47").Select
Selection.ClearContents
With Worksheets("Datenblatt")
loLetzte = .Cells(.Rows.Count, "B").End(xlUp).Row
For i = 4 To loLetzte - 1 Step 3
strMitte = .Cells(i, "B")
strOben = .Cells(i, "B").Offset(-1)
strUnten = .Cells(i, "B").Offset(1)
' Anstehend
If strMitte = strOben And strOben  strUnten Then
.Cells(i, "A").Offset(1).Resize(1, 4).Copy
With Worksheets("Übersicht")
.Range("A" & .Cells(.Rows.Count, "A").End(xlUp).Offset(1).Row) _
.PasteSpecial Paste:=xlPasteValues
End With
' Verzögert
ElseIf strOben = strUnten And strMitte  strOben And strMitte  strUnten Then
.Cells(i, "A").Resize(, 28).Copy
With Worksheets("Übersicht")
.Range("A" & .Cells(.Rows.Count, "A").End(xlUp).Offset(1).Row) _
.PasteSpecial Paste:=xlPasteValues
End With
End If
Next i
End With
Application.CutCopyMode = False
End Sub
'Sub Kopieren()
' Dim RaZelle As Range
'Dim LoZeile As Long
'For Each RaZelle In Range("B4:B40")
' If RaZelle = Done Then
' Range("B" & RaZelle.Row & ":F" & RaZelle.Row).Copy Range("CE" & LoZeile + 1)
' LoZeile = LoZeile + 1
' RaZelle.ClearContents
'End If
'Next RaZelle
'End Sub

Besten Dank und ich hoffe ich habe mich verständlich ausgedrückt,
Beste Grüße
Anzeige
AW: Zellwert bedingt, Bereich kopieren
13.06.2020 07:55:05
Werner
Hallo,
was erwartest du denn?
Du hast hier eine Beispielmappe eingestellt. Anhand deren Aufbau habe ich dir ein Makro geschreiben.
Jetzt änderst du den Tabellenaufbau und erwartest ernsthaft, dass das Makro dann auch noch funktioniert?
Mal was Grundsätzliches:
Bau deine (jetzt hochgeladene) Datei um. Stell die einzelnen Bereiche nicht untereinander sondern nebeneinander.
So wie du es jetzt hast, müsste ja auch noch eine Prüfung rein, ob im jeweiligen Bereich überhaupt genug Platz vorhanden ist um die Daten da unter zu bringen. Das ist doch unnötiger Aufwand. Sind die Datenbereiche nebeneinander, dann entfällt das.
Zudem stellt sich die Frage, ob die Kopieraktionen immer alle durchgeführt werden sollen oder einzeln, je nach Bedarf.
Gruß Werner
Anzeige
AW: Zellwert bedingt, Bereich kopieren
13.06.2020 18:32:27
Schlandro
Hallo Werner,
Danke für die Anwort. Die Kopieraktion soll immer durchgeführt werden und das immer beim öffnen der Datei.
Wenn ich die Bereiche 'verzögert' und 'anstehend' nebeneinander habe, wie kann ich dann den Bereich im Datenblatt kopieren, dass nicht die ganze Zeile sondern nur die Zellen mit Text kopiert werden? Und dann entsprechend in der Übersicht unter 'verzögert' und 'anstehend' eingefügt wird?
Ich habe die Testdatei entsprechend nochmals überarbeitet.
https://www.herber.de/bbs/user/138263.xlsm
Vielen Dank und beste Grüße
Anzeige
AW: Zellwert bedingt, Bereich kopieren
13.06.2020 19:06:20
ralf_b
.Cells(i, "A").Resize(, 4).Copy
das ist ein Bereich von einer Zeile von Spalte A bis D . Resize vergrößert den Bereich. Range kann nur eine Zelle oder ein Bereich sein.
genauso kopiert man dann auch. also eine ganze Zeile wird in deinem Code nirgends kopiert
AW: Zellwert bedingt, Bereich kopieren
13.06.2020 20:01:19
Werner
Hallo,
diese beiden Makros in ein allgemeines Modul:
Option Explicit
Public Sub Status()
Dim i As Long, loLetzte As Long, strMitte As String
Dim strOben As String, strUnten As String
Dim raAnstehend As Range, raVerzögert As Range
Application.ScreenUpdating = False
' Übersicht soll erneuert werden
Worksheets("Übersicht").Range("A4:I1000").ClearContents
With Worksheets("Datenblatt")
loLetzte = .Cells(.Rows.Count, "B").End(xlUp).Row
For i = 4 To loLetzte - 1 Step 3
strMitte = .Cells(i, "B")
strOben = .Cells(i, "B").Offset(-1)
strUnten = .Cells(i, "B").Offset(1)
' Verzögert
If strOben = strUnten And strMitte  strOben And strMitte  strUnten Then
If raVerzögert Is Nothing Then
Set raVerzögert = .Range("A" & i & ":D" & i)
Else
Set raVerzögert = Union(raVerzögert, .Range("A" & i & ":D" & i))
End If
' Anstehend
ElseIf strMitte = strOben And strOben  strUnten Then
If raAnstehend Is Nothing Then
Set raAnstehend = .Range("A" & i + 1 & ":D" & i + 1)
Else
Set raAnstehend = Union(raAnstehend, .Range("A" & i + 1 & ":D" & i + 1))
End If
End If
Next i
If Not raVerzögert Is Nothing Then
raVerzögert.Copy
Worksheets("Übersicht").Range("A4").PasteSpecial Paste:=xlPasteValues
End If
If Not raAnstehend Is Nothing Then
raAnstehend.Copy
Worksheets("Übersicht").Range("F4").PasteSpecial Paste:=xlPasteValues
End If
End With
Application.CutCopyMode = False
Set raVerzögert = Nothing: Set raAnstehend = Nothing
Call Kopieren_Done
End Sub
Sub Kopieren_Done()
Dim i As Long, raBereich As Range
Application.ScreenUpdating = False
Worksheets("Übersicht").Range("K4:N1000").ClearContents
With Worksheets("Datenblatt")
For i = 3 To .Cells(.Rows.Count, "A").End(xlUp).Row
If .Cells(i, "B") = "Done" Then
If raBereich Is Nothing Then
Set raBereich = (.Range("A" & i & ":D" & i))
Else
Set raBereich = Union(raBereich, .Range("A" & i & ":D" & i))
End If
End If
Next i
If Not raBereich Is Nothing Then
raBereich.Copy
Worksheets("Übersicht").Range("K4").PasteSpecial Paste:=xlPasteValues
End If
End With
Application.CutCopyMode = False
Set raBereich = Nothing
End Sub
Ins Codemodul von "DieseArbeitsmappe"
Private Sub Workbook_Open()
Call Status
End Sub
Im Zielblatt in Zelle A2: Verzögert
in Zellen A3 bis D3 die Überschriften ID / Status / Schritt / Beschreibung
Für Anstehend dann ab Spalte F und für Überprüfung ab Spalte K
Also die jeweiligen Datenbereiche immer mit einer Leerspalte dazwischen.
Im Moment kann ich nichts hochladen.
Gruß Werner
Anzeige
AW: Zellwert bedingt, Bereich kopieren
14.06.2020 18:33:26
Schlandro
Hallo Werner und Ralf,
vielen Dank für den Hinweis Ralf.
Werner, dein Code funktioniert in der Testdatei einwandfrei, besten Dank.
Ich scheitere momentan noch daran, wenn der Status in Spalte B im Datenblatt entweder 'Approved' oder kein Text enthalten hat, dass dann nichts aus der Zeile kopiert werden soll.
Gibt es dazu eine Lösung?
Vielen Dank für eure Hilfe und beste Grüße
AW: Zellwert bedingt, Bereich kopieren
14.06.2020 19:39:33
Werner
Hallo,
keine Ahnung was du meinst.
Gruß Werner
AW: Zellwert bedingt, Bereich kopieren
14.06.2020 19:42:13
ralf_b
vielleicht so?
For i = 4 To loLetzte - 1 Step 3
strMitte = .Cells(i, "B")
if strMitte  "Approved" And strMitte "" then
strOben = .Cells(i, "B").Offset(-1)
strUnten = .Cells(i, "B").Offset(1)
' Verzögert
If strOben = strUnten And strMitte  strOben And strMitte  strUnten Then
If raVerzögert Is Nothing Then
Set raVerzögert = .Range("A" & i & ":D" & i)
Else
Set raVerzögert = Union(raVerzögert, .Range("A" & i & ":D" & i))
End If
' Anstehend
ElseIf strMitte = strOben And strOben  strUnten Then
If raAnstehend Is Nothing Then
Set raAnstehend = .Range("A" & i + 1 & ":D" & i + 1)
Else
Set raAnstehend = Union(raAnstehend, .Range("A" & i + 1 & ":D" & i + 1))
End If
End If
End if
Next i

Anzeige
AW: Zellwert bedingt, Bereich kopieren
15.06.2020 18:46:53
Schlandro
Hallo Werner und Ralf,
vielen Dank für eure Antworten
@Ralf: die Anpassung damit die Zeilen mit Status "Approved" oder ohne Status nicht kopiert werden, hat nicht korrekt geklappt. Die Zeilen mit "Approved" wurden weiterhin kopiert und übernommen.
Außerdem funktioniert der restliche Code einwandfrei bei der Testdatei, jedoch nicht bei der Originaldatei, diese hat knapp 600 Zeilen. Zwar entsprechen etwa 20 Zeilen dem Kriterium, jedoch werden nur 4 kopiert. Die Ursache verstehe ich jedoch nicht.
Danke für eure mühe und beste Grüße
AW: Zellwert bedingt, Bereich kopieren
15.06.2020 20:00:31
ralf_b
ich habe die Approved und leer abfrage umgesetzt.
warum nicht alle 20 kopiert werden, weis ich nicht. das muß dann an der Abfragelogik liegen.
das ist aber werner sein ding.
     For i = 4 To loLetzte - 1 Step 3
strMitte = .Cells(i, "B")
strOben = .Cells(i, "B").Offset(-1)
strUnten = .Cells(i, "B").Offset(1)
' Verzögert
If strOben = strUnten And strMitte  strOben And strMitte  strUnten Then
If .Range("B" & i)  "Approved" And .Range("B" & i)  "" Then
If raVerzögert Is Nothing Then
Set raVerzögert = .Range("A" & i & ":D" & i)
Else
Set raVerzögert = Union(raVerzögert, .Range("A" & i & ":D" & i))
End If
End If
' Anstehend
ElseIf strMitte = strOben And strOben  strUnten Then
If .Range("B" & i)  "Approved" And .Range("B" & i)  "" Then
If raAnstehend Is Nothing Then
Set raAnstehend = .Range("A" & i + 1 & ":D" & i + 1)
Else
Set raAnstehend = Union(raAnstehend, .Range("A" & i + 1 & ":D" & i + 1))
End If
End If
End If
Next i

Anzeige

301 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige