Unterschiedliche Matrizen aus verschiedenen Tabs untereinander anordnen
#1
Question 
Servus,
folgendes Problem:
Ich habe eine Arbeitsmappe mit (sagen wir hier für das Beispiel) 8 Tabellenblätter (tabs).
Diese tabs beinhalten jeder eine Matrix von x mal 10 Feldern. Also die Spaltenanzahl ist immer gleich und die Zeilenanzahl variiert für alle 8 tabs.
Die Zeilenanzahl basiert auf importierten Daten, so dass diese sich auch (nach jedem Import) wieder ändern werden/können.

Mein Ziel ist es jetzt alle Matrizen in einem neuem tab untereinander automatisch anordnen zu lassen. Das heißt, dass alle 8 Matrizen aus den tabs zu einer "großen" Matrix zusammengeführt werden.
--> Was aber wichtig ist, dass bei Änderungen der einzelnen Matrizen sich auch die "große" Matrix anpasst.
Es sollen also keine "frei"-Zeilen zwischen den einzeln zusammengefügten Matrizen entstehen oder Daten aus anderen Matrizen überschrieben werden, wenn ich einen neuen Import für einzelne tabs mache.

Ich habe noch eine Beispiel Excelmappe angelegt, in der man grob sehen kann was ich meine, falls ich mich nicht deutlich genug ausgedrückt habe.

Ich bin mir ehrlich gesagt nicht sicher, ob ich nur auf dem "Schlauch" stehe oder ob es überhaupt möglich in Excel ist.
Falls es nach Ihrer/Eurer Meinung nach nicht möglich ist, schreibt einfach "Nein" oder ähnliches als Kommentar rein.

Ich bin für jede Hilfe dankbar.
Gruß

Matthias


Angehängte Dateien
.xlsx   Beispiel Excelmappe Verbindung von Matrizen.xlsx (Größe: 15,27 KB / Downloads: 5)
Top
#2
Hallo Matthias

Das geht z.B. mit Power Query.
Voraussetzung ist allerdings dass die Listen als Tabellen formatiert werden.
Voraussetzung für Tabellen ist allerdings dass es Überschriften gibt.

Da du die Listen importierst wäre es vielleicht sogar besser den Import über Power Query laufen zu lassen und dann nur noch das Ergebnis in der Mappe anzuzeigen.
Wir sehen uns!
... Detlef

Meine Beiträge können Ironie oder Sarkasmus enthalten.

Top
#3
Hallo,

habe gerade schon eine ähnliche Aufgabe gelöst, und da ich schon mal dran bin hier eine Lösung mit VBA

Folgenden Code ins Code Modul der Tabelle einfügen, in der die Zusammenfassung gemacht wird:


Code:
Private Sub Worksheet_Activate()
   Dim i As Long, lngz As Long
   ActiveSheet.Cells.ClearContents
   lngz = 1
   Application.ScreenUpdating = False
   For i = 1 To Sheets.Count
       If Sheets(i).Name <> ActiveSheet.Name Then
           Sheets(i).Range("A1").CurrentRegion.Copy ActiveSheet.Range("A" & lngz)
           lngz = lngz + Sheets(i).Range("A1").CurrentRegion.Rows.Count
       End If
   Next i
   Application.ScreenUpdating = True
End Sub

Deine Mappe mit Makros abspeichern (.xlsm Format) und beim aktivieren der Tabelle werden die Daten jedesmal neu eingelesen
Gruß Atilla
Top
#4
Hallo Matthias,

mal drei Fragen.
1. Erkennt man an irgend etwas die Zugehörigkeit zu einer Matrix?
2. Ändert jemand auf dem Zusammenfassungsblatt die Anzahl der zu einer Matrix gehörenden Zeilen, z.B. durch Hinzufügen von Zeilen?
3. Wie geschieht das mit dem Import bzw. soll die Zusammenfassug dann sofort und automatisch aktualisiert werden oder manuell?

Bei Atillas Ansatz werden bei Import einer Matrix und dem Blattwechsel auf die Zusammenfassung alle Daten neu geschrieben, Du wolltest aber nur die importierte Matrix übernehmen. Ich würde das so lösen:

Wenn die Antwort auf 1. ja ist, dann Bereich feststellen, die erste Zeile des Bereichs merken, Daten des Bereichs löschen, importierte Daten an dieser Stelle einfügen.

Wenn die Antwort auf 1. nein und 2. nein ist, dann beim Einfügen der Daten einen Bereichsnamen für den entsprechenden Datenbereich vergeben, bei Änderung die erste Zeile des Bereichs merken, Daten des Bereichs löschen, importierte Daten an dieser Stelle einfügen und wieder Bereichsnamen vergeben

Wenn derzeit die Antwort auf 1. nein und 2. ja ist, gibt es ein Problem. Wenn ich mit Bereichsnamen arbeite und Du fügst unter dem Bereich eine neue Zeile ein, Ändert sich der definierte Bereich nicht. Dann müsstest Du Dir was einfallen lassen, wie Du den Bereich kenntlich machst. Man könnte z.B. eine weitere Spalte nutzen und dort eine Bereichsnummer eingeben. Per Makro beim Übertragen automatisch und bei manueller Erweiterung dann eben von Hand.
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
Top
#5
Servus,
erst einmal vielen Dank für die vielen Antworten.

Von shift-del:
Zitat:Das geht z.B. mit Power Query.
Voraussetzung ist allerdings dass die Listen als Tabellen formatiert werden.
Voraussetzung für Tabellen ist allerdings dass es Überschriften gibt.

Da du die Listen importierst wäre es vielleicht sogar besser den Import über Power Query laufen zu lassen und dann nur noch das Ergebnis in der Mappe anzuzeigen.

Ich bin leider noch ein ziemlicher Anfänger was Excel und alles drumrum angeht. Daher kenne ich Power Query nicht. Kennst du dafür ein gutes Tutorial?
Wenn das alles mit Power Query geht, würde ich es auch damit machen, wenn ich wüsste wie es geht ;)


Von atilla:
Zitat:habe gerade schon eine ähnliche Aufgabe gelöst, und da ich schon mal dran bin hier eine Lösung mit VBA
Folgenden Code ins Code Modul der Tabelle einfügen, in der die Zusammenfassung gemacht wird:

Deine Mappe mit Makros abspeichern (.xlsm Format) und beim aktivieren der Tabelle werden die Daten jedesmal neu eingelesen

Ähnlich wie bei shift-del habe ich leider noch keine Erfahrungen mit VBA und Makros. Ich habe bei meiner Recherche mir bereits das ein oder andere dazu angesehen/gelesen aber beherschen tu ich dieses Thema noch nicht. Kennst du ein gutes Tutorial dazu? Auch weiß ich nicht was mit "Code Modul der Tabelle" gemeint ist.

Von schauan:
Zitat:1. Erkennt man an irgend etwas die Zugehörigkeit zu einer Matrix?
Die Frage verstehe ich nicht ganz. Falls du eine eindeutigen Unterschied der einzufügenden Matrizen meinst, dann ja. In Spalte 9 steht immer unterschiedliches. Also von Matrix zu Matrix unterschiedlich. Aber innerhalb einer Matrix enthält Spalte 9 immer das exakt gleiche.

Zitat:2. Ändert jemand auf dem Zusammenfassungsblatt die Anzahl der zu einer Matrix gehörenden Zeilen, z.B. durch Hinzufügen von Zeilen?
Auf dem "Zusammenfassungsblatt" wird nichts direkt geändert. Die Matrix die hier gebaut wird, wird maximal kopiert. Das einzige was die Anzahl der Zeilen einer eingefügten Matrix ändert, ist ein neuer Import von Daten.

Zitat:3. Wie geschieht das mit dem Import bzw. soll die Zusammenfassug dann sofort und automatisch aktualisiert werden oder manuell?

Also zum Import: (Ich weiß, dass das nicht perfekt gelöst ist, aber in der Eile der einzige Weg der mir eingefallen ist)
Ein automatischer Import ist mir nicht gelungen. Also muss man hier eine Matrix (Kommt aus einer anderen Quelle) per c/p in ein Tabellenblatt in die Mappe an einer bestimmten Stelle einfügen. Diese Daten werden nun zu unseren (zu kombinierenden) Matrizen umgewandelt.
Zur Zusammenfassung:
Hier bin ich völlig frei. Wenn das sofort/automatisch geht, ist es noch leichter und weniger fehleranfällig. Jedoch habe ich auch nichts gegen einen eingefügten "Button" (z.B. über VBA?!) der das zusammenstellen der "großen" Matrix zur Folge hat. Da ich, wie oben schon erwähnt, noch keine Ahnung von VBA habe, weiß ich leider nicht wie ich so etwas machen kann.

Zitat:Bei Atillas Ansatz werden bei Import einer Matrix und dem Blattwechsel auf die Zusammenfassung alle Daten neu geschrieben, 
Das neu schreiben aller Daten (solange keine Fehler etc. eingebaut werden) ist an sich kein Problem. Die "große" Matrix sollte maximal um die 5000 Zeilen haben. Das sollte der Rechner ohne Probleme neu berechnen können, wenn eine neue Matrix importiert wird (falls das deine Sorge war).

Zitat:Du wolltest aber nur die importierte Matrix übernehmen.
Nicht ganz. Wie oben schon beschrieben, werden die importierten Matrizen umgewandelt und angepasst, bis Sie das Matrix-Format haben x Zeilen und 10 Spalten.

Zitat:Wenn die Antwort auf 1. ja ist, dann Bereich feststellen, die erste Zeile des Bereichs merken, Daten des Bereichs löschen, importierte Daten an dieser Stelle einfügen.
Versteh ich nicht, was/wie du das meinst.

Zitat:Wenn die Antwort auf 1. nein und 2. nein ist, dann beim Einfügen der Daten einen Bereichsnamen für den entsprechenden Datenbereich vergeben, bei Änderung die erste Zeile des Bereichs merken, Daten des Bereichs löschen, importierte Daten an dieser Stelle einfügen und wieder Bereichsnamen vergeben
Auch hier glaube ich dich nicht vollständig zu verstehen.
Wenn ich das richtig verstehe, muss ich das nach jedem Import neu machen? Falls ja, dann funktioniert das nicht. Nach dem Import soll an den einzufügenden Matrizen nichts geändert/angepasst werden müssen.

Zitat:Wenn derzeit die Antwort auf 1. nein und 2. ja ist, gibt es ein Problem. Wenn ich mit Bereichsnamen arbeite und Du fügst unter dem Bereich eine neue Zeile ein, Ändert sich der definierte Bereich nicht. Dann müsstest Du Dir was einfallen lassen, wie Du den Bereich kenntlich machst. Man könnte z.B. eine weitere Spalte nutzen und dort eine Bereichsnummer eingeben. Per Makro beim Übertragen automatisch und bei manueller Erweiterung dann eben von Hand.
Wie gesagt die zusammen zuführenden Matrizen sind eindeutig zu unterscheiden in der 9ten Spalte. Das Problem ist, dass es unterschiedlich viele Zeilen sind und durch jeden Import sich die Anzahl der Zeilen jeder Matrix auch ändern kann.


Viele Dank nochmal für die Antworten und wenn Ihr gute Tutorials kennt oder weitere wertvolle Tipps habt, würd ich die gern hören :35:

Gruß
Matthias
Top
#6
Zitat:Kennst du dafür ein gutes Tutorial? Wenn das alles mit Power Query geht, würde ich es auch damit machen, wenn ich wüsste wie es geht Wink
Mike Girvin hat vor kurzem einige Videos zu Power Query gemacht. Zu deinem Thema passen wohl #28 und #29.
Wir sehen uns!
... Detlef

Meine Beiträge können Ironie oder Sarkasmus enthalten.

Top
#7
Moin,

im Prinzip sind beide Lösungsvorschläge gleichwertig. Aber nur im Prinzip, denn mir fehlen doch noch ein paar Infos.
Die wichtigsten Fragen:
  1. Sind die importierten Daten tatsächlich ohne Überschriften?
  2. Welches ist die Datenquelle für den Import (Programm oder Datentyp)
  3. Welches soll der "Auslöser" für die Aktualisierung sein? (z.B. automatisch, Button, ...)
Eventuell kannst du den "Import" aich per PowerQuery mit erledigen, das wäre dann gewiss die eleganteste Lösung.
Beste Grüße
  Günther

Excel-ist-sexy.de
  …schau doch mal rein!
Der Sicherheit meiner Daten wegen lade ich keine *.xlsm bzw. *.xlsb- Files mehr herunter! -> So geht's ohne!
Top
#8
Hallöchen,

man könnte das z.B. so lösen. Die nach dem Eintrag in Spalte I gefilterten Daten werden gelöscht - darunter befindliche Daten hochgezogen, das Makro merkt sich die erste gelöschte Zeile dieses Bereichs und fügt die neuen Daten dann dort ein. Die gerade hochgezogenen Daten werden dabei runter geschoben. Die Geschiebe hab ich wegen der "Ungewissheit", ob eventuell die neuen Daten mehr oder weniger Zeilen haben als die gelöschten. Neue Daten hab ich hier mal fest von Blatt 2 geholt, das müsste dann noch flexibel gestaltet werden.
Man könnte das z.B. automatisch zuordnen. Wird nach I gefiltert, dann Blatt 2, wird nach S gefiltert, dann Blatt ...

Code:
Sub MatrixUebertragen()
'Variablendeklarationen
Dim strI As String, lRow As Long, llrow As Long, rngAreas As Range
'Filterkriterium eingeben
strI = InputBox("", "Eingabe Merkmal")
'wurde nichts eingegeben oder abgebrochen, Makro verlassen
If strI = "" Then Exit Sub
'Like-String zusammenstzen ("Beginnt mit")
strI = "=" & strI & "*"
'Mit dem aktiven Blatt - Kombinationsblatt vor Makroausfuehrung auswaehlen!
With ActiveSheet
  'Falls Autofilter aus, einschalten
  If .AutoFilterMode = False Then .UsedRange.AutoFilter
    'Mit dem benutzten Bereich
    With .UsedRange
      'Autofilter setzen und in Spalte 9 filtern
      .AutoFilter Field:=9, Criteria1:=strI, Operator:=xlAnd
      'gefilterte Bereiche zuweisen
      Set rngAreas = ActiveSheet.AutoFilter.Range.SpecialCells(xlCellTypeVisible)
      'Erste sichtbare Datenzeile feststellen
      'Wenn Bereich 1 mehr als eine Zeile hat, dann
      If rngAreas.Areas(1).Rows.Count > 1 Then
        'erste Datenzeile ist Zeile 2 des Bereichs
        lRow = rngAreas.Areas(1).Rows(2).Row
      'oder wenn nicht und mehr als ein Area vorhanden ist, dann
      ElseIf rngAreas.Areas.Count > 1 Then
        'erste Datenzeile ist Zeile 1 des zweiten Bereichs
        lRow = rngAreas.Areas(2).Rows(1).Row
      'Ende Wenn Bereich 1 mehr als eine Zeile hat, dann
      End If
      'letzte sichtbare Zeile feststellen. Ist nichts sichtbar, ist das Null.
      llrow = rngAreas.SpecialCells(xlCellTypeLastCell).Row
      'ist was sichtbar, dann
      If llrow > 0 Then
        'Zeilen loeschen und Daten hochziehen
        .Delete Shift:=xlUp
      'Ende ist was sichtbar, dann
      End If
    'Ende Mit dem benutzten Bereich
    End With
  'Falls Autofilter ein, ausschalten
  If .AutoFilterMode = True Then .UsedRange.AutoFilter
'Ende Mit dem aktiven Blatt - Kombinationsblatt vor Makroausfuehrung auswaehlen!
End With
'Daten einfuegen
'Mit dem Blatt 2
With Sheets("2")
  'letzte belegte Zeile feststellen
  llrow = .Cells(Rows.Count, 1).End(xlUp).Row
  'Datenbereich bis Spalte J kopieren
  .Range(.Cells(1, 1), .Cells(llrow, 10)).Copy
  'Daten an gefilterter Zeile einfuegen,
  Cells(lRow, 1).Insert Shift:=xlDown
'Ende Mit dem Blatt 2
End With
End Sub
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
Top
#9
Hallo,
danke für alle Antworten.

Von shift-del:
Zitat:Mike Girvin hat vor kurzem einige Videos zu Power Query gemacht. Zu deinem Thema passen wohl #28 und #29.
Danke, werde ich mir anschauen.

Von GMG-CC:

Zitat:
  1. Sind die importierten Daten tatsächlich ohne Überschriften?
  2. Welches ist die Datenquelle für den Import (Programm oder Datentyp)
  3. Welches soll der "Auslöser" für die Aktualisierung sein? (z.B. automatisch, Button, ...)
1. Ja
2. .xls
3. Ist für mich nicht wichtig. Es kann automatisch aktualisiert werden oder per eingefügten Button. Das am wenigten fehleranfällige bevorzuge ich.


Zitat:Eventuell kannst du den "Import" aich per PowerQuery mit erledigen, das wäre dann gewiss die eleganteste Lösung.
Da hast du bestimmt recht. Nur leider behersche ich PowerQuery noch nicht. Für gute Tipps zu Tutorial bin ich immer dankbar.

@ schauan:
Vielen Dank.
Ist das ein VBA Code oder muss das ins Code-Modul der Tabelle?

VG
Matthias
Top
#10
Hallo Matthias,

ja, das ist ein VBA-Code. In diesem Fall gehört er in ein Modul, also im VBA-Editor selbiges einfügen. Codes können je nach Verwendungszweck auch im Tabellenblattmodul und in DieseArbeitsmappe stehen oder in ein einzufügendes Userform oder ein Klassenmodul eingefügt werden.
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste