2017-11-14 4 views
0

Happy Monday Everyone!Kombinieren Sie mehrere Tabellenzeilen in die Master-Tabelle

Haben Sie eine Frage und hoffen, dass Sie helfen können. Ich habe eine Budget-Tabelle mit einem Budget-Tab. Auf dieser Registerkarte sind etwa 8 Tabellen in verschiedene Kategorien unterteilt. Jede Tabelle in der Registerkarte hat die exakt gleichen Spalten. Gibt es eine nicht-vbscript/marco-Methode zum Erstellen einer Master-Tabelle, die alle Tabellen in einer einzigen Tabelle auf einer anderen Registerkarte kombiniert. Dies scheint ein Kinderspiel zu sein, aber ich habe alles versucht, was ich mir vorstellen kann und finde es online und es scheint keine vernünftige Lösung ohne ein Addon namens Power-Abfrage zu geben.

+0

Ja mindestens zwei Optionen Pivot-Tabelle aus konsolidiert. Meine Antwort finden Sie hier: https://stackoverflow.com/questions/46685803/combining-data-from-two-sheets-and-generating-pivot-table-in-an-another-sheet/46687935#46687935 oder verwenden Sie Powerquery to Tabellen zu einem zusammenführen und als Master-Tabelle in ein neues Blatt laden http://www.contextures.com/excelpowerquerycombinetables.html – QHarr

+0

Gehen Sie weiter und reichen Sie Ihre Pivot-Tabelle Antwort als Antwort und ich werde es schaffen. Das einzige, was ich anders gemacht habe, ist, dass ich die "[#All]" am Ende der Tabellennamen nicht hinzugefügt habe, ich habe nur die Tabellennamen verwendet und es hat nicht funktioniert. – user1451070

+0

Können Sie näher erläutern, was Sie mit "es scheint nicht eine anständige Lösung mit einem Add-On namens Power-Abfrage." PowerQuery handhabt dies problemlos und ist viel besser als die PivotTable von Consolidated Ranges. PowerQuery heißt jetzt "Get & Transform", und wenn Sie es ein paar Mal benutzt haben, werden Sie erstaunt sein, was Sie tun können, nur durch Durchwursteln. Es ist auch sehr einfach, Daten mit VBA in eine Master-Tabelle zu matchen ... vor allem, wenn Sie alle Ihre Daten in Excel-Tabellen umwandeln, so dass sie sehr einfach mit VBA zu referenzieren sind. Ich poste etwas Code, wenn ich einen Moment habe. – jeffreyweir

Antwort

1

Sie können die Funktionalität der Pivot-Tabellen-Assistenten verwenden, um mehrere Bereiche zu konsolidieren (die Tabellen) sind zusammen in eine Pivot-Tabelle.

Wenn es aufgefordert werden, damit Sie Ihre Bereiche die Tabellennamen mit der folgenden Syntax verwenden, um hinzuzufügen: Table4[#All]

Sie müssen die [#All] die alle mit der Tabelle zugehörigen Daten zu erhalten. Wiederholen Sie dies für jeden Ihrer Tabellennamen, die Sie konsolidieren möchten.

Ausführliche Beschreibung ich hier in meiner Antwort gegeben haben:

combining data from two sheets and generating pivot table in another sheet

Hinweis: Wenn Sie den ursprünglichen Tabellennamen oder Tabellennummern behalten möchten, müssen Sie die Option wählen:

1) "Ich werde die Seitenfelder erstellen"

2) Geben Sie die Bereiche unter Verwendung des Tabellennamens ein, z Tabelle 4 [#All]

3) Wählen Sie, wie viele Seitenfelder möchten Sie 1-4 und Elementbeschriftung hinzufügen verwendet, um die ausgewählten Bereiche unter Beispiel zu identifizieren Tabelle4.

Ich bin mir nicht sicher, ob 4 Elemente das Maximum ist oder ob dies durch VBA erweitert werden kann. Sie können jedoch auch PowerQuery oder UnionQuery verwenden.

Die folgenden Zitate sind von hier: http://www.contextures.com/xlPivot08.html

I umfassen einige Umriss bei Links verloren gehen.

PowerQuery:

Wenn Sie eine Version von Excel, die Power-Query-Add-in von Microsoft unterstützt, können Sie es verwenden, um die Daten in zwei oder mehr Tabellen zu kombinieren. Die Tabellen können sich in derselben Arbeitsmappe oder in verschiedenen Dateien befinden.

http://www.contextures.com/xlPivot08.html#videopowerquery

Union Abfrage:

Wenn Sie Ihre Daten auf einem einzigen Arbeitsblatt kombinieren, ist eine andere Lösung benannte Bereiche in einer Excel-Datei zu erstellen, und verwenden Sie Microsoft Query (MS Query) zu Kombiniere die Daten.

http://www.contextures.com/xlPivot08.html#union01

+0

Das hat funktioniert, Danke! Nur ein kleines Problem, im Filter-Dropdown-Menü hat es ein Element namens "Seite 1" erstellt, das sich im Filterfeld befindet, und es hat einen Eintrag für jede Tabelle, auf die ich verwiesen habe. Das einzige Problem ist, dass jedes dieser Elemente als "Element 1", "Element 2" usw. anstelle der Tabellennamen gekennzeichnet wird. gibt es eine Möglichkeit, diese zurück zu den Tabellennamen anstelle von 'Element #' umzubenennen – user1451070

+0

Können Sie einfach alias sie, d.h.Überschreibe sie im Pivotable mit den gewünschten Namen? Ich werde mir andere Möglichkeiten ansehen, aber oft kann dies getan werden. – QHarr

+0

Nein, weil sie nur im Dropdown-Feld des Filters sichtbar sind. Gesucht, aber das scheint ein einzigartiges Problem zu sein, das ich habe. – user1451070

-1

Wenn Sie Excel 2013 oder höher, dann ist dies die perfekte Ausrede, um mit PowerQuery spielen zu gehen, die jetzt ‚Get & Transformation‘ in der Band genannt wird.Sie können etwas sehr ähnlich zu Ihrer Anforderung in meiner Antwort bei excel indirect function to read dates and return dynamic values

Ich schlage vor, Sie gehen und schauen Sie sich diesen Thread ... auch wenn Sie aus irgendeinem Grund nicht PowerQuery für diese besondere Herausforderung verwenden können, weil ich denke Es ist sehenswert, wie einfach es ist, identische Tabellen mithilfe von PowerQuery zu erstellen, auch wenn dies nur als Referenz dient. Es ist im Grunde ein VBA-Entwickler in einer Box. Es ist eine VBA-Gimp!

+0

Dies wird in einer Unternehmensumgebung verwendet und kann keine Addons installieren. – user1451070

+0

Welche Version von Excel ist installiert? Excel 2013 oder später? Wenn dies der Fall ist, wird PowerQuery eingebunden und über die Multifunktionsleiste "Get and Transform" gestartet. Es ist kein eigenständiges Add-In, und IT konnte es nicht ausschalten, wenn sie es versuchten. Außerdem ist VBA kein Add-In und kann in jeder Version von Excel verwendet werden, es sei denn, die IT hat Makros vollständig deaktiviert. (Und ich arbeite noch an einem Ort, wo sie das getan haben). – jeffreyweir

+0

Hey downvoter: warum hörst du nur mit * diesem * downvote auf? Warum nicht * anonym * die andere Antwort, die ich auch freiwillig gegeben habe, abstimmen, ohne Rückmeldungen zu geben. – jeffreyweir

2

Ich weiß, dass Sie nach einem nicht VBA-Weg gefragt haben, aber der Vollständigkeit halber füge ich eine andere Antwort hinzu, die auch eine VBA-Lösung hat, weil es tot einfach ist, es flammend schnell ist und es generisch ist. Alles, was Sie tun müssen, ist Ausschneiden und Einfügen dieses Codes in ein Standard-Codemodul, Hinzufügen einer Schaltfläche und Zuweisen der Aufrufroutine, Geben Sie Ihren Quellentabellen einen Namen enthält den vollständigen Namen der Übersichtstabelle, und Sie sind gut gehen.

Option Explicit 
Sub CombineTables(loDest As ListObject, Optional lcSource As ListColumn) 

Dim ws   As Worksheet 
Dim lo   As ListObject 
Dim lc   As ListColumn 
Dim rDest  As Range 
Dim lRows  As Long 


Application.ScreenUpdating = False 
If lcSource Is Nothing Then Set lcSource = loDest.ListColumns(1) 

If loDest.ListRows.Count > 0 Then loDest.DataBodyRange.Delete 


For Each ws In ActiveWorkbook.Worksheets 
    For Each lo In ws.ListObjects 
     If lo <> loDest Then 
      With lo 
       If InStr(.Name, loDest.Name & "_") > 0 Then 
        Set rDest = loDest.HeaderRowRange.Offset(1 + loDest.ListRows.Count).Resize(.ListRows.Count, loDest.ListColumns.Count) 
        On Error Resume Next 
        lRows = loDest.DataBodyRange.Rows.Count 
        On Error GoTo 0 
        loDest.Resize loDest.Range.Resize(lRows + lo.DataBodyRange.Rows.Count) 
        For Each lc In .ListColumns 
         Intersect(loDest.ListColumns(lc.Name).Range.EntireColumn, rDest).Value2 = lc.DataBodyRange.Value 
        Next lc 

        Set lc = Nothing 
        On Error Resume Next 
        Set lc = .ListColumns(lcSource.Name) 
        On Error GoTo 0 
        If lc Is Nothing Then Intersect(lcSource.Range, rDest.EntireRow).Value2 = lo.Name 

       End If 
      End With 
     End If 
    Next lo 
Next ws 

Application.ScreenUpdating = True 

End Sub 

Und hier ist der Anrufer:

Sub CombineTables_Caller() 
CombineTables [SomeName].ListObject, [SomeName].ListObject.ListColumns("Source") 
End Sub 

Wenn ich diese Taste drücken, wird der Code für alle Tabellen in der gesamten Arbeitsmappe schauen, wer Namen den Namen der Zieltabelle enthalten (in diesem Fall die Tabelle "SomeName" genannt), und bringen Sie dann ihre Daten durch. Wenn Sie also neue Tabes hinzufügen, werden sie so lange eingefügt, wie Sie ihren Tabellennamen den Namen der Zieltabelle voranstellen. Alle anderen Tabellen (wie das genannte DifferentName 'wird ignoriert

enter image description here

... und hier ist das Ergebnis:.

enter image description here

Verwandte Themen