Bagaimana cara menggabungkan dua tabel di Excel yang memiliki kolom identik?

11

Di Excel, saya memiliki spreadsheet yang menarik data dari Database SQL ke dalam tabel dan kemudian menghasilkan laporan berdasarkan data itu. Sayangnya, data dalam database SQL ini tidak lengkap dan saya ingin memasukkan baris tambahan dalam set hasil yang dimasukkan secara manual ke dalam spreadsheet.

Seperti yang saya ingin, saya tidak bisa hanya memasukkan baris-baris tambahan ini secara manual ke tabel karena mereka akan dihapus setiap kali Excel menarik data baru dari Database SQL. Jadi sebagai gantinya, saya sedang mempertimbangkan membuat tabel terpisah dengan judul kolom yang sama pada lembar baru dan memasukkan data di sana, dan kemudian membuat tabel ketiga di lembar lain yang entah bagaimana menggabungkan baris dari tabel yang menarik data dari SQL dan tabel tempat saya memasukkan data secara manual. Bagaimana saya bisa mencapai ini? (Atau secara bergantian, apakah ada cara yang lebih baik untuk melakukan ini yang entah bagaimana aku rindukan?)


Contoh:

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     |
Ajedi32
sumber
Apakah Anda setuju jika data yang ditambahkan secara manual di bawah data SQL? Atau apakah mereka harus disortir berdasarkan tanggal. Excel tidak akan menimpa baris yang tepat di bawah baris data SQL yang ada. Tetapi jika kedua tipe data harus diurutkan, maka semuanya lebih rumit.
nixda
Yah, saya lebih suka bahwa mereka diurutkan tetapi itu tidak sepenuhnya diperlukan. Yang penting adalah saya bisa menggunakan tabel pivot dan alat excel lainnya untuk menganalisis seluruh kumpulan data (termasuk tabel yang dipopulasi secara manual dan otomatis). Saya juga harus dapat terus menarik data baru dari SQL secara otomatis.
Ajedi32
Akankah perilaku ini menjadi solusi? Setelah kueri pertama dan setelah kueri kedua . Dan tentu saja Excel akan memperbarui SQL secara otomatis saat Anda membuka buku kerja.
nixda
Kurasa itu akan berhasil. Saya lebih suka memiliki data dalam satu tabel sehingga saya bisa memfilter, mengurutkan, dll, tapi seperti saya katakan sebelumnya itu tidak sepenuhnya diperlukan.
Ajedi32
mungkin kami menemukan solusi untuk masalah penyortiran Anda. Tetapi untuk langkah pertama, cukup tanyakan SQL Anda untuk pertama kalinya di buku kerja baru. Setelah itu, tambahkan entri manual Anda tepat di bawahnya. Sekarang uji dengan kueri kedua (dan lebih besar). Mereka tidak akan ditimpa. Ini perilaku standar. Tidak ada yang istimewa untuk dilakukan.
nixda

Jawaban:

2

Inilah solusi Excel murni tanpa VBA. Ia bekerja dengan menggunakan fungsi INDEX untuk mengecilkan baris dan melintasi kolom data SQL sampai nilai-nilai habis dan hasil kondisi kesalahan. Fungsi IFERROR menangkap kesalahan dan menggunakan fungsi INDEX kedua untuk mengecilkan baris dan melintasi kolom data yang dimasukkan secara manual, lagi sampai nilai-nilai tersebut habis dan kondisi kondisi kesalahan terjadi. Fungsi IFERROR kedua menangkap kesalahan dan mengembalikan tanda hubung ("-"). (Data SQL harus di-refresh melalui Ribbon agar formula menghasilkan hasil yang benar.)

Buat rentang dinamis bernama SQLDB untuk data SQL di Sheet1 menggunakan rumus:

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

Buat rentang dinamis kedua bernama EXCELRNG untuk data yang dimasukkan secara manual di Sheet2 menggunakan rumus:

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

Kedua rentang bernama ini menganggap bahwa nama variabel dimasukkan dalam baris 1 dari masing-masing dua lembar.

Masukkan nama variabel di baris 1 Sheet3 (dimulai pada sel A1).

Masukkan rumus berikut dalam sel A2 Sheet3:

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

Salin rumus di kolom nama variabel, dan kemudian ke bawah sampai hasil rumus semua tanda hubung ("-").

Mungkin sebagai langkah selanjutnya untuk membuat Pivot Table di lembar lain untuk analisis dan organisasi.

Sekali lagi langkah pertama adalah membuat rentang bernama dinamis, katakanlah, RESULTRNG, menyisipkan rumus berikut di kotak input Manajer Nama untuk rentang bernama:

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

Lalu buat Tabel Pivot di lembar baru, atur RESULTRNG sebagai tabel yang ingin Anda analisis. Ini akan memfilter setiap garis putus-putus dari tabel rumus di Sheet3.

Ini berfungsi karena rumus RESULTRNG menghitung jumlah total baris di Sheet1 dan Sheet2 (tidak termasuk header di Sheet2) dan jumlah total kolom di Sheet1, dan menetapkan luasnya berdasarkan jumlah itu, tidak termasuk tanda hubung di setiap baris tambahan ( atau kolom) dalam tabel rumus Sheet3.

orang yg kurang ajar
sumber
Jika saya melakukannya dengan cara ini, bukankah tabel gabungan harus berukuran tetap? Dan jika membuat tabel lebih besar dari yang seharusnya, bukankah itu mengacaukan saya jika saya mencoba membuat Tabel Pivot yang menangani data dari tabel gabungan? (Karena beberapa nilai dalam tabel akan '-' karakter?) Atau apakah ada cara untuk mengatasi masalah ini?
Ajedi32
(Btw, saya biasanya lebih suka solusi Excel murni seperti ini karena mereka tidak mengharuskan pengguna untuk mengaktifkan makro sebelum mereka mulai bekerja.)
Ajedi32
Membutuhkan perawatan tangan untuk memastikan formula menangkap semua data dalam dua tabel. Untuk menghindari tanda hubung, Anda harus menyalin rumus hanya ke tempat mereka mengembalikan data, bukan tanda hubung.
chuff
Apakah mungkin untuk membuat rentang bernama lain yang hanya menyertakan baris dari tabel gabungan yang tidak kosong (diisi dengan karakter '-')? Dengan begitu saya bisa mengatur tabel pivot untuk mendapatkan data mereka dari rentang itu dan saya tidak perlu khawatir tentang tanda hubung.
Ajedi32
Saya telah memperluas jawaban saya untuk menjelaskan bagaimana Anda bisa membuat tabel pivot tidak termasuk tanda hubung. Mencoba untuk menempatkan tabel "dash-less" hanya akan mentransfer masalah dasbor ke lembar lain, dengan # N / A di dalam sel dasbor kecuali jika tabel baru diukur dengan tangan setiap kali jumlah baris dalam sumber data berubah.
chuff
5

Saya menemukan cara untuk melakukannya. Solusi ini sedikit rumit dan membutuhkan kedua tabel untuk memiliki lembar terpisah mereka sendiri (dengan tidak ada yang lain pada mereka), tetapi selain itu ia melakukan hampir persis apa yang saya inginkan. (Tampaknya juga ada banyak potensi di sini untuk melakukan operasi yang lebih kompleks seperti bergabung.)

Buka tab data pada pita, klik "Dari Sumber Lain", dan "Dari Microsoft Query". Kemudian klik File Excel, pilih file yang sedang Anda kerjakan dan klik oke. Lalu, tekan batal dan ketika dipromosikan apakah Anda ingin terus mengedit di Microsoft Query, tekan "Ya". Dari sini Anda dapat mengklik tombol SQL dan menulis Query SQL kustom pada setiap lembar dalam spreadsheet. Dalam kasus saya:

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

Catatan: Bagi saya, metode ini berhenti berfungsi setelah saya menutup file dan membukanya lagi. Saya tetap mempostingnya di sini, kalau-kalau itu hanya masalah dengan komputer saya atau orang lain bisa membuatnya berfungsi.

Ajedi32
sumber
1
Ini berfungsi dengan baik menghubungkan dua buku kerja yang berbeda. Itulah tepatnya yang saya butuhkan. Terima kasih!
daVe
Metode ini bekerja sangat baik untuk saya. Jalankan query, lalu salin data dan lalu ke excel. Namun, penting untuk dicatat bahwa ini akan menghapus setiap baris duplikat dari data Anda, saya harap Anda tidak keberatan jika saya mengedit sedikit jawaban ini.
Some_Guy
Menambahkan karena ini benar-benar terjadi pada saya, hampir menggunakan ini untuk menggabungkan banyak data penjualan menjadi 1 spreadsheet sebelum membuat pivottable untuk mendapatkan total, dan saya akan mendapatkan beberapa kesalahan di mana volume yang sama dari suatu produk yang dijual beberapa kali akan memiliki terjawab.
Some_Guy
@Beberapa_Guy Gunakan saja UNION ALL.
Ajedi32
3

Jika Anda tertarik dengan solusi VBA, saya bisa membuat yang berikut ini berfungsi:

  • Tetapkan rentang bernama dinamis untuk data yang Anda tarik dari SQL Server. Buka Name Manager, masukkan nama baru, (katakanlah, "SQLDB") dan dan salin rumus berikut ini di kotak input referensi. Saya berasumsi bahwa data Anda yang ditarik ada di Sheet1:

    =OFFSET(Sheet1!$A$1,0,0,COUNTA(Sheet1!$A:$A),COUNTA(Sheet1!$1:$1))
    
  • Tetapkan rentang bernama lain untuk rentang di mana data manual dimasukkan. Saya menggunakan nama EXCELRNG dan menganggap itu di Sheet2. Rentang bernama dimulai pada baris 2 untuk mengecualikan baris header. Rumus di sini identik dengan yang pertama kecuali untuk lembar yang mengacu pada:

    =OFFSET(Sheet2!$A$1,1,0,COUNTA(Sheet2!$A:$A)-1,COUNTA(Sheet2!$1:$1))
    
  • Berikut adalah set pertama pengaturan yang saya gunakan untuk koneksi ke tabel SQL. Kotak dialog diakses dengan memilih Koneksi di tab Data pada Pita. Menonaktifkan penyegaran latar belakang memastikan bahwa makro VBA berhenti hingga penyegaran data di lembar Excel selesai. Memiliki koneksi refresh ketika lembar kerja terbuka mungkin tidak diperlukan, tetapi saya ingin memastikan bahwa otentikasi akan dilakukan sebelum makro dijalankan.

pengaturan koneksi

  • Ini adalah set kedua dari pengaturan. Ini ditemukan di bagian Properties dari tab Data (sementara sel dalam tabel SQL yang diimpor dipilih). Meskipun saya memilih opsi "Sisipkan seluruh baris untuk data baru, hapus sel yang tidak digunakan," saya sebenarnya tidak mengalami masalah dengan opsi "Sisipkan sel ...".

properti koneksi

  • Akhirnya, ini adalah kode VBA. Untuk memasukkannya, pilih Visual Basic di bawah tab Developer. Sorot nama lembar kerja dalam daftar di sebelah kiri. Ini akan dirujuk sebagai "VBA Project (nama lembar). Kemudian pilih Sisipkan Modul di bilah menu di bagian atas layar, dan rekatkan kode dalam modul baru. Perhatikan bahwa saya meletakkan tabel konsolidasi di Sheet3. Seperti yang tertulis, makro tidak mengurutkan tabel baru, meskipun itu tidak akan sulit untuk ditambahkan.

    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
    
orang yg kurang ajar
sumber
Ini terlihat seperti solusi yang cukup solid. Saya punya beberapa pertanyaan. Apa yang memicu makro ini? Itu hanya secara otomatis berjalan ketika Anda me-refresh koneksi data, atau Anda harus menekan tombol terpisah untuk menjalankannya secara manual? Kedua, ini bekerja dengan tabel kan? (Bukan hanya rentang yang tidak diformat sebagai tabel) Jika itu masalahnya, tidak bisakah tabel itu sendiri menangani penyortiran? (Alih-alih makro VBA melakukan penyortiran, seperti yang Anda sarankan?)
Ajedi32
1
Seperti berdiri, Anda akan menjalankan makro dengan memilih makro dari tab Pengembang dan kemudian memilih dan menjalankan makro. Dua alternatif: Tetapkan ke tombol kustom pada Ribbon dan gunakan itu untuk menjalankannya; atau sematkan sebagai kode makro dalam acara Worksheet_Activate. Ini akan menjalankannya setiap kali Anda memilih lembar konsolidasi. Ini akan bekerja dengan tabel, yang dapat melakukan penyortiran. Namun, saya tidak yakin apakah tabel secara otomatis resor saat data ditambahkan.
chuff
3

Berikut adalah versi solusi "Pure Excel" @ chuff yang dirancang khusus untuk bekerja dengan tabel. (IE Dua sumber data yang ingin Anda gabungkan adalah tabel.)

Perbedaan utama antara metode ini dan satu chuff yang diposting dalam jawabannya adalah bahwa Anda tidak perlu menentukan rentang bernama untuk dua set data yang Anda gabungkan, karena mereka adalah tabel dan sudah memiliki rentang nama mereka sendiri. Jadi lanjutkan dan beri nama tabel pertama Anda Table1, dan tabel kedua Anda Table2.

Sekarang, buat tabel baru di sudut kiri atas lembar baru dan berikan nama kolom yang sama dengan dua tabel lainnya. Lalu masukkan rumus berikut ini di sel A2 lembar yang baru saja Anda buat:

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

Selanjutnya, salin rumus ini di semua kolom tabel, dan kemudian ke bawah sampai hasil rumus semua tanda hubung ("-"). Catatan: Mengurutkan tabel baru ini tidak akan melakukan apa-apa, karena isi setiap sel sebenarnya identik (semuanya berisi rumus yang sama).

Jika kolom dalam tabel gabungan menampilkan 0 saat mereka seharusnya menampilkan sel kosong, Anda bisa membungkus rumus di kolom itu dengan fungsi pengganti, seperti ini:

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

Jika Anda ingin membuat tabel pivot yang menggunakan data dari tabel baru ini, Anda harus membuat rentang bernama. Pertama, beri nama tabel Table3. Sekarang, buka tab formula dan klik "Tentukan Nama". Beri nama pada referensi, masukkan persamaan berikut untuk nilainya ("Merujuk pada"):

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

Anda kemudian dapat menggunakan referensi bernama ini sebagai rentang untuk Tabel Pivot Anda.

Ajedi32
sumber
0

Jika Anda hanya menginginkan hasil satu kali saja, ada situs web yang akan menggabungkan dua tabel untuk Anda: https://office-tools.online/table/merge/

Anda menempelkan tabel ke halaman web dan memilih parameter yang relevan. Berikut screenshot dari contoh bawaan yang menunjukkan cara menggunakannya:

masukkan deskripsi gambar di sini

Hvg Hng
sumber