Come unire due tabelle in Excel con colonne identiche?


11

In Excel, ho un foglio di calcolo che estrae i dati da un database SQL in una tabella e quindi genera un rapporto basato su tali dati. Sfortunatamente, i dati in questo database SQL sono incompleti e voglio includere righe aggiuntive nel set di risultati che vengono immesse manualmente nel foglio di calcolo.

Per quanto mi piacerebbe, non posso semplicemente inserire manualmente queste righe extra nella tabella perché verrebbero eliminate ogni volta che Excel estrae nuovi dati dal database SQL. Quindi, sto prendendo in considerazione la creazione di una tabella separata con le stesse intestazioni di colonna su un nuovo foglio e l'inserimento dei dati lì, e quindi la creazione di una terza tabella su un altro foglio che in qualche modo combina le righe dalla tabella che estrae i dati da SQL e il tabella in cui inserisco i dati manualmente. Come posso farlo? (O in alternativa, c'è un modo migliore per farlo che mi manca in qualche modo?)


Esempio:

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     |

Va bene per te se i tuoi dati aggiunti manualmente sono al di sotto dei tuoi dati SQL? O devono essere ordinati per data. Excel non sovrascriverà le righe che si trovano proprio sotto le righe di dati SQL esistenti. Ma se entrambi i tipi di dati devono essere ordinati, l'intera faccenda è più complicata.
nixda,

Bene, preferirei che fossero ordinati, ma non è del tutto necessario. L'importante è che sono in grado di utilizzare le tabelle pivot e altri strumenti Excel per analizzare l'intero set di dati (comprese le tabelle popolate automaticamente e manualmente). Devo anche essere in grado di continuare a estrarre automaticamente nuovi dati da SQL.
Ajedi32,

Questo comportamento sarebbe una soluzione? Dopo la prima query e dopo la seconda query . E ovviamente Excel aggiornerà automaticamente il tuo SQL quando apri la cartella di lavoro.
nixda,

Funzionerebbe, immagino. Preferirei avere i dati in una singola tabella in modo da poter filtrare, ordinare, ecc., Ma come ho detto prima non è del tutto necessario.
Ajedi32,

forse troviamo una soluzione per il tuo problema di smistamento. Ma per il primo passo, basta eseguire una query sul tuo SQL per la prima volta in una nuova cartella di lavoro. Successivamente, aggiungi le voci del manuale proprio sotto di esse. Ora provalo con una seconda (e maggiore) query. Non verranno sovrascritti. È un comportamento standard. Non c'è niente di speciale da fare.
nixda,

Risposte:


2

Ecco una soluzione Excel pura senza VBA. Funziona utilizzando una funzione INDICE per ridurre le righe e le colonne dei dati SQL fino a quando i valori non sono esauriti e si verifica una condizione di errore. Una funzione IFERROR rileva l'errore e utilizza una seconda funzione INDICE per scorrere le righe e le colonne dei dati immessi manualmente, ancora una volta fino a quando questi valori sono esauriti e si verifica una condizione di errore. Una seconda funzione IFERROR rileva l'errore e restituisce un trattino ("-"). (I dati SQL devono essere aggiornati tramite la barra multifunzione affinché le formule producano un risultato corretto.)

Crea un intervallo dinamico denominato SQLDB per i dati SQL in Sheet1 utilizzando la formula:

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

Crea un secondo intervallo dinamico denominato EXCELRNG per i dati immessi manualmente in Sheet2 utilizzando la formula:

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

Entrambi questi intervalli nominati presuppongono che i nomi delle variabili siano immessi nella riga 1 di ciascuno dei due fogli.

Immettere i nomi delle variabili nella riga 1 di Sheet3 (a partire dalla cella A1).

Immettere la seguente formula nella cella A2 di Sheet3:

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

Copia la formula attraverso le colonne del nome della variabile, quindi verso il basso le righe fino a quando i risultati delle formule sono tutti trattini ("-").

Come passaggio successivo è possibile creare una tabella pivot in un altro foglio per analisi e organizzazione.

Ancora una volta il primo passo sarebbe quello di creare un intervallo denominato dinamico, ad esempio RESULTRNG, inserendo la seguente formula nella casella di input di Name Manager per l'intervallo denominato:

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

Quindi creare una tabella pivot in un nuovo foglio, impostando RESULTRNG come tabella che si desidera analizzare. Ciò filtrerà eventuali trattini finali dalla tabella delle formule in Sheet3.

Ciò funziona perché la formula RESULTRNG conta il numero totale di righe in Sheet1 e Sheet2 (escluso l'intestazione in Sheet2) e il numero totale di colonne in Sheet1 e imposta la sua estensione in base a tali conteggi, escludendo eventuali trattini in qualsiasi riga finale ( o colonne) nella tabella delle formule di Sheet3.


Se lo facessi in questo modo, la tabella combinata non dovrebbe avere dimensioni fisse? E se la tabella fosse più grande di quanto fosse necessario, non mi incasinerei se provassi a creare una tabella pivot che gestisca i dati dalla tabella combinata? (Perché alcuni dei valori nella tabella avrebbero caratteri "-"?) O c'è un modo per aggirare questi problemi?
Ajedi32,

(A proposito, in genere preferisco soluzioni Excel pure come questa perché non richiedono all'utente di abilitare le macro prima di iniziare a lavorare.)
Ajedi32

Richiederebbe un po 'di manutenzione manuale per assicurarsi che le formule acquisissero tutti i dati nelle due tabelle. Per evitare i trattini, è necessario copiare le formule solo nel punto in cui hanno restituito i dati, non sui trattini.
Chuff

Sarebbe possibile creare un altro intervallo denominato che includa solo le righe della tabella unita che non sono vuote (riempite con caratteri "-")? In questo modo potrei semplicemente impostare le tabelle pivot per ottenere i loro dati da quell'intervallo e non dovrei preoccuparmi dei trattini.
Ajedi32,

Ho ampliato la mia risposta per spiegare come è possibile creare una tabella pivot escludendo i trattini. Cercare di inserire una tabella "senza trattino" trasferirebbe semplicemente il problema del trattino a un altro foglio, con # N / A nelle celle del trattino a meno che la nuova tabella non fosse dimensionata manualmente ogni volta che cambia il numero di righe nei dati di origine.
Chuff

5

Ho trovato il modo di farlo. Questa soluzione è un po 'complicata e richiede che entrambi i tavoli abbiano i loro fogli separati (con nient'altro su di essi), ma a parte questo fa quasi esattamente quello che voglio. (Sembra esserci anche molto potenziale qui per eseguire operazioni più complesse come i join).

Vai alla scheda dati sulla barra multifunzione, fai clic su "Da altre fonti" e "Da query Microsoft". Quindi fare clic su File Excel, selezionare il file su cui si sta attualmente lavorando e fare clic su OK. Quindi, premi Annulla e quando viene promosso se desideri continuare a modificare in Microsoft Query, premi "Sì". Da qui è possibile fare clic sul pulsante SQL e scrivere una query SQL personalizzata su qualsiasi foglio nel foglio di calcolo. Nel mio caso:

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

Nota: per me, questo metodo smette di funzionare dopo aver chiuso il file e averlo aperto di nuovo. Lo sto pubblicando qui comunque, nel caso in cui sia solo un problema con il mio computer o qualcun altro può farlo funzionare.


1
Funziona bene collegando due diverse cartelle di lavoro. Era esattamente quello di cui avevo bisogno. Grazie!
DaVe,

Questo metodo funziona molto bene per me. Eseguire la query, quindi copiare semplicemente i dati e incollarli in Excel. Tuttavia, è importante notare che rimuoverà qualsiasi riga duplicata dai tuoi dati, spero che non ti dispiaccia se modifico leggermente questa risposta.
Some_Guy

Aggiungendo perché questo in realtà è successo a me, ho quasi usato questo per unire un mucchio di dati di vendita in 1 foglio di calcolo prima di creare un pivottabile per ottenere alcuni totali, e avrei avuto alcuni errori in cui lo stesso volume di un prodotto venduto più volte avrebbe mancato.
Some_Guy

@Some_Guy Basta usare UNION ALL invece.
Ajedi32

3

Se sei interessato a una soluzione VBA, sono stato in grado di far funzionare quanto segue:

  • Imposta un intervallo denominato dinamico per i dati che stai estraendo da SQL Server. Apri Gestione nomi, inserisci un nuovo nome, (ad esempio "SQLDB") e copia la seguente formula nella casella di input Fa riferimento a. Ho assunto che i tuoi dati inseriti siano nel Foglio1:

    =OFFSET(Sheet1!$A$1,0,0,COUNTA(Sheet1!$A:$A),COUNTA(Sheet1!$1:$1))
    
  • Impostare un altro intervallo denominato per l'intervallo in cui vengono immessi i dati manuali. Ho usato il nome EXCELRNG e ho pensato che fosse in Sheet2. L'intervallo denominato inizia nella riga 2 per escludere una riga di intestazione. La formula qui è identica alla prima ad eccezione del foglio a cui si riferisce:

    =OFFSET(Sheet2!$A$1,1,0,COUNTA(Sheet2!$A:$A)-1,COUNTA(Sheet2!$1:$1))
    
  • Ecco il primo set di impostazioni che ho usato per la connessione alla tabella SQL. È possibile accedere alla finestra di dialogo selezionando Connessioni nella scheda Dati sulla barra multifunzione. La disabilitazione dell'aggiornamento in background garantisce che la macro VBA venga messa in pausa fino al completamento dell'aggiornamento dei dati nel foglio Excel. Avere la connessione aggiornata all'apertura del foglio di lavoro potrebbe non essere necessario, ma volevo assicurarmi che qualsiasi autenticazione sarebbe stata eseguita prima dell'esecuzione della macro.

impostazioni di connessione

  • Ecco la seconda serie di impostazioni. Questi si trovano nella sezione Proprietà della scheda Dati (mentre è selezionata una cella nella tabella SQL importata). Anche se ho scelto l'opzione "Inserisci intere righe per nuovi dati, elimina celle non utilizzate", in realtà non ho riscontrato alcun problema con l'opzione "Inserisci celle ...".

proprietà di connessione

  • Infine, questo è il codice VBA. Per inserirlo, selezionare Visual Basic nella scheda Sviluppatore. Evidenzia il nome del foglio di lavoro nell'elenco a sinistra. Verrà indicato come "Progetto VBA (nome foglio). Quindi selezionare Inserisci modulo nella barra dei menu nella parte superiore dello schermo e incollare il codice nel nuovo modulo. Notare che ho inserito la tabella consolidata in Foglio3. Come scritto, la macro non ordina la nuova tabella, anche se non sarebbe difficile da aggiungere.

    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
    

Sembra una soluzione abbastanza solida. Ho un paio di domande però. Cosa attiva questa macro? Viene eseguito automaticamente quando si aggiornano le connessioni dati o è necessario premere un pulsante separato per eseguirlo manualmente? In secondo luogo, funziona con le tabelle, giusto? (Non solo intervalli che non sono formattati come tabelle) In tal caso, la tabella stessa non può gestire l'ordinamento? (Invece della macro VBA che fa l'ordinamento, come hai suggerito?)
Ajedi32

1
Allo stato attuale, eseguiresti la macro selezionando Macro dalla scheda Sviluppatore, quindi selezionando ed eseguendo la macro. Due alternative: assegnarlo a un pulsante personalizzato sulla barra multifunzione e utilizzarlo per eseguirlo; o incorporarlo come codice macro in un evento Worksheet_Activate. Ciò verrà eseguito ogni volta che si seleziona il foglio di consolidamento. Funzionerà con le tabelle, che possono fare l'ordinamento. Tuttavia, non sono sicuro se le tabelle ricorrono automaticamente quando vengono aggiunti i dati.
Chuff

3

Ecco una versione della soluzione "Pure Excel" di @ chuff progettata appositamente per funzionare con le tabelle. (IE Le due origini dati che si desidera unire sono tabelle.)

La differenza principale tra questo metodo e quello chuff pubblicato nella sua risposta è che non è necessario definire intervalli denominati per i due set di dati che si stanno unendo, poiché sono tabelle e hanno già un proprio intervallo di nomi. Quindi vai avanti e dai un nome al tuo primo tavolo Table1e al tuo secondo tavolo Table2.

Ora, crea una nuova tabella nell'angolo in alto a sinistra di un nuovo foglio e assegnagli gli stessi nomi di colonna delle altre due tabelle. Quindi immettere la seguente formula nella cella A2 del foglio appena creato:

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

Quindi, copia questa formula su tutte le colonne della tabella, quindi giù per le righe fino a quando i risultati delle formule sono tutti trattini ("-"). Nota: l'ordinamento di questa nuova tabella non farà nulla, poiché i contenuti di ciascuna cella sono effettivamente identici (contengono tutti la stessa formula).

Se le colonne nella tabella unita visualizzano 0 quando devono visualizzare una cella vuota, puoi racchiudere la formula in quella colonna con la funzione sostitutiva, in questo modo:

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

Se si desidera creare una tabella pivot che utilizza i dati di questa nuova tabella, è necessario creare un intervallo denominato. Innanzitutto, dai un nome alla tabella Table3. Ora vai alla scheda delle formule e fai clic su "Definisci nome". Dai un nome al riferimento, inserisci la seguente equazione per il suo valore ("Fa riferimento a"):

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

È quindi possibile utilizzare questo riferimento denominato come intervallo per la tabella pivot.


0

Se vuoi solo un risultato su una volta, c'è un sito web che unirà due tabelle per te: https://office-tools.online/table/merge/

Incollare le tabelle nella pagina Web e selezionare i parametri pertinenti. Ecco uno screenshot dell'esempio integrato che indica come usarlo:

inserisci qui la descrizione dell'immagine

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.