Makro: Neue Zeilen aus anderen Tabs sofort in ein Übersicht - Tabellenblatt kopieren
Hallo,
leider keine Lösung bisher gefunden:
es gibt eine Excel (2003) Tabelle mit 5 Tabs: "B1", "B2" etc.), in welche 5 Personen Ihre Daten einftragen. Jeder Person ist sozusagen ein Tab zugewiesen.
Die Überschriften sind in jedem Tabellenblatt gleich, so dass der jeweilige Bearbeiter die Namen der verkauften Produkte + Preis etc. in sein Tabellenblatt einträgt.
Schön wäre es, eine Übersicht der ersten 6 Zellen einer Zeile aus allen 5 Tabs in einem neuen Tabellenblatt zu haben. Damit man unabhängig vom Bearbeiter alle verkauften Artikel auf einen Blick hat. Und zwar: sobald eine neue Zeile in irgendeinem anderen Tabellenblatt ausgefüllt wird, sollen die Infos auch ins "Übersicht"-Tabellenblatt kopiert werden. Gibt's dafür eine Lösung mit VBA? Habe leider nur minimale Kenntnisse über Makros.
Vielen vielen Dank!!!
*Threadedit* 23.01.2009, 23:33:01
Admininfo: Führ bitte Threads nicht fort indem du Weitere eröffnest, und vermeide Mehrfachanfragen. Die Datenbank und User werden es dir danken. Siehe FAQ 2, #3.
Antwort schreiben
Antwort 1 von Sunshine.hh vom 22.01.2021, 19:25 Options
Kann mir keiner helfen??
Wenigstens ein Hinweis wo ich eine Antwort bekommen könnte?
Bitte.... :(
Würde es vielleicht genügen, wenn die Teil-Zeilen der 5 Bearbeiter
NEBENEINANDER stünden? Also:
Bearb-1 Bearb2 Bearb5
1 2 3 4 5 6 - - - 1 2 3 4 5 6 . . . . . 1 2 3 4 5 6
(Jede Ziffer steht für eine Spalte -
in Wirklichkeit wäre die Seite also u.U. ziemlich breit)
Antwort 3 von Sunshine.hh vom 22.01.2021, 22:24 Options
Nicht wirklich, denn dann kann ich nicht nach meinen gewünschten kriterien sortieren und z.B. den Besten Kauf o.ä. ermitteln.
Ich denke, es soll möglich sein, neue daten ins neue Tabellenblatt per Makto zu übertragen.
Es wäre auch ok, wenn ALLE Daten bzw. die komplette Zeile kopiert wäre.
Freue mich auf neue Vorschläge!
Antwort 4 von sigiru vom 23.01.2021, 01:18 Options
So wie ich die Aufgabenstellung verstanden habe, sollen die Daten sofort nach der Eingabe einer vollständigen Zeile ins Übersicht-Tabellenblatt kopiert werden - jedoch würden dabei spätere Korrekturen von Tippfehlern in vorhandenen Zeilen unberücksichtigt bleiben.
Wäre es dann nicht sinnvoller, am Ende einer Bearbeitung (oder zu einem beliebigen Zeitpunkt) ein Makro zur Neu-Erstellung der Gesamtliste aufzurufen? D. h. nach der Eingabe passiert nichts automatisch, und erst nach Makro-Aufruf wird die alte Übersicht gelöscht und eine neue erzeugt?
Antwort 5 von Saarbauer vom 23.01.2021, 07:43 Options
Hallo,
müsste grundsätzlich machbar sein, vielleicht auch ohne Makro, da aber der Aufbau der Tabellen nicht eindeutig dargestellt ist, wie wäre es mit einer Beispieldatei
http://www.file-upload.net/einstellen und den Link zur datei hier hinterlegen
Gruß
Helmut
Antwort 6 von nighty vom 23.01.2021, 09:50 Options
hi all :-)
ein beispiel
gruss nighty
angenommen es werden 6 zellen genutzt
nach eingabe in der sechsten zelle erfolgt der uebertrag zur uebersicht
eventuelle anpassung der 6 (waere das F)
eventuelle anpassung des vergebenen namens
Uebersichteinzufuegen
alt+f11/projektexplorer/DeineArbeitsMappe
'ereigniss der arbeitsmappe
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
'abschaltung des genutzten ereignisses
Application.EnableEvents = False
'abfrage auf spalte 6 und AvtiveWorksheet
If Target.Column = 6 And ActiveSheet.Name <> "Uebersicht" Then
'copy der daten zum tabellenblatt uebersicht
ActiveSheet.Range("A" & Target.Row & ":F" & Target.Row).Copy Worksheets("Uebersicht").Range("A" & Worksheets("Uebersicht").Cells(Rows.Count, 1).End(xlUp).Row + 1)
'ende der abfrage auf spalte wie ActiveWorksheet
End If
'einschaltung des genutzten ereignisses
Application.EnableEvents = True
End Sub
Antwort 7 von nighty vom 23.01.2021, 10:14 Options
hi all :-)
oder so :-)
angenommen der sheetname waere der mitarbeitername
dann waere hier noch eine variante die die mitarbeiternamen bzw sheetnamen in der spalte g darstellt
gruss nighty
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Application.EnableEvents = False
If Target.Column = 6 And ActiveSheet.Name <> "Uebersicht" Then
ActiveSheet.Range("A" & Target.Row & ":F" & Target.Row).Copy Worksheets("Uebersicht").Range("A" & Worksheets("Uebersicht").Cells(Rows.Count, 1).End(xlUp).Row + 1)
Worksheets("Uebersicht").Range("G" & Worksheets("Uebersicht").Cells(Rows.Count, 1).End(xlUp).Row) = ActiveSheet.Name
End If
Application.EnableEvents = True
End Sub
wobei ein macro ohne kommentare einfach huebscher aussieht :-))
gruss nighty
Antwort 8 von Sunshine.hh vom 23.01.2021, 23:14 Options
Hallo an alle,
vielen Dank für die Vorschläge!
Ich dachte schon, mir kann keiner helfen...
@siguru
Zitat:
Wäre es dann nicht sinnvoller, am Ende einer Bearbeitung (oder zu einem beliebigen Zeitpunkt) ein Makro zur Neu-Erstellung der Gesamtliste aufzurufen? D. h. nach der Eingabe passiert nichts automatisch, und erst nach Makro-Aufruf wird die alte Übersicht gelöscht und eine neue erzeugt?
Hallo Siguru,
wann die Aktualisierung der Übersicht geschieht ist relativ egal- ob beim Aufmachen der Tabelle oder beim Schleißen. Solange die Chronologie bleibt.
Wie wäre dann der Script?
@ nighty- es hat noch nicht funktioniert, ich probiere weiter. Danke!
Antwort 9 von Sunshine.hh vom 23.01.2021, 23:39 Options
Zitat:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Application.EnableEvents = False
If Target.Column = 6 And ActiveSheet.Name <> "Uebersicht" Then
ActiveSheet.Range("A" & Target.Row & ":F" & Target.Row).Copy Worksheets("Uebersicht").Range("A" & Worksheets("Uebersicht").Cells(Rows.Count, 1).End(xlUp).Row + 1)
Worksheets("Uebersicht").Range("G" & Worksheets("Uebersicht").Cells(Rows.Count, 1).End(xlUp).Row) = ActiveSheet.Name
End If
Application.EnableEvents = True
End Sub
Das scheint grundsätzlich zu funktionieren. jedoch wenn nicht alle Zeilen ausgefüllt werden, bzw. erst später- dann werden die daten nicht in die übersicht kopiert und somit wohl in der übersicht "für immer" vergessen. Hier hat siguru recht.
Ich würde mich auf einen weiteren Lösungsvorschlag freuen!
Antwort 10 von nighty vom 24.01.2021, 07:17 Options
hi Sunshine bzw all :-)
dies war ein beispiel,daher aeussere konkret deine wuensche, das es gegebenenfalls angepasst werden koennte .an variationen gibt es viele :-))
gruss nighty
Antwort 11 von nighty vom 24.01.2021, 09:46 Options
hi all :-)
hier ein weiteres beispiel,mit einer erzwungenen eingabe sowie man die zellenbereiche a bis f befuellt
gruss nighty
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Application.EnableEvents = False
If Target.Column < 7 And ActiveSheet.Name <> "Uebersicht" Then
Dim rgBereich As Range
Dim zaehler As Range
Set rgBereich = ActiveSheet.Range("A" & Target.Row & ",B" & Target.Row & ",C" & Target.Row _
& ",D" & Target.Row & ",E" & Target.Row & ",F" & Target.Row)
For Each zaehler In rgBereich
If zaehler = "" Then
schalter = True
zaehler.Select
Exit For
End If
Next zaehler
If schalter = False Then
ActiveSheet.Range("A" & Target.Row & ":F" & Target.Row).Copy Worksheets("Uebersicht").Range("A" & Worksheets("Uebersicht").Cells(Rows.Count, 1).End(xlUp).Row + 1)
Worksheets("Uebersicht").Range("G" & Worksheets("Uebersicht").Cells(Rows.Count, 1).End(xlUp).Row) = ActiveSheet.Name
End If
End If
Application.EnableEvents = True
End Sub
Antwort 12 von sigiru vom 24.01.2021, 11:09 OptionsLösung
Hallo Sunshine.hh,
nachfolgend ein Beispiel, das zu Beginn die alte Übersicht löscht und dann aus den Tabellenblättern "B1" und "B2" eine neue Übersicht erstellt, die zum Schluß nach Datum sortiert wird. Für mehr als 2 Tabellenblätter muss der Code nur entsprechend kopiert und angepaßt werden.
Ich bin in meinem Beispiel davon ausgegangen, dass die Überschrift aus genau einer Zeile besteht und die Daten überall in Zeile 2 beginnen, sowie dass ein Datum vorhanden ist und dieses in der 1. Spalte steht.
Gruß sigiru
--------------------
Sub uebersicht_erstellen()
Dim Zeilen As Integer ' Anzahl der Zeilen im jeweiligen Blatt
Dim StartZ As Integer ' Start-Zeile im Übersichts-Blatt
' wenn alte Übersicht vorhanden, dann löschen
If Worksheets("Übersicht").Cells(Rows.Count, 1).End(xlUp).Row > 1 Then
Worksheets("Übersicht").Range("a2:f" & Cells(Rows.Count, 1).End(xlUp).Row).ClearContents
End If
StartZ = 2
' B1 kopieren
Zeilen = Worksheets("B1").Cells(Rows.Count, 1).End(xlUp).Row - 1
Worksheets("B1").Range("A2:F" & Zeilen + 1).Copy _
Destination:=Worksheets("Übersicht").Range("A" & StartZ & ":F" & StartZ + Zeilen - 1)
StartZ = StartZ + Zeilen
' B2 kopieren
Zeilen = Worksheets("B2").Cells(Rows.Count, 1).End(xlUp).Row - 1
Worksheets("B2").Range("A2:F" & Zeilen + 1).Copy _
Destination:=Worksheets("Übersicht").Range("A" & StartZ & ":F" & StartZ + Zeilen - 1)
StartZ = StartZ + Zeilen
' sortieren
Worksheets("Übersicht").Range("A2:F" & Cells(Rows.Count, 1).End(xlUp).Row).Sort _
Key1:=Worksheets("Übersicht").Range("A2"), order1:=xlAscending, Header:=xlYes, Orientation:=xlTopToBottom
End Sub
Antwort 13 von nighty vom 24.01.2021, 13:11 Options
hi all :-)
na wird ja auch mal zeit das ideen zum vorschein kommen :-))
@ sigiru
die beiden integer var sollten aber als long deklariert sein :-)
gruss nighty
Antwort 14 von sigiru vom 24.01.2021, 13:35 Options
Hi nighty,
ja, das ist richtig. Wenn die Bearbeiter ganz fleißig Zeilen eingeben, ist man mit long natürlich auf der sicheren Seite :-)
Gruß sigiru
Antwort 15 von Sunshine.hh vom 25.01.2021, 11:53 Options
Hallo nighty und sigiru,
danke für eure Vorschläge!! Beide erfüllen meine Wünsche :)
Ich tendiere jedoch zu der löschen/kopieren Version (sigiru), da gehen dann keine Daten verloren.
Was mir aber noch fehlt, ist die Automatisierung, d.h. das Makro immer beim Speichern der Tabelle zu aktivieren.
Würde mich auf die Antwort freuen!
Antwort 16 von fedjo vom 25.01.2021, 13:07 Options
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Dein Makro
oder Call Makronamme
End Sub