Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1636to1640
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
Ausgewählte Zeile in anderes Blatt kopieren
28.07.2018 17:25:11
Anni
Hallo zusammen,
sorry, dass ich hier einfach so mit quasi "leeren Händen" auftauche. Ich habe mir ein kleines Arbeits-projekt vorgenommen, aber meine (sowieso eher rudimentären) Makro-Programmierungskentnisse sind doch viel zu eingerostet.
Mein Problem ist folgendes:
Ich möchte aus unserer Bestellliste/Rechnungskontrolle heraus eine Historie erstellen. Unsere Rechningskontrolle hat eine Übersicht über alle Produkte, die wir bestellen, Preisentwicklungen, Qualitätsbewertungen usw. Es ist eine recht umfangreiche Tabelle von A bis AM. Spalten F bis AM liefern hierbei alle Informationen zu den Produkten, während wir in Spalte B bis E Bestellinformationen speichern. Wenn jemand also merkt, dass ein Vorrat zur Neige geht, trägt er in Spalte B das Anforderungsdatum ein. C zeigt an, wem das aufgefallen ist, D wie viel bestellt werden soll und E dann schließlich, wann nachbestellt wurde.
Bisher haben wir es immer so verwaltet, dass nach Eingang die Spalten B - E geleert und dann einfach neu sortiert wurde.
Jetzt möchte ich aber aus diversen internen Gründen aus dieser Tabelle eine Bestellhistorie erstellen.
Das stelle ich mir etwa so vor:
In Spalte A wird ein "x" eingetragen, sobald die Bestellung hier eingegangen ist. Danach drückt man einen Button (derzeit etwas unscheinbar positioniert in AN), der das Makro aktiviert. Dieses sucht in Spalte A, ob ein "x" eingetragen ist. Wenn ja, kopiert es die Zeile von A bis AM und fügt sie in ein zweites Tabellenblatt namens "Historie" ein. Danach geht das Makro in das erste Tabellenblatt und löscht den Inhalt der Zeilen A bis E.
Ich habe das Makro durch Ausführen meiner Idee aufgezeichnet (inklusive Umsortierungen, die ich oben nicht erwähnt habe), aber jetzt will es mit der Bedingung ("wenn in Spalte A "x" steht, dann..." usw) nicht ganz klappen. Ich habe jetzt nach viel Internetrecherche einiges ausprobiert, aber nichts davon hat bis jetzt funktioniert. Da ich mich doch zu wenig auskenne und die Fälle nicht 1 zu 1 übertragbar sind. Zumindest nicht die, die ich gefunden habe.
Das ist der Code, den ich bis jetzt habe:

Sub Historie()
' Historie Makro
ActiveSheet.Shapes("CommandButton1").Select
Range("A5:AM5").Select
Selection.Copy
Sheets("Historie").Select
Range("A5").Select
ActiveSheet.Paste
Application.CutCopyMode = False
ActiveWorkbook.Worksheets("Historie").AutoFilter.Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Historie").AutoFilter.Sort.SortFields.Add Key:= _
Range("H1"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
xlSortNormal
With ActiveWorkbook.Worksheets("Historie").AutoFilter.Sort
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Sheets("Eingangskontrolle").Select
Range("A5:E5").Select
Selection.ClearContents
ActiveWorkbook.Worksheets("Eingangskontrolle").AutoFilter.Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Eingangskontrolle").AutoFilter.Sort.SortFields.Add _
Key:=Range("B1"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption _
:=xlSortNormal
With ActiveWorkbook.Worksheets("Eingangskontrolle").AutoFilter.Sort
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
End Sub

Die abgespeckte Beispieldatei findet ihr hier:
https://www.herber.de/bbs/user/122970.xlsm
Lieben Dank im Voraus!

14
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Ausgewählte Zeile in anderes Blatt kopieren
28.07.2018 18:35:12
Rob

Private Sub CommandButton1_Click()
Dim r As Range
For Each r In Intersect(UsedRange, Range("A:A"))
If r = "x" Then
r.EntireRow.Copy Sheets("Historie").Range("A" & Cells(Rows.Count, 1).End(xlUp).Row + 1)
Range(Cells(r.Row, 1), Cells(r.Row, 13)).ClearContents
End If
Next r
End Sub

AW: Ausgewählte Zeile in anderes Blatt kopieren
28.07.2018 18:38:12
Rob
Achtung: Für Spalte A bis E muss es heißen 1 bis 5 nicht 1 bis 13:

Range(Cells(r.Row, 1), Cells(r.Row, 5)).ClearContents

AW: Ausgewählte Zeile in anderes Blatt kopieren
28.07.2018 18:50:45
Rob
Außerdem fällt mir gerade auf, dass nicht alle Zellen in Spalte A gefüllt sind. Deshalb besser eingränzen (z.B. bis Spalte 100), sonst geht das Makro alle Spalte bis 1048576 durch:

For Each r In Intersect(UsedRange, Range("A1:A100"))
Man könnte es auch dynamisch gestalten, wenn Du mir eine Spalte nennst, die auf jeden Fall befüllt ist.
Anzeige
AW: Ausgewählte Zeile in anderes Blatt kopieren
28.07.2018 20:57:42
Rob
Dynamisch würde die Range dann wie folgt aussehen. Ich habe die Spalte 6 zugrundegelegt - Du kannst das dann beliebig anpassen.
PS: in der Zeile für Copy/Paste musst Du noch zusätzlich auf das Worksheet "Historie" verweisen, da das Makro vom Sheet "Eingangskontrolle" ausgeführt wird. Habe ich ursprünglich versäumt anzugeben.

Private Sub CommandButton1_Click()
Dim r As Range
For Each r In Range("A1:A" & Cells(Rows.Count, 6).End(xlUp).Row)
If r = "x" Then
r.EntireRow.Copy Sheets("Historie").Range("A" & Sheets("Historie").Cells(Rows.Count, 1). _
End(xlUp).Row + 1)
Range(Cells(r.Row, 1), Cells(r.Row, 5)).ClearContents
End If
Next r
End Sub

Anzeige
AW: Ausgewählte Zeile in anderes Blatt kopieren
30.07.2018 11:01:30
Anni
Hallo Rob,
vielen lieben Dank für die schnelle und ausführliche Hilfe! Das bringt mich um einiges weiter! :-) Sorry, dass ich mich erst jetzt melden kann.
Ich habe die Änderungen übernommen und nun ist mir folgendes aufgefallen:
1. Das Makro funktioniert soweit super, allerdings nicht über den Button. Wenn ich es über Entwicklertools -> Makros ausführe, tut es im Großen und Ganzen, was es soll. Das einzige Problem dabei ist, dass es jetzt nur die Werte überträgt, die in Zeile 5 stehen. Wahrscheinlich, weil ich das damals als Beispielzeie benutzt habe. Und wenn ich das richtig sehe, steht das ja auch so im Code. Wie kann ich das denn jetzt für alle Zeilen umschreiben? (Einfach nur die "5" rauszunehmen tut es da leider nicht und wenn ich es durch Range(Cells(r.Row, 1), Cells(r.Row, 5)).ClearContents u.ä. ersetze, funktioniert es wieder nicht...
Im Moment sieht der komplette Code mit deinen Vorschlägen so aus. Aber ich habe da bestimmt Sachen falsch eingefügt. bzw inkorrekt ersetzt.
Private Sub CommandButton1_Click()
Dim r As Range
For Each r In Range("A1:A" & Cells(Rows.Count, 6).End(xlUp).Row)
If r = "x" Then
r.EntireRow.Copy Sheets("Historie").Range("A" & Sheets("Historie").Cells(Rows.Count, 1). _
_
End(xlUp).Row + 1)
Range(Cells(r.Row, 1), Cells(r.Row, 5)).ClearContents
End If
End Sub
Next r
Sub Historie()
ActiveSheet.Shapes("CommandButton1").Select
Range("A5:AM5").Select
Selection.Copy
Sheets("Historie").Select
Range("A5").Select
ActiveSheet.Paste
Application.CutCopyMode = False
ActiveWorkbook.Worksheets("Historie").AutoFilter.Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Historie").AutoFilter.Sort.SortFields.Add Key:= _
Range("H1"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
xlSortNormal
With ActiveWorkbook.Worksheets("Historie").AutoFilter.Sort
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Sheets("Eingangskontrolle").Select
Range("A5:E5").Select
Selection.ClearContents
ActiveWorkbook.Worksheets("Eingangskontrolle").AutoFilter.Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Eingangskontrolle").AutoFilter.Sort.SortFields.Add _
Key:=Range("B1"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption _
:=xlSortNormal
With ActiveWorkbook.Worksheets("Eingangskontrolle").AutoFilter.Sort
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
End Sub
2. Zu deiner Frage wegen der gefüllten Spalten: Grundsätzlich immer befüllt sein müssen die Spalten F, G, X, AB und AC. Bei den anderen Spalten kann es passieren, dass keine Daten vorliegen. Oder was genau meintest du?
3. Bei deiner Frage ist mir allerdings noch eine Sache aufgefallen, bzw. überhaupt erst in den Sinn gekommen. :) Falls das mehr oder weniger problemlos machbar ist, wäre es noch gut, wenn zusätzliche Bedingungen für den Übertrag gegeben wären. Es macht nämlich wenig Sinn, die bestellten und erhaltenen Artikel in die Historie einzutragen (bzw. eintragen zu lassen), wenn die Spalten B, D und E nicht befüllt sind. Ließe sich das noch mit einbauen oder wird das zu kompliziert? Evtl. auch mit Fehlermeldung, falls man übertragen will und die Spalten aber leer sind.
Anzeige
AW: Ausgewählte Zeile in anderes Blatt kopieren
30.07.2018 18:05:07
Rob
Hallo Anni,
zu 1: Du musst die For-each Schleife mit Next r weiterführen und anschließen das Makro mit End Sub beenden. In Deinem Code ist es verkehrt herum - End Sub steht vor Next r.
zu 2: Wenn Spalte F permanent befüllt ist, passt der Code -> Spalte F steht für 6:
For Each r In Range("A1:A" & Cells(Rows.Count, 6).End(xlUp).Row)
zu 3: Das ist kein Problem. Du musst die If Then-Bedingung wie folgt ergänzen:

Sub Historie2()
Dim r As Range
For Each r In Range("A2:A" & Cells(Rows.Count, 6).End(xlUp).Row)
If r = "x" Then
If r.Offset(0, 1)  "" Or r.Offset(0, 3)  "" Or r.Offset(0, 4)  "" Then
r.EntireRow.Copy Sheets("Historie").Range("A" & Sheets("Historie").Cells(Rows.Count, _
1).End(xlUp).Row + 1)
Range(Cells(r.Row, 1), Cells(r.Row, 5)).ClearContents
End If
End If
If r = "x" Then
If r.Offset(0, 1) = "" Or r.Offset(0, 3) = "" Or r.Offset(0, 4) = "" Then
MsgBox "Kein Übertrag in die Bestell-Historie für Zeile " & r.EntireRow.Address & _
", da fehlende Einträge in Spalte B, D und E!", vbInformation
End If
End If
Next r
End Sub
Damit Du auch den Command-Button nutzen kannst, benenne da Makro anders, um es dann dem Button zuweisen zu können (rechts-klick/Makro zuweisen). Anschließend kannst Du es wieder auf "Private" setzen.
Anzeige
AW: Ausgewählte Zeile in anderes Blatt kopieren
31.07.2018 09:24:25
Anni
Hallo Rob,
und wieder was gelernt. :-)
Vielen Dank! Ich habe meine Fehler ausgebessert und jetzt funktioniert das über den Button einwandfrei! Nur bei der If Then Bedingung habe ich die "Or"s gegen "And"s ausgetauscht. War überhaupt kein Problem!
Jetzt habe ich noch eine Sache und dann hast du (vorerst) deine Ruhe vor mir. Ich habe das Makro jetzt mehrmals durchlaufen lassen und dabei ist mir aufgefallen, dass die Sort Befehle leider nicht funktionieren. Da habe ich am Anfang nicht drauf geachtet oder immer ähnliche Daten übertragen, sodass das nicht so aufgefallen ist.
Ich habe auch ein bisschen mit dem Code rumgespielt, aber irgendwie funktioniert das immer noch nicht. Jedenfalls sollen die Tabelle nach dem Übertrag wie folgt sortiert werden:
Das Blatt "Historie" soll erst nach Spalte F, dann nach H und dann nach E sortiert werden. Das Blatt "Eingangskontrolle" soll erst nach Spalte B, dann nach F, dann nach G und dann nach H sortiert werden.
Wenn ich das über den VBA Recorder mache, wirft mir Excel folgenden Code raus:
    Rows("2:16").Select
ActiveWorkbook.Worksheets("Historie").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Historie").Sort.SortFields.Add Key:=Range("F2:F16" _
), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
ActiveWorkbook.Worksheets("Historie").Sort.SortFields.Add Key:=Range("H2:H16" _
), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
ActiveWorkbook.Worksheets("Historie").Sort.SortFields.Add Key:=Range("E2:E16" _
), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("Historie").Sort
.SetRange Range("A2:AM16")
.Header = xlGuess
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
Das hatte ich damals im Originalcode so ähnlich gemacht. Und jetzt war ich leichtgläubig der Meinung, dass ich das einfach so in den Original-Code kopieren kann. Aber natürlich weit gefehlt. :-) Als eigenständiges Makro funktioniert es so wie es soll. Ich hab auch versucht, ein neues Sub zu machen, aber auch da scheint mir irgendein Befehl zu fehlen.
Anzeige
AW: Ausgewählte Zeile in anderes Blatt kopieren
31.07.2018 18:56:49
Rob
Hi Anni,
mach aus Range("F2:F16") einfach Range("F1") wie folgt und für den .Header=xlYes. Das sollte dann dynamisch funktionieren. Kopiere mal den nachfolgenden Code in Dein Makro:

ActiveWorkbook.Worksheets("Historie").AutoFilter.Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Historie").AutoFilter.Sort.SortFields.Add Key:= _
Range("F1"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
xlSortNormal
With ActiveWorkbook.Worksheets("Historie").AutoFilter.Sort
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
ActiveWorkbook.Worksheets("Historie").AutoFilter.Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Historie").AutoFilter.Sort.SortFields.Add Key:= _
Range("H1"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
xlSortNormal
With ActiveWorkbook.Worksheets("Historie").AutoFilter.Sort
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
ActiveWorkbook.Worksheets("Historie").AutoFilter.Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Historie").AutoFilter.Sort.SortFields.Add Key:= _
Range("E1"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
xlSortNormal
With ActiveWorkbook.Worksheets("Historie").AutoFilter.Sort
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With

Anzeige
AW: Ausgewählte Zeile in anderes Blatt kopieren
31.07.2018 20:07:36
Rob
Bzw. geht der Code auch kürzer. Noch immer einfach F1, H1, E1 auswählen und für SetRange auf die CurrentRegion verweisen.

ActiveWorkbook.Worksheets("Historie").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Historie").Sort.SortFields.Add Key:=Range("F1, H1, E1") _
, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("Historie").Sort
.SetRange Range("A1").CurrentRegion
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With

AW: Ausgewählte Zeile in anderes Blatt kopieren
31.07.2018 20:17:17
daniel
Hi
der Recorder zeichnet das Sortieren nur unvollständig auf und vergisst vor den beiden Ranges die Tabellenblattangabe.
Ohne diese Angabe läuft der Code nur im aktiven Tabellenblatt.
Will man ein nicht aktives Blatt sortieren, muss man den Code ergänzen:
ActiveWorkbook.Worksheets("Historie").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Historie").Sort.SortFields.Add Key:=Worksheets("Historie"). _
Range("F1, H1, E1") _
, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("Historie").Sort
.SetRange Worksheets("Historie").Range("A1").CurrentRegion
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Gruß Daniel
Anzeige
AW: Ausgewählte Zeile in anderes Blatt kopieren
31.07.2018 20:24:45
Rob
Hi Daniel,
danke für den Hinweis!
LG
AW: Ausgewählte Zeile in anderes Blatt kopieren
01.08.2018 13:48:53
Anni
Lieber Rob, lieber Daniel,
kann euch gar nicht genug für die Hilfe und die Erklärungen danken!
Jetzt aber doch (leider) noch eine Sache und dann ist sicher erstmal Ruhe...
Die Sortierung der Historie klappt wunderbar. In meinem (nicht mehr ganz so) jugendlichen Leichtsinn dachte ich, die Sortierung der Eingangskontrolle hinzuzufügen bekomme ich schon locker hin. Aber die Verknüpung will da anscheinend nicht so ganz. Ich habe nun schon verschiedene Konstellationen ausprobiert, aber nichts will so recht klappen. Zur Zeit habe ich diesen Code hier, da ich dachte, es könnte klappen, wenn ich das Tabellenblatt gezielt aktiviere.
Sub Historie2()
Dim r As Range
For Each r In Range("A2:A" & Cells(Rows.Count, 6).End(xlUp).Row)
If r = "x" Then
If r.Offset(0, 1)  "" And r.Offset(0, 3)  "" And r.Offset(0, 4)  "" Then
r.EntireRow.Copy Sheets("Historie").Range("A" & Sheets("Historie").Cells(Rows.Count, _
_
1).End(xlUp).Row + 1)
Range(Cells(r.Row, 1), Cells(r.Row, 5)).ClearContents
End If
End If
If r = "x" Then
If r.Offset(0, 1) = "" Or r.Offset(0, 3) = "" Or r.Offset(0, 4) = "" Then
MsgBox "Kein Übertrag in die Bestell-Historie für Zeile " & r.EntireRow.Address & _
" möglich, da Spalte B, D oder E leer! Spalten füllen und Button erneut drücken!",  _
vbInformation
End If
End If
ActiveWorkbook.Worksheets("Historie").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Historie").Sort.SortFields.Add Key:=Range("F1, H1, E1") _
, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("Historie").Sort
.SetRange Range("A1").CurrentRegion
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Worksheets("Eingangskontrolle").Activate
ActiveWorkbook.Worksheets("Eingangskontrolle").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Eingangskontrolle").Sort.SortFields.Add Key:=Range("B1, F1, G1, _
H1") _
, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("Eingangskontrolle").Sort
.SetRange Range("A1").CurrentRegion
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Next r
End Sub
Aber auch da funktioniert wieder nur die Sortierung der Historie.
Anzeige
AW: Ausgewählte Zeile in anderes Blatt kopieren
01.08.2018 19:35:00
Rob
Hi Anni,
das ist wirklich komisch. Es müsste eigentlich genauso funktionieren, wie Du es für das Worksheets "Eingangskontrolle" umgeschrieben hast. Leider habe ich gerade keine Zeit mir das näher anzuschauen (neuer Job und 2 Kleinkinder). Mach doch einfach ein neues Topic hierzu im Forum auf.
LG
AW: Ausgewählte Zeile in anderes Blatt kopieren
03.08.2018 09:50:41
Anni
Hi Rob,
mmh, das ist seltsam.
Aber ist kein Problem, dann mache ich einen neuen Thread auf. Lieben Dank und viel Erfolg im neuen Job und hoffentlich nicht zu viel Stress mit den Kindern. :)
LG Anni

204 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige