Làm cách nào để hợp nhất hai bảng trong Excel có các cột giống nhau?


11

Trong Excel, tôi có một bảng tính kéo dữ liệu từ Cơ sở dữ liệu SQL vào một bảng và sau đó tạo một báo cáo dựa trên dữ liệu đó. Thật không may, dữ liệu trong cơ sở dữ liệu SQL này không đầy đủ và tôi muốn bao gồm các hàng bổ sung trong tập kết quả được nhập thủ công vào bảng tính.

Nhiều như tôi muốn, tôi không thể tự chèn các hàng bổ sung này vào bảng vì chúng sẽ bị xóa bất cứ khi nào Excel lấy dữ liệu mới từ Cơ sở dữ liệu SQL. Vì vậy, thay vào đó, tôi đang xem xét việc tạo một bảng riêng biệt có cùng tiêu đề cột trên một trang tính mới và nhập dữ liệu vào đó, sau đó tạo bảng thứ ba trên một trang tính khác bằng cách kết hợp các hàng từ bảng lấy dữ liệu từ SQL và bảng nơi tôi nhập dữ liệu thủ công. Làm thế nào tôi có thể thực hiện điều này? (Hoặc thay vào đó, có cách nào tốt hơn để làm điều này mà bằng cách nào đó tôi đang thiếu?)


Thí dụ:

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     |

Bạn có ổn không nếu dữ liệu được thêm thủ công của bạn thấp hơn dữ liệu SQL của bạn? Hoặc họ phải được sắp xếp theo ngày. Excel sẽ không ghi đè các hàng ngay bên dưới các hàng dữ liệu SQL hiện có. Nhưng nếu cả hai loại dữ liệu phải được sắp xếp, thì toàn bộ điều phức tạp hơn.
nixda

Chà, tôi muốn chúng được sắp xếp nhưng điều đó không hoàn toàn cần thiết. Điều quan trọng là tôi có thể sử dụng các bảng trụ và các công cụ excel khác để phân tích toàn bộ tập dữ liệu (bao gồm cả các bảng được điền thủ công và tự động). Tôi cũng cần có khả năng tiếp tục tự động lấy dữ liệu mới từ SQL.
Ajedi32

Hành vi này sẽ là một giải pháp? Sau truy vấn đầu tiên và sau truy vấn thứ hai . Và tất nhiên Excel sẽ tự động cập nhật SQL của bạn khi bạn mở sổ làm việc.
nixda

Điều đó sẽ làm việc tôi đoán. Tôi muốn có dữ liệu trong một bảng để tôi có thể lọc, sắp xếp, v.v., nhưng như tôi đã nói trước đó không hoàn toàn cần thiết.
Ajedi32

có lẽ chúng tôi tìm thấy một giải pháp cho vấn đề sắp xếp của bạn. Nhưng đối với bước đầu tiên, chỉ cần truy vấn SQL của bạn lần đầu tiên trong một sổ làm việc mới. Sau đó, thêm các mục thủ công của bạn ngay bên dưới chúng. Bây giờ kiểm tra nó với một truy vấn thứ hai (và lớn hơn). Họ sẽ không bị ghi đè. Đó là một hành vi tiêu chuẩn. Không có gì đặc biệt để làm.
nixda

Câu trả lời:


2

Đây là một giải pháp Excel thuần túy không có VBA. Nó hoạt động bằng cách sử dụng hàm INDEX để bước xuống các hàng và trên các cột của dữ liệu SQL cho đến khi các giá trị cạn kiệt và kết quả là tình trạng lỗi. Hàm IFERROR bắt lỗi và sử dụng hàm INDEX thứ hai để bước xuống các hàng và trên các cột của dữ liệu được nhập thủ công, một lần nữa cho đến khi các giá trị đó cạn kiệt và kết quả là tình trạng lỗi. Hàm IFERROR thứ hai bắt lỗi và trả về dấu gạch ngang ("-"). (Dữ liệu SQL phải được làm mới thông qua Ribbon cho các công thức để tạo ra kết quả chính xác.)

Tạo một phạm vi SQLDB có tên động cho dữ liệu SQL trong Trang tính 1 bằng công thức:

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

Tạo một phạm vi động thứ hai có tên EXCELRNG cho dữ liệu được nhập thủ công trong Trang tính 2 bằng công thức:

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

Cả hai phạm vi được đặt tên này đều cho rằng các tên biến được nhập vào hàng 1 của mỗi trong hai tờ.

Nhập tên biến trong hàng 1 của Trang tính 3 (bắt đầu trong ô A1).

Nhập công thức sau Trong ô A2 của Trang 3:

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

Sao chép công thức qua các cột tên biến, rồi xuống các hàng cho đến khi kết quả của các công thức đều là dấu gạch ngang ("-").

Có thể là một bước tiếp theo để tạo Bảng Pivot trong một bảng khác để phân tích và tổ chức.

Một lần nữa, bước đầu tiên sẽ là tạo một phạm vi có tên động, giả sử, RESULTRNG, chèn công thức sau vào hộp nhập Trình quản lý tên cho phạm vi đã đặt tên:

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

Sau đó, tạo Bảng Pivot trong một trang tính mới, đặt RESULTRNG làm bảng bạn muốn phân tích. Điều này sẽ lọc bất kỳ dấu gạch ngang từ bảng công thức trong Bảng3.

Điều này hoạt động vì công thức RESULTRNG đếm tổng số hàng trong Trang tính 1 và Trang tính 2 (không bao gồm tiêu đề trong Trang tính 2) và tổng số cột trong Trang tính 1 và đặt phạm vi của nó dựa trên các số đếm đó, ngoại trừ bất kỳ dấu gạch ngang nào trong bất kỳ hàng nào ( hoặc cột) trong bảng công thức Sheet3.


Nếu tôi làm theo cách này mặc dù bảng kết hợp phải có kích thước cố định? Và nếu làm cho bảng lớn hơn mức cần thiết, liệu điều đó có làm tôi bối rối không nếu tôi cố tạo Bảng Pivot xử lý dữ liệu từ bảng kết hợp? (Bởi vì một số giá trị trong bảng sẽ '-' ký tự?) Hoặc có cách nào xung quanh những vấn đề này không?
Ajedi32

(Btw, tôi thường thích các giải pháp Excel thuần túy như giải pháp này vì chúng không yêu cầu người dùng kích hoạt macro trước khi chúng bắt đầu hoạt động.)
Ajedi32

Nó sẽ yêu cầu một số bảo trì bằng tay để đảm bảo các công thức đã thu thập tất cả dữ liệu trong hai bảng. Để tránh dấu gạch ngang, bạn chỉ cần sao chép các công thức xuống nơi chúng trả lại dữ liệu, không phải dấu gạch ngang.
chuff

Có thể tạo một phạm vi được đặt tên khác chỉ bao gồm các hàng từ bảng được hợp nhất không trống (chứa đầy các ký tự '-') không? Bằng cách đó, tôi chỉ có thể đặt các bảng trụ để lấy dữ liệu của chúng từ phạm vi đó và tôi sẽ không phải lo lắng về dấu gạch ngang.
Ajedi32

Tôi đã mở rộng câu trả lời của mình để giải thích cách bạn có thể tạo bảng xoay vòng trừ dấu gạch ngang. Cố gắng đặt bảng "không có dấu gạch ngang" sẽ chỉ chuyển vấn đề dấu gạch ngang sang một trang khác, với # N / A trong các ô gạch ngang trừ khi bảng mới có kích thước bằng tay mỗi khi số lượng hàng trong dữ liệu nguồn thay đổi.
chuff

5

Tôi tìm thấy một cách để làm điều đó. Giải pháp này hơi khó và nó đòi hỏi cả hai bảng phải có các trang riêng (không có gì khác trên chúng), nhưng ngoài ra nó gần như chính xác những gì tôi muốn. (Dường như cũng có rất nhiều tiềm năng ở đây để thực hiện các hoạt động phức tạp hơn như tham gia.)

Chuyển đến tab dữ liệu trên ruy-băng, bấm vào "Từ các nguồn khác" và "Từ truy vấn của Microsoft". Sau đó nhấp vào Tệp Excel, chọn tệp mà bạn hiện đang làm việc và nhấp vào ổn. Sau đó, nhấn hủy và khi được quảng cáo xem bạn có muốn tiếp tục chỉnh sửa trong Microsoft Query hay không, hãy nhấn "Có". Từ đây, bạn có thể nhấp vào nút SQL và viết Truy vấn SQL tùy chỉnh trên bất kỳ trang tính nào trong bảng tính. Trong trường hợp của tôi:

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

Lưu ý: Đối với tôi, phương pháp này dừng hoạt động sau khi tôi đóng tệp và mở lại. Dù sao tôi cũng đang đăng nó ở đây mặc dù trong trường hợp đó chỉ là sự cố với máy tính của tôi hoặc người khác có thể khiến nó hoạt động.


1
Nó hoạt động tốt kết nối hai sách bài tập khác nhau. Đó chính xác là những gì tôi cần. Cảm ơn bạn!
daVe

Phương pháp này hoạt động rất tốt cho tôi. Thực hiện truy vấn, sau đó chỉ cần sao chép dữ liệu và quá khứ vào excel. Tuy nhiên, điều quan trọng cần lưu ý là nó sẽ xóa bất kỳ hàng trùng lặp nào khỏi dữ liệu của bạn, tôi hy vọng bạn không phiền nếu tôi chỉnh sửa câu trả lời này một chút.
Một số_Guy

Thêm bởi vì điều này thực sự đã xảy ra với tôi, gần như đã sử dụng điều này để hợp nhất một loạt dữ liệu bán hàng vào 1 bảng tính trước khi tạo ra một số tổng hợp để có được một số tổng, và tôi sẽ nhận được một vài lỗi trong đó cùng một khối lượng sản phẩm được bán nhiều lần đã bị bỏ lỡ
Một số_Guy

@Some_Guy Chỉ cần sử dụng UNION ALL thay thế.
Ajedi32

3

Nếu bạn quan tâm đến giải pháp VBA, tôi có thể làm việc sau đây:

  • Đặt phạm vi được đặt tên động cho dữ liệu bạn đang lấy từ SQL Server. Mở Trình quản lý tên, nhập tên mới, (giả sử "SQLDB") và sao chép công thức sau vào hộp Nhập vào tham chiếu. Tôi đã giả sử rằng dữ liệu kéo vào của bạn nằm trong Trang tính 1:

    =OFFSET(Sheet1!$A$1,0,0,COUNTA(Sheet1!$A:$A),COUNTA(Sheet1!$1:$1))
    
  • Đặt một phạm vi được đặt tên khác cho phạm vi mà dữ liệu thủ công được nhập. Tôi đã sử dụng tên EXCELRNG và giả sử nó nằm trong Sheet2. Phạm vi được đặt tên bắt đầu trong hàng 2 để loại trừ một hàng tiêu đề. Công thức ở đây giống hệt với công thức đầu tiên ngoại trừ trang tính mà nó đề cập đến:

    =OFFSET(Sheet2!$A$1,1,0,COUNTA(Sheet2!$A:$A)-1,COUNTA(Sheet2!$1:$1))
    
  • Dưới đây là bộ cài đặt đầu tiên tôi sử dụng để kết nối với bảng SQL. Hộp thoại được truy cập bằng cách chọn Kết nối trong tab Dữ liệu trên Dải băng. Vô hiệu hóa làm mới nền đảm bảo rằng macro VBA tạm dừng cho đến khi làm mới dữ liệu trong bảng Excel hoàn tất. Có thể làm mới kết nối khi bảng tính mở có thể không cần thiết, nhưng tôi muốn chắc chắn rằng mọi xác thực sẽ được thực hiện trước khi macro được chạy.

cài đặt kết nối

  • Dưới đây là bộ cài đặt thứ hai. Chúng được tìm thấy trong phần Thuộc tính của tab Dữ liệu (trong khi một ô trong bảng SQL đã nhập được chọn). Mặc dù tôi đã chọn tùy chọn "Chèn toàn bộ hàng cho dữ liệu mới, xóa các ô không sử dụng", tôi thực sự không gặp phải rắc rối nào với tùy chọn "Chèn ô ...".

thuộc tính kết nối

  • Cuối cùng, đây là mã VBA. Để chèn nó, chọn Visual Basic trong tab Nhà phát triển. Đánh dấu tên bảng tính trong danh sách ở bên trái. Nó sẽ được tham chiếu là "Dự án VBA (tên trang tính). Sau đó chọn Chèn Mô-đun trong thanh menu ở đầu màn hình và dán mã vào mô-đun mới. Lưu ý rằng tôi đặt bảng tổng hợp vào Trang 3. Như đã viết, macro không sắp xếp bảng mới, mặc dù điều đó sẽ không khó để thêm.

    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
    

Đây trông giống như một giải pháp khá vững chắc. Tôi có một vài câu hỏi mặc dù. Điều gì kích hoạt vĩ mô này? Nó chỉ tự động chạy khi bạn làm mới các kết nối dữ liệu, hoặc bạn phải nhấn một nút riêng để chạy thủ công? Thứ hai, điều này làm việc với các bảng phải không? (Không chỉ các phạm vi không được định dạng dưới dạng bảng) Nếu đó là trường hợp, bảng có thể tự xử lý sắp xếp không? (Thay vì macro VBA thực hiện sắp xếp, như bạn đề xuất?)
Ajedi32

1
Khi nó đứng, bạn sẽ chạy macro bằng cách chọn Macro từ tab Nhà phát triển, sau đó chọn và chạy macro. Hai lựa chọn thay thế: Gán nó cho một nút tùy chỉnh trên Ribbon và sử dụng nút đó để chạy nó; hoặc nhúng nó dưới dạng mã macro trong một sự kiện Worksheet_Activate. Điều này sẽ chạy nó bất cứ khi nào bạn chọn bảng hợp nhất. Nó sẽ làm việc với các bảng, có thể thực hiện việc sắp xếp. Tuy nhiên, tôi không chắc liệu các bảng có tự động nghỉ khi dữ liệu được thêm vào hay không.
chuff

3

Đây là phiên bản của giải pháp "Pure Excel" của @ chuff được thiết kế dành riêng để làm việc với các bảng. (IE Hai nguồn dữ liệu bạn muốn hợp nhất là các bảng.)

Sự khác biệt chính giữa phương thức này và một chuff được đăng trong câu trả lời của anh ấy là bạn không cần xác định các phạm vi được đặt tên cho hai tập dữ liệu bạn đang hợp nhất, vì chúng là các bảng và đã có phạm vi được đặt tên riêng. Vì vậy, đi trước và đặt tên cho bảng đầu tiên của bạn Table1, và bảng thứ hai của bạn Table2.

Bây giờ, tạo một bảng mới ở góc trên cùng bên trái của một trang tính mới và đặt cho nó cùng tên cột với hai bảng khác. Sau đó nhập công thức sau vào ô A2 của trang tính bạn vừa tạo:

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

Tiếp theo, sao chép công thức này trên tất cả các cột của bảng, rồi xuống các hàng cho đến khi kết quả của các công thức đều là dấu gạch ngang ("-"). Lưu ý: Sắp xếp bảng mới này sẽ không làm gì cả, vì nội dung của mỗi ô thực sự giống hệt nhau (tất cả chúng đều chứa cùng một công thức).

Nếu các cột trong bảng được hợp nhất hiển thị 0 'khi chúng sẽ hiển thị một ô trống, bạn có thể bọc công thức trong cột đó bằng hàm thay thế, như sau:

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

Nếu bạn muốn tạo một bảng trụ sử dụng dữ liệu từ bảng mới này, bạn sẽ phải tạo một phạm vi được đặt tên. Đầu tiên, đặt tên cho bảng Table3. Bây giờ, đi đến tab công thức và nhấp vào "Xác định tên". Đặt tên tham chiếu, nhập phương trình sau cho giá trị của nó ("Tham chiếu đến"):

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

Sau đó, bạn có thể sử dụng tham chiếu có tên này làm phạm vi cho Bảng Pivot của mình.


0

Nếu bạn chỉ muốn một kết quả trên cơ sở một lần, có một trang web sẽ hợp nhất hai bảng cho bạn: https://office-tools.online/table/merge/

Bạn dán các bảng vào trang web và chọn các tham số liên quan. Dưới đây là ảnh chụp màn hình của ví dụ tích hợp cho biết cách sử dụng nó:

nhập mô tả hình ảnh ở đây

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.