it-swarm.com.de

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

In Excel habe ich eine Kalkulationstabelle, 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.

Ich kann 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 überlege ich, eine separate Tabelle mit denselben Spaltenüberschriften auf einem neuen Blatt zu erstellen und die Daten dort einzugeben. Dann erstelle ich eine dritte Tabelle auf einem anderen Blatt, in der die Zeilen aus der Tabelle kombiniert werden, die Daten aus SQL und SQL abrufen 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     |
11
Ajedi32

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

Erstellen Sie eine SQLDB mit dynamischem Namensbereich für die SQL-Daten in Sheet1 mit der Formel:

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

Erstellen Sie einen zweiten dynamischen Namensbereich EXCELRNG für die manuell in Sheet2 eingegebenen Daten. Verwenden Sie dazu die Formel:

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

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

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

Geben Sie die folgende Formel in Zelle A2 von Sheet3 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 Variablennamensspalten und dann die Zeilen nach unten, bis die Ergebnisse der Formeln alle Bindestriche ("-") sind.

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

Wiederum wäre der erste Schritt, einen dynamischen benannten Bereich zu erstellen, beispielsweise RESULTRNG, und die folgende Formel in das Eingabefeld des Namensmanagers 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 nachgestellten Bindestriche aus der Formeltabelle in Sheet3 herausgefiltert.

Dies funktioniert, weil die RESULTRNG-Formel die Gesamtzahl der Zeilen in Sheet1 und Sheet2 (ohne die Überschrift in Sheet2) und die Gesamtzahl der Spalten in Sheet1 zusammenzählt und ihre Ausdehnung basierend auf diesen Zählungen festlegt, ohne Striche in nachfolgenden Zeilen ( oder Spalten) in der Formeltabelle Sheet3.

2
chuff

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

Wechseln Sie zur Registerkarte "Daten" in der Multifunktionsleiste, klicken Sie auf "Aus anderen Quellen" und "Aus Microsoft-Abfrage". Klicken Sie anschließend 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 gefragt werden, ob Sie die Bearbeitung in Microsoft Query fortsetzen möchten. Von hier aus können Sie auf die SQL-Schaltfläche 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 wieder 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.

5
Ajedi32

Hier ist eine Version von @ chuffs "Pure Excel" -Lösung, die speziell für die Arbeit mit Tabellen entwickelt wurde. (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 zusammenzuführenden Datensätze keine benannten Bereiche definieren müssen, da es sich um Tabellen handelt, die bereits einen eigenen benannten Bereich haben. Nennen Sie also Ihre erste Tabelle Table1 und Ihre zweite Tabelle Table2.

Erstellen Sie nun eine neue Tabelle in der oberen linken Ecke eines neuen Blatts und geben Sie ihm die gleichen Spaltennamen wie den beiden anderen Tabellen. Geben Sie dann die folgende Formel in Zelle A2 des soeben erstellten Arbeitsblatts 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 die Zeilen nach unten, bis die Ergebnisse der Formeln alle Bindestriche ("-") sind. Hinweis: Das Sortieren dieser neuen Tabelle hat keine Auswirkung, da der Inhalt jeder Zelle identisch ist (alle enthalten dieselbe Formel).

Wenn Spalten in der zusammengeführten Tabelle Nullen anzeigen, während sie eine leere Zelle anzeigen sollen, können Sie die Formel in dieser Spalte mit der Ersatzfunktion wie folgt umbrechen:

=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. Nennen 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.

3
Ajedi32

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

  • Legen Sie einen dynamischen Namensbereich für die Daten fest, die Sie aus 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 Verweise auf. Ich habe angenommen, dass Ihre eingezogenen Daten in Sheet1 sind:

    =OFFSET(Sheet1!$A$1,0,0,COUNTA(Sheet1!$A:$A),COUNTA(Sheet1!$1:$1))
    
  • Stellen Sie einen anderen benannten Bereich für den Bereich ein, in dem die manuellen Daten eingegeben werden. Ich habe den Namen EXCELRNG verwendet und angenommen, dass er in Sheet2 vorkommt. Der benannte Bereich beginnt in Zeile 2, um eine Kopfzeile auszuschließen. Die Formel hier ist identisch mit der ersten, mit Ausnahme des Blatts, 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. Der Zugriff auf das Dialogfeld erfolgt über die Auswahl von Verbindungen auf der Registerkarte Daten in der Multifunktionsleiste. Durch Deaktivieren der Hintergrundaktualisierung wird sichergestellt, dass das VBA-Makro angehalten wird, bis eine Aktualisierung der Daten in der Excel-Tabelle abgeschlossen ist. Die Verbindungsaktualisierung beim Öffnen des Arbeitsblatts ist möglicherweise nicht erforderlich, ich wollte jedoch sicherstellen, dass die Authentifizierung durchgeführt wird, bevor das Makro ausgeführt wird.

connection settings

  • 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, unbenutzte Zellen löschen" gewählt habe, hatte ich mit der Option "Zellen einfügen ..." eigentlich keine Probleme.

connection properties

  • Schließlich ist dies der VBA-Code. Wählen Sie zum Einfügen 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 am oberen Bildschirmrand und fügen Sie den Code in das neue Modul ein. 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
    
3
chuff

Wenn Sie nur ein einmaliges Ergebnis erhalten 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 eingebauten Beispiels, das zeigt, wie man es benutzt:

enter image description here

0
Hvg Hng