Wie füge ich zwei Tabellen in Excel mit identischen Spalten zusammen?


11

In Excel habe ich eine Tabelle, die Daten aus einer SQL-Datenbank in eine Tabelle zieht und dann einen Bericht basierend auf diesen Daten generiert. Leider sind die Daten in dieser SQL-Datenbank unvollständig und ich möchte zusätzliche Zeilen in die Ergebnismenge aufnehmen, die manuell in die Tabelle eingegeben werden.

So oft ich möchte, kann ich diese zusätzlichen Zeilen nicht einfach manuell in die Tabelle einfügen, da sie gelöscht werden, wenn Excel neue Daten aus der SQL-Datenbank abruft. Stattdessen denke ich darüber nach, eine separate Tabelle mit denselben Spaltenüberschriften auf einem neuen Blatt zu erstellen und die Daten dort einzugeben und dann eine dritte Tabelle auf einem anderen Blatt zu erstellen, die die Zeilen aus der Tabelle, die Daten aus SQL und dem abruft, irgendwie kombiniert Tabelle, in der ich Daten manuell eingebe. Wie kann ich das erreichen? (Oder gibt es alternativ einen besseren Weg, den ich irgendwie vermisse?)


Beispiel:

Table 1 (From Database):

  | Person | Week Of | Task | Hours |
  | Bob    | 1/6/13  | Foo  | 12    |
  | Mary   | 1/6/13  | Foo  | 7     |
  | Mary   | 1/6/13  | Bar  | 5     |
  | John   | 1/6/13  | Foo  | 5     |
  | John   | 1/13/13 | Foo  | 13    |

- -

Table 2 (Entered Manually): 
  | Person | Week Of | Task | Hours |
  | Bob    | 1/6/13  | Baz  | 3     |
  | Mary   | 1/6/13  | Baz  | 2     |
  | John   | 1/13/13 | Baz  | 5     |

- -

Result:
  | Person | Week Of | Task | Hours |
  | Bob    | 1/6/13  | Foo  | 12    |
  | Mary   | 1/6/13  | Foo  | 7     |
  | Mary   | 1/6/13  | Bar  | 5     |
  | John   | 1/6/13  | Foo  | 5     |
  | John   | 1/13/13 | Foo  | 13    |
  | Bob    | 1/6/13  | Baz  | 3     |
  | Mary   | 1/6/13  | Baz  | 2     |
  | John   | 1/13/13 | Baz  | 5     |

Ist es für Sie in Ordnung, wenn Ihre manuell hinzugefügten Daten unter Ihren SQL-Daten liegen? Oder müssen sie nach Datum sortiert werden. Excel überschreibt keine Zeilen, die sich direkt unter den vorhandenen SQL-Datenzeilen befinden. Wenn jedoch beide Datentypen sortiert werden müssen, ist das Ganze komplizierter.
Nixda

Nun, ich würde es vorziehen, wenn sie sortiert werden, aber das ist nicht unbedingt notwendig. Wichtig ist, dass ich Pivot-Tabellen und andere Excel-Tools verwenden kann, um den gesamten Datensatz (einschließlich der manuell und automatisch ausgefüllten Tabellen) zu analysieren. Ich muss auch weiterhin in der Lage sein, automatisch neue Daten aus SQL abzurufen.
Ajedi32

Wäre dieses Verhalten eine Lösung? Nach der ersten Abfrage und nach der zweiten Abfrage . Und natürlich aktualisiert Excel Ihre SQL automatisch, wenn Sie die Arbeitsmappe öffnen.
Nixda

Das würde funktionieren, denke ich. Ich möchte die Daten lieber in einer einzigen Tabelle haben, damit ich sie filtern, sortieren usw. kann, aber wie ich bereits sagte, ist dies nicht unbedingt erforderlich.
Ajedi32

Vielleicht finden wir eine Lösung für Ihr Sortierproblem. Fragen Sie für den ersten Schritt einfach Ihre SQL zum ersten Mal in einer neuen Arbeitsmappe ab. Fügen Sie danach Ihre manuellen Einträge direkt darunter hinzu. Testen Sie es jetzt mit einer zweiten (und größeren) Abfrage. Sie werden nicht überschrieben. Es ist ein Standardverhalten. Es gibt nichts Besonderes zu tun.
Nixda

Antworten:


2

Hier ist eine reine Excel-Lösung ohne VBA. Es funktioniert mithilfe einer INDEX-Funktion, um die Zeilen und Spalten der SQL-Daten zu verkleinern, bis die Werte erschöpft sind und eine Fehlerbedingung auftritt. Eine IFERROR-Funktion fängt den Fehler ab und verwendet eine zweite INDEX-Funktion, um die Zeilen und Spalten der manuell eingegebenen Daten zu verkleinern, bis diese Werte erschöpft sind und eine Fehlerbedingung auftritt. Eine zweite IFERROR-Funktion fängt den Fehler ab und gibt einen Bindestrich ("-") zurück. (Die SQL-Daten müssen über die Multifunktionsleiste aktualisiert werden, damit die Formeln ein korrektes Ergebnis liefern.)

Erstellen Sie eine dynamische SQLDB mit benanntem Bereich für die SQL-Daten in Sheet1 mithilfe der folgenden Formel:

=OFFSET(Sheet1!$A$2,0,0,COUNTA(Sheet1!$A:$A)-1,COUNTA(Sheet1!$1:$1))

Erstellen Sie einen zweiten dynamischen benannten Bereich EXCELRNG für die manuell eingegebenen Daten in Sheet2 mit der folgenden Formel:

=OFFSET(Sheet2!$A$1,1,0,COUNTA(Sheet2!$A:$A)-1,COUNTA(Sheet2!$1:$1))

Beide benannten Bereiche setzen voraus, dass Variablennamen in Zeile 1 jedes der beiden Blätter eingegeben werden.

Geben Sie die Variablennamen in Zeile 1 von Blatt 3 ein (beginnend in Zelle A1).

Geben Sie die folgende Formel in Zelle A2 von Blatt 3 ein:

=IFERROR(INDEX(SQLDB,ROWS(A$2:A2),COLUMN(A2)),IFERROR(INDEX(EXCELRNG,ROWS(A$2:A2)-ROWS(SQLDB),COLUMN(A2)),"-"))

Kopieren Sie die Formel über die Spalten mit den Variablennamen und dann über die Zeilen, bis die Ergebnisse der Formeln alle Bindestriche ("-") sind.

Als nächster Schritt ist es möglich, eine Pivot-Tabelle in einem anderen Blatt zur Analyse und Organisation zu erstellen.

Der erste Schritt wäre wiederum, einen dynamischen benannten Bereich zu erstellen, z. B. RESULTRNG, und die folgende Formel in das Eingabefeld Name Manager für den benannten Bereich einzufügen:

=OFFSET(Sheet3!$A$1,0,0,COUNTA(Sheet1!$A:$A)+COUNTA(Sheet2!$A:$A)-1,COUNTA(Sheet1!$1:$1))

Erstellen Sie dann eine Pivot-Tabelle in einem neuen Blatt und legen Sie RESULTRNG als die Tabelle fest, die Sie analysieren möchten. Dadurch werden alle nachfolgenden Striche aus der Formeltabelle in Sheet3 herausgefiltert.

Dies funktioniert, weil die RESULTRNG-Formel die Gesamtzahl der Zeilen in Sheet1 und Sheet2 (ohne den Header in Sheet2) und die Gesamtzahl der Spalten in Sheet1 hochzählt und ihre Ausdehnung basierend auf diesen Zählungen festlegt, wobei alle Bindestriche in nachfolgenden Zeilen ausgeschlossen sind ( oder Spalten) in der Sheet3-Formeltabelle.


Wenn ich es so machen würde, müsste der kombinierte Tisch dann nicht eine feste Größe haben? Und wenn die Tabelle größer wäre als nötig, würde mich das nicht durcheinander bringen, wenn ich versuchen würde, eine Pivot-Tabelle zu erstellen, die Daten aus der kombinierten Tabelle verarbeitet? (Weil einige der Werte in der Tabelle '-' Zeichen enthalten würden?) Oder gibt es einen Weg, um diese Probleme zu umgehen?
Ajedi32

(Übrigens bevorzuge ich im Allgemeinen reine Excel-Lösungen wie diese, da der Benutzer keine Makros aktivieren muss, bevor er mit der Arbeit beginnt.)
Ajedi32

Es würde einige Handpflege erfordern, um sicherzustellen, dass die Formeln alle Daten in den beiden Tabellen erfassen. Um die Bindestriche zu vermeiden, müssten Sie die Formeln nur an die Stelle kopieren, an der sie Daten zurückgegeben haben, nicht an Bindestriche.
Chuff

Wäre es möglich, einen anderen benannten Bereich zu erstellen, der nur die Zeilen aus der zusammengeführten Tabelle enthält, die nicht leer sind (gefüllt mit '-' Zeichen)? Auf diese Weise konnte ich einfach die Pivot-Tabellen festlegen, um ihre Daten aus diesem Bereich zu erhalten, und ich musste mich nicht um die Striche kümmern.
Ajedi32

Ich habe meine Antwort erweitert, um zu erklären, wie Sie eine Pivot-Tabelle ohne Bindestriche erstellen können. Der Versuch, eine "strichlose" Tabelle zu erstellen, überträgt das Strichproblem nur auf ein anderes Blatt mit # N / A in den Strichzellen, es sei denn, die neue Tabelle wurde jedes Mal von Hand angepasst, wenn sich die Anzahl der Zeilen in den Quelldaten ändert.
Chuff

5

Ich habe einen Weg gefunden, es zu tun. Diese Lösung ist etwas knifflig und erfordert, dass beide Tabellen ihre eigenen separaten Blätter haben (mit nichts anderem), aber ansonsten macht sie fast genau das, was ich will. (Hier scheint auch viel Potenzial für komplexere Operationen wie Joins zu bestehen.)

Wechseln Sie in der Multifunktionsleiste zur Registerkarte "Daten", klicken Sie auf "Aus anderen Quellen" und auf "Aus Microsoft-Abfrage". Klicken Sie dann auf Excel-Dateien, wählen Sie die Datei aus, in der Sie gerade arbeiten, und klicken Sie auf OK. Klicken Sie dann auf Abbrechen und klicken Sie auf "Ja", wenn Sie befördert werden, ob Sie die Bearbeitung in Microsoft Query fortsetzen möchten. Von hier aus können Sie auf die Schaltfläche SQL klicken und eine benutzerdefinierte SQL-Abfrage auf ein beliebiges Blatt in der Tabelle schreiben. In meinem Fall:

SELECT *
FROM `'Sheet1$'` `'Sheet1$'`
UNION ALL
SELECT *
FROM `'Sheet2$'` `'Sheet2$'`

Hinweis: Bei mir funktioniert diese Methode nicht mehr, nachdem ich die Datei geschlossen und erneut geöffnet habe. Ich poste es trotzdem hier, falls es nur ein Problem mit meinem Computer ist oder jemand anderes es zum Laufen bringen kann.


1
Es funktioniert gut, zwei verschiedene Arbeitsmappen zu verbinden. Genau das brauche ich. Vielen Dank!
daVe

Diese Methode funktioniert sehr gut für mich. Führen Sie die Abfrage aus, kopieren Sie dann einfach die Daten und fügen Sie sie in Excel ein. Es ist jedoch wichtig zu beachten, dass dadurch doppelte Zeilen aus Ihren Daten entfernt werden. Ich hoffe, es macht Ihnen nichts aus, wenn ich diese Antwort ein wenig bearbeite.
Some_Guy

Das Hinzufügen, weil mir das tatsächlich passiert ist, hätte dies beinahe verwendet, um eine Reihe von Verkaufsdaten in einer Tabelle zusammenzuführen, bevor ein Pivottable erstellt wurde, um einige Summen zu erhalten, und ich hätte ein paar Fehler gemacht, bei denen das gleiche Volumen eines mehrfach verkauften Produkts aufgetreten wäre wurde vermisst.
Some_Guy

@Some_Guy Verwenden Sie stattdessen einfach UNION ALL.
Ajedi32

3

Wenn Sie an einer VBA-Lösung interessiert sind, konnte ich Folgendes zum Laufen bringen:

  • Legen Sie einen dynamischen benannten Bereich für die Daten fest, die Sie von SQL Server abrufen. Öffnen Sie den Namensmanager, geben Sie einen neuen Namen ein (z. B. "SQLDB") und kopieren Sie die folgende Formel in das Eingabefeld "Verweist auf". Ich habe angenommen, dass sich Ihre eingegebenen Daten in Blatt 1 befinden:

    =OFFSET(Sheet1!$A$1,0,0,COUNTA(Sheet1!$A:$A),COUNTA(Sheet1!$1:$1))
    
  • Legen Sie einen anderen benannten Bereich für den Bereich fest, in dem die manuellen Daten eingegeben werden. Ich habe den Namen EXCELRNG verwendet und angenommen, dass er in Sheet2 enthalten ist. Der benannte Bereich beginnt in Zeile 2, um eine Kopfzeile auszuschließen. Die Formel hier ist identisch mit der ersten, mit Ausnahme des Blattes, auf das sie sich bezieht:

    =OFFSET(Sheet2!$A$1,1,0,COUNTA(Sheet2!$A:$A)-1,COUNTA(Sheet2!$1:$1))
    
  • Hier sind die ersten Einstellungen, die ich für die Verbindung zur SQL-Tabelle verwendet habe. Das Dialogfeld wird aufgerufen, indem Sie auf der Registerkarte Daten auf der Multifunktionsleiste Verbindungen auswählen. Durch Deaktivieren der Hintergrundaktualisierung wird sichergestellt, dass das VBA-Makro angehalten wird, bis eine Aktualisierung der Daten in der Excel-Tabelle abgeschlossen ist. Das Aktualisieren der Verbindung beim Öffnen des Arbeitsblatts ist möglicherweise nicht erforderlich, aber ich wollte sicherstellen, dass die Authentifizierung erfolgt, bevor das Makro ausgeführt wird.

Verbindungseinstellungen

  • Hier sind die zweiten Einstellungen. Diese befinden sich im Abschnitt Eigenschaften der Registerkarte Daten (während eine Zelle in der importierten SQL-Tabelle ausgewählt ist). Obwohl ich die Option "Ganze Zeilen für neue Daten einfügen, nicht verwendete Zellen löschen" ausgewählt habe, hatte ich mit der Option "Zellen einfügen ..." keine Probleme.

Verbindungseigenschaften

  • Schließlich ist dies der VBA-Code. Um es einzufügen, wählen Sie Visual Basic auf der Registerkarte Entwickler. Markieren Sie den Arbeitsblattnamen in der Liste links. Es wird als "VBA-Projekt (Blattname)" bezeichnet. Wählen Sie dann Modul einfügen in der Menüleiste oben auf dem Bildschirm und fügen Sie den Code in das neue Modul ein. Beachten Sie, dass ich die konsolidierte Tabelle in Blatt 3 eingefügt habe. Das Makro sortiert die neue Tabelle nicht, obwohl das nicht schwer hinzuzufügen wäre.

    Sub StackTables()
    
       Dim Rng1 As Range, Rng2 As Range
    
       Set Rng1 = ThisWorkbook.Names("SQLDB").RefersToRange
       Set Rng2 = ThisWorkbook.Names("EXCELRNG").RefersToRange
    
       ' refresh the SQL table
       ThisWorkbook.Connections(1).Refresh
    
       ' clear the consolidated table range  
       Sheet3.Cells.ClearContents
    
       ' copy the SQL data into the consolidation range
       Rng1.Copy
       Sheet3.Range("A1").PasteSpecial xlPasteValues
    
       'copy the manually entered data into the consolidate range
       Rng2.Copy
       Sheet3.Range("A1").Offset(Rng1.Rows.Count, 0).PasteSpecial xlPasteValues
       Application.CutCopyMode = False
    
       Sheets("Sheet3").Activate
       ActiveSheet.Range("A1").Select
    
    End Sub
    

Das sieht nach einer ziemlich soliden Lösung aus. Ich habe allerdings ein paar Fragen. Was löst dieses Makro aus? Es wird nur automatisch ausgeführt, wenn Sie die Datenverbindungen aktualisieren, oder müssen Sie eine separate Taste drücken, um es manuell auszuführen? Zweitens funktioniert das mit Tabellen, oder? (Nicht nur Bereiche, die nicht als Tabellen formatiert sind.) Wenn dies der Fall ist, kann die Tabelle selbst nicht sortieren? (Anstelle des VBA-Makros, das die Sortierung durchführt, wie Sie vorgeschlagen haben?)
Ajedi32

1
So wie es aussieht, würden Sie das Makro ausführen, indem Sie auf der Registerkarte Entwickler die Option Makros auswählen und dann das Makro auswählen und ausführen. Zwei Alternativen: Weisen Sie es einer benutzerdefinierten Schaltfläche auf der Multifunktionsleiste zu und verwenden Sie diese, um es auszuführen. oder binden Sie es als Makrocode in ein Worksheet_Activate-Ereignis ein. Dies wird ausgeführt, wenn Sie das Konsolidierungsblatt ausgewählt haben. Es funktioniert mit Tabellen, die die Sortierung durchführen können. Ich bin mir jedoch nicht sicher, ob Tabellen beim Hinzufügen von Daten automatisch neu erstellt werden.
Chuff

3

Hier ist eine Version von @ chuffs "Pure Excel" -Lösung, die speziell für die Arbeit mit Tabellen entwickelt wurde. (IE Die beiden Datenquellen, die Sie zusammenführen möchten, sind Tabellen.)

Der Hauptunterschied zwischen dieser Methode und dem in seiner Antwort angegebenen Chuff besteht darin, dass Sie für die beiden Datensätze, die Sie zusammenführen, keine benannten Bereiche definieren müssen, da es sich um Tabellen handelt, die bereits einen eigenen benannten Bereich haben. Benennen Sie also Ihren ersten Table1und Ihren zweiten Tisch Table2.

Erstellen Sie nun eine neue Tabelle in der oberen linken Ecke eines neuen Blattes und geben Sie ihr dieselben Spaltennamen wie die beiden anderen Tabellen. Geben Sie dann die folgende Formel in Zelle A2 des gerade erstellten Blattes ein:

=IFERROR(INDEX(Table1,ROWS(A$2:A2),COLUMN(A2)), IFERROR(INDEX(Table2,ROWS(A$2:A2)-ROWS(Table1),COLUMN(A2)), "-"))

Kopieren Sie als Nächstes diese Formel über alle Tabellenspalten und dann über die Zeilen, bis die Ergebnisse der Formeln alle Bindestriche ("-") sind. Hinweis: Das Sortieren dieser neuen Tabelle führt zu nichts, da der Inhalt jeder Zelle tatsächlich identisch ist (alle enthalten dieselbe Formel).

Wenn Spalten in der zusammengeführten Tabelle Nullen anzeigen, wenn eine leere Zelle angezeigt werden soll, können Sie die Formel in dieser Spalte mit der Ersatzfunktion wie folgt umschließen:

=SUBSTITUTE(<old expression here>, 0, "")

Wenn Sie eine Pivot-Tabelle erstellen möchten, die Daten aus dieser neuen Tabelle verwendet, müssen Sie einen benannten Bereich erstellen. Benennen Sie zuerst die Tabelle Table3. Gehen Sie nun zur Registerkarte Formeln und klicken Sie auf "Name definieren". Geben Sie der Referenz einen Namen und geben Sie die folgende Gleichung für ihren Wert ein ("Bezieht sich auf"):

=OFFSET(Table3[#All],0,0,ROWS(Table1)+ROWS(Table2)+1)

Sie können diese benannte Referenz dann als Bereich für Ihre Pivot-Tabelle verwenden.


0

Wenn Sie nur einmalig ein Ergebnis erzielen möchten, gibt es eine Website, auf der zwei Tabellen für Sie zusammengeführt werden: https://office-tools.online/table/merge/

Sie fügen die Tabellen in die Webseite ein und wählen die relevanten Parameter aus. Hier ist ein Screenshot des integrierten Beispiels, das zeigt, wie es verwendet wird:

Geben Sie hier die Bildbeschreibung ein

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.