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

Tabellenautomatisierung - Tabellen kopieren

Tabellenautomatisierung - Tabellen kopieren
21.05.2018 23:14:58
Felix
Hallo Excel Community,
Ich habe gerade ein Problem bei Excel VBA, bei dem ich nicht weiter weiß und wende mich nun an euch!
In der Arbeitsmappe befinden sich 7 Blätter. Auf dem ersten Blatt befindet sich eine Gesamttabelle in dem alle Einträge sortierbar in Tabellen eingetragen sind und in den anderen 6 befinden sich die jeweiligen Unterkategorien in Tabellen. Alle 7 Tabellen haben die selben 8 Spalten.
Diese Einträge werden bearbeitet und es kommen immer neue hinzu, nun sollen diese Einträge auf der Gesamttabelle immer aktuell gehalten werden. Heißt, wenn ich eine Änderung oder einen neuen Eintrag vornehme, soll dieser Eintrag auch in der Gesamttabelle aktualisiert werden. Bearbeitet werden die Tabellen nur in den Unterkategorien.
Mein Grundgedanke bei der Programmierung war es bei "Aktualisierung" das jeweilige aktive Blatt mit dem Tabellen Inhalt ans Ende der Gesamttabelle auf Blatt 1 zu kopieren und dann "Dublikate Entfernen", die in den Spalten Titel und Link übereinstimmen.
Problem an dieser Herangehensweise ist, das ich bei "Dublikate entfernen" nicht kontrollieren kann, ob wirklich die ältere Variante entfernt wird, falls ein Eintrag nur geändert wird und nicht neu dazu kommt. Hier könnte man davor vielleicht eine Sortierung nach Titel schieben, welche den Eintrag mit mehr ausgefüllten Spalten oben erscheinen lässt und den unteren "älteren" mit weniger Einträgen löscht.
Hab ich nun zahlreich in vielen Varianten probiert, keine erfolgreich.
Wichtig ist halt, dass die Struktur der Tabelle vorne erhalten bleibt.
Eine Alternative wäre, falls es mit bei Aktualisierung nicht klappt einen per Button auslösbares Makro zu erstellen.
Ich habe auch schon drüber nachgedacht, alle Einträge zu verknüpfen, aber dies geht irgendwie nicht, da man nicht mehrere Verknüpfungen aus verschiedenen Tabellen in einer Tabellenspalte haben kann.
Anbei meine Probiertabelle, beim Öffnen sollte sich ein Eingabeformular öffnen, dass einfach wegklicken.
Hat jemand eine Idee/Lösung?
Ich bin am verzweifeln!
https://www.herber.de/bbs/user/121727.xlsm

6
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Tabellenautomatisierung - Tabellen kopieren
22.05.2018 00:17:05
Barbaraa
Du könntest händisch folgendes machen:
1. Erst die Reihenfolge der Überschriften aller Blätter gleich machen, um sie für den nächsten Schritt vorzubereiten.
2. Dann die Blattinhalte der Unterblätter in das Hauptblatt kopieren.
3. Dann das Hauptblatt spaltenweise nach Link alphabetisch sortieren, dann nach Titel sortieren.
Dubletten sollten nun untereinander stehen.
4a. Dann händisch nach Dublikaten suchen.
4b. Oder mit einer Formel in einer neuen Spalte:
=WENN(UND(F38=F37;G37=G38);"Doublette";"")
Spalten anpassen.
Dann diese Formel in alle relevanten Zeilen dieser Spalte kopieren.
Jede Dublikatzeile hat als Formelergebnis "Dublikat".
Wenn das nicht hilft, dann bitte warum?
Zu folgendem Satz von Dir habe ich eine Frage:
"und dann "Dublikate Entfernen", die in den Spalten Titel und Link übereinstimmen. "
So sind zB Blatt "Forschen", Zeile 2 und 5 gleich.
Welcher Eintrag soll in die Haupttabelle kommen, wenn zwei gleiche Einträge in den Unterkategorien gefunden werden?
LGB
Anzeige
AW: Tabellenautomatisierung - Tabellen kopieren
22.05.2018 08:50:16
Peter(silie)
Hallo,
generiere eine Spalte für IDs.
Füge in jede Tabelle noch eine Spalte fürs Referenzdatum ein.
Dann kannst du nach ID Suchen und dann noch das Datum prüfen.
Verwende ein Dictionary für ID + Datum
Dabei ist ID gleich Key und Datum gleich Value eines Dictionary Eintrags.
Dictionary MSDN:
https://msdn.microsoft.com/de-de/vba/language-reference-vba/articles/dictionary-object
Dann kannst du ganz leicht immer nach der ID suchen und dann das Datum abgleichen.
Wenn die ID nicht existiert, dann als neuen Datensatz einfügen.
Falls ID + Datum übereinstimmen, dann Datensatz Updaten oder was auch immer.
Anzeige
AW: Tabellenautomatisierung - Tabellen kopieren
22.05.2018 10:51:15
Felix
Hey,
Danke für die Antworten!
Wie es händisch geht, weiß ich. Aber meine Kollegen nicht, diese brauchen eine volle Automation.
Ich dachte an sowas wie das hier:
Sub zusammenfassen()
Dim Zeile&, letzteZ&
'Auswertungsblatt einfügen
Worksheets.Add.Name = "GesamteTabelle"
ActiveSheet.Move Before:=Worksheets(1)
'Von Blatt 1 bis Blatt 10 zusammenfassen
For i = 2 To 11
With Worksheets(i)
letzteZ = .Cells(Rows.Count, 1).End(xlUp).Row
Zeile = Worksheets("GesamteTabelle").Cells(Rows.Count, 1).End(xlUp).Row + 1
.Range("A2:L" & letzteZ).Copy Worksheets("GesamteTabelle").Range("A" & Zeile)
End With
Next
End Sub
Bloß das am Anfang nicht ein neues Blatt eingefügt wird, sondern in das bestehende eingetragen wird.
Anzeige
AW: Tabellenautomatisierung - Tabellen kopieren
22.05.2018 13:44:20
Peter(silie)
Hallo,
dein Code erreicht doch nichts von dem was du eigentlich wolltest?
Hier deine Mappe mit IDs: https://www.herber.de/bbs/user/121745.xlsm
Schau dir den Code an im Modul: WasAuchImmer
Und durchlaufen ihn mit dem debugger schritt für schritt.
Der Code ist kommentiert.
Wenn du fragen hast, kannst du die gerne stellen.
Den Code musst du auf dich anpassen.
Ich tue das nicht für dich.
Ich zeige dir nur, wie man bestimmte Sachen in VBA erreichen kann,
alles weitere musst du selber rausfinden.
Hier nur Code:
Option Private Module
Option Explicit
'// Mit einem Type kann man selbst ein
'// ein Datenmodell darstellen.
'// Den Type DATASET kannst du auf dich anpassen
'// Du könntest auch für jedes Blatt einen eigenen Typen erstellen
'// Also: Private Type AKTUELLES, Private Type LESEN usw.
'// Dadurch kannst du ganz genau festlegen welche daten da rein kommen sollen!
Private Type DATASET
ID          As String   'Datensatz ID
TimeStamp   As String   'Zeitstempel der letzten Bearbeitung
Category    As String   'Unterkategorie
Reviser     As String   'Bearbeiter
DateOfBegin As Date     'Datum (Anfang)
DateOfEnd   As Date     'Datum (Ende)
Title       As String   'Titel
Link        As String   'Link
Others      As String   'Sonstiges
End Type
'// Diesen Sub kannst du aufrufen da er nicht Private ist
'// Durch "Option Private Module" kannst du diesen Sub allerdings
'// nicht durch ALT+F8 aus Excel heraus starten, du musst ihn aus
'// einem anderen Modul oder Userform heraus aufrufen.
'// Entferne Option Private Module, wenn du die Sachen auch aus
'// Excel heraus aufrufen willst.
Public Sub ValidateData()
Dim d As Object     'Dictionary Object
Dim v As Variant    'Für Schleife
Dim ab As DATASET   'Datensatz Variable (Unser eigener Datentyp)
'// Rufe Funktion auf zum holen der IDs im Tabellenblatt "Aktuelles"
Set d = GetIDs(ThisWorkbook.Sheets("Aktuelles"))
On Error Resume Next
'Für jeden Key im Dictionary
For Each v In d.Keys
'// Hole die Daten aus "Gesamte Tabelle"
'// Hole die Daten wo die ID gleich die gesuchte ID
'// Zeige die Ergebnisse im Direktbereich an
ab = GetDataset(ThisWorkbook.Sheets("Gesamte Tabelle"), v, d(v))
Debug.Print "==================================="
Debug.Print "Datensatz: " & ab.ID
Debug.Print "==================================="
Debug.Print "Timestamp: " & ab.TimeStamp
Debug.Print "Category: " & ab.Category
Debug.Print "Reviser: " & ab.Reviser
Debug.Print "Date Of Begin: " & ab.DateOfBegin
Debug.Print "Date Of End: " & ab.DateOfEnd
Debug.Print "Title: " & ab.Title
Debug.Print "Link: " & ab.Link
Debug.Print "Others: " & ab.Others
Debug.Print "==================================="
Debug.Print
'// Setze den Datensatz zurück
ResetDataset ab
Next v
End Sub
'// Speichert alle IDs und Ihre Zeitstempel in einem
'// Dictionary Objekt ab
'// Ein Dictionary hat nur eindeutige Werte.
'// Diese werden Key genannt.
'// Ein Dictionary Key hat ein Value also einen Wert
'// Dieser ist nicht eindeutig
Private Function GetIDs(ByRef shTable As Worksheet) As Object
Dim rowData As Variant  'Array mit IDs + Zeitstempel
Dim dict    As Object   'Dictionary Object
Dim lRow    As Long     'Letzte Zeile
Dim i       As Long     'iterator
'// wenn die übergebene Tabelle nichts ist dann verlasse die Funktion
If shTable Is Nothing Then Exit Function
'// erstelle ein Dictionary Object durch Latebinding
Set dict = CreateObject("Scripting.Dictionary")
With shTable
'// finde Letzte Zeile in Spalte A
lRow = .Cells(.Rows.Count, 1).End(xlUp).Row
If lRow = 1 Then Exit Function
'// erstelle Array mit Werten (Arrays sind schneller als Ranges)
rowData = .Range(.Cells(2, 1), .Cells(lRow, 2)).Value
'// Gehe durch alle Werte des Arrays
For i = LBound(rowData, 1) To UBound(rowData, 1)
'// Füge die IDs + Zeitstempel hinzu
'// Dictionary(key) = Value
'// key = ID    Value = Timestamp
dict(rowData(i, 1)) = rowData(i, 2)
Next i
End With
'// Übergebe das Dictionary Object an die Funktion
Set GetIDs = dict
End Function
'// Holt sich die Datensatz Daten per ID aus einer Vorgegeben Tabelle (LookUpTable)
'// Gibt unseren Benutzerdefinierten Typen DATASET zurück
Private Function GetDataset(ByRef LookUpTable, _
ByVal ID As String, _
ByVal TimeStamp As Variant) As DATASET
Dim vData   As Variant  'Speichtert alle Daten einer Zeile
Dim IdTable As Variant  'Speichert alle Daten der Spalte A
Dim lRow    As Long     'Letzte Zeile
Dim i       As Long     'iterator
'// Falls die Tabelle nichts ist dann verlasse die Funktion
If LookUpTable Is Nothing Then Exit Function
With LookUpTable
'// Letzte Zeile
lRow = .Cells(.Rows.Count, 1).End(xlUp).Row
'// Array mit allen Daten
vData = .Range(.Cells(1, 1), .Cells(lRow, 10)).Value
'// Array mit IDs
IdTable = .Range(.Cells(1, 1), .Cells(lRow, 1)).Value2
'// Finde die gesuchte ID
lRow = FindID(IdTable, ID)
If lRow > 1 Then
'// Falls die ID gefunden wurde dann
'// Füge alle Werte in unseren eigenen Daten Typen ein
GetDataset.ID = ID
GetDataset.TimeStamp = vData(lRow, 2)
GetDataset.Category = vData(lRow, 3)
GetDataset.Reviser = vData(lRow, 5)
GetDataset.DateOfBegin = vData(lRow, 6)
GetDataset.DateOfEnd = vData(lRow, 7)
GetDataset.Title = vData(lRow, 8)
GetDataset.Link = vData(lRow, 9)
GetDataset.Others = vData(lRow, 10)
End If
End With
End Function
'// Sucht nach einer ID innerhalb eines Arrays oder einer Range (NUR IN EINER SPALTE)
Private Function FindID(ByRef Source As Variant, ByVal Find As Variant) As Long
If Not VBA.IsError(Application.Match(Find, Source, 0)) Then
FindID = Application.Match(Find, Source, 0)
End If
End Function
'// Setzt eine Variable unseres Benutzerdefinierten Typen zurück
Private Sub ResetDataset(ByRef ds As DATASET)
Dim tmp As DATASET
ds = tmp
End Sub

Anzeige
AW: Tabellenautomatisierung - Tabellen kopieren
22.05.2018 14:59:21
Felix
Hey,
Wow, Danke für die Antwort.
Ehrlich gesagt übersteigt das mein Verständnis um Längen, aber ich probiere es!
Nur für mein Verständnis:
Ich erstelle Type DATASET einen Datensatz, der die darunter deklarierten Daten enthält.
Heißt, das mache ich für Aktuelles, LEsen, Hören,Sehen, Forschen und Lernen.
Also schreibe ich 6x diesen Code mit den unterschiedlichen Namen.
puh.. und da hörts auch schon auf. Ich probiere es weiter.
AW: Tabellenautomatisierung - Tabellen kopieren
22.05.2018 16:01:32
Peter(silie)
Hallo,
nein das musst du nicht.
DATASET kannst du auch für alle Tabellen verwenden!
Um jede Tabelle zu verarbeiten, müsstest du den Code so anpassen:
'// Diesen Sub kannst du aufrufen da er nicht Private ist
'// Durch "Option Private Module" kannst du diesen Sub allerdings
'// nicht durch ALT+F8 aus Excel heraus starten, du musst ihn aus
'// einem anderen Modul oder Userform heraus aufrufen.
'// Entferne Option Private Module, wenn du die Sachen auch aus
'// Excel heraus aufrufen willst.
Public Sub ValidateData()
Dim d As Object     'Dictionary Object
Dim v As Variant    'Für Schleife
Dim ab As DATASET   'Datensatz Variable (Unser eigener Datentyp)
    Dim ws As Worksheet
For Each ws In ThisWorkbook.Sheets
If ws.Name  "Gesamte Tabelle" Then
'// Rufe Funktion auf zum holen der IDs im Tabellenblatt "Aktuelles"
Set d = GetIDs(ws)
On Error Resume Next
'Für jeden Key im Dictionary
For Each v In d.Keys
'// Hole die Daten aus "Gesamte Tabelle"
'// Hole die Daten wo die ID gleich die gesuchte ID
'// Zeige die Ergebnisse im Direktbereich an
ab = GetDataset(ThisWorkbook.Sheets("Gesamte Tabelle"), v, d(v))
Debug.Print "==================================="
Debug.Print "Datensatz: " & ab.ID
Debug.Print "==================================="
Debug.Print "Timestamp: " & ab.TimeStamp
Debug.Print "Category: " & ab.Category
Debug.Print "Reviser: " & ab.Reviser
Debug.Print "Date Of Begin: " & ab.DateOfBegin
Debug.Print "Date Of End: " & ab.DateOfEnd
Debug.Print "Title: " & ab.Title
Debug.Print "Link: " & ab.Link
Debug.Print "Others: " & ab.Others
Debug.Print "==================================="
Debug.Print
'// Setze den Datensatz zurück
ResetDataset ab
Next v
    Next ws
End Sub

Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige