Code VBA so sánh dữ liệu giữa 2 bảng tính

Liên hệ QC

hongtram2804

Thành viên mới
Tham gia
7/11/16
Bài viết
15
Được thích
0
Xin chào anh chị GPE,

tình hình là em có 2 bảng dữ liệu mới và cũ và cần so sánh để tìm ra những sản phẩm khác nhau và copy vào 1 bảng thứ 3, em có làm sẵn file mẫu nhờ anh chị xem giúp và chỉ giúp em code để chạy ra được như vậy nha.

Em tô màu đỏ cho dễ nhìn thôi, code không cần tô màu. Khi so sánh thì cần dựa vào 3 cột là Diễn giải, chủng loại và số lượng.

Nhờ anh chị xem giúp em code cho phần so sánh này nha, em xin cảm ơn trước ạ.
 

File đính kèm

  • VBA-CODE SO SANH DU LIEU (1).xlsm
    10.8 KB · Đọc: 59
Xin chào anh chị GPE,

tình hình là em có 2 bảng dữ liệu mới và cũ và cần so sánh để tìm ra những sản phẩm khác nhau và copy vào 1 bảng thứ 3, em có làm sẵn file mẫu nhờ anh chị xem giúp và chỉ giúp em code để chạy ra được như vậy nha.

Em tô màu đỏ cho dễ nhìn thôi, code không cần tô màu. Khi so sánh thì cần dựa vào 3 cột là Diễn giải, chủng loại và số lượng.

Nhờ anh chị xem giúp em code cho phần so sánh này nha, em xin cảm ơn trước ạ.

Có trường hợp nào cùng 1 [diễn giải] nhưng có nhiều hơn 1 [chủng loại] không bạn? Ví dụ bạn đưa chưa thấy trường hợp đó.
 
Upvote 0
Có trường hợp nào cùng 1 [diễn giải] nhưng có nhiều hơn 1 [chủng loại] không bạn? Ví dụ bạn đưa chưa thấy trường hợp đó.

Vẫn có trường hợp đó anh ạ, nên em mới nói dựa vào 3 cột để so sánh.
Nếu Diễn giải giống nhau thì check tiếp chủng loại rồi đến số lượng.
 
Upvote 0
Xin chào anh chị GPE,

tình hình là em có 2 bảng dữ liệu mới và cũ và cần so sánh để tìm ra những sản phẩm khác nhau và copy vào 1 bảng thứ 3, em có làm sẵn file mẫu nhờ anh chị xem giúp và chỉ giúp em code để chạy ra được như vậy nha.

Em tô màu đỏ cho dễ nhìn thôi, code không cần tô màu. Khi so sánh thì cần dựa vào 3 cột là Diễn giải, chủng loại và số lượng.

Nhờ anh chị xem giúp em code cho phần so sánh này nha, em xin cảm ơn trước ạ.

Bạn check code này và thay đổi theo dữ liệu gốc của bạn
Mã:
Sub sosanh()
    Dim Query As String
    Set cn = CreateObject("ADODB.Connection")
    cn.Open ("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties=""Excel 8.0;HDR=No;IMEX=1"";")
    Query = "select a.f1, a.f2, '', a.moi, b.cu from "
    Query = Query & "(select f1,f2,sum(f4) as moi from [Du lieu$C4:F17] group by f1,f2) a inner join (select f1,f2,sum(f4) as cu from [Du lieu$P4:S16] group by f1,f2) b on a.f1 = b.f1 and a.f2 = b.f2 and a.moi <>b.cu"
    Query = Query & Chr(10) & " union all select a.f1, a.f2, '', a.moi, '' from (select f1,f2,sum(f4) as moi from [Du lieu$C4:F17] group by f1,f2) a where a.f1 not in (select f1 from [Du lieu$P4:S16]) " & _
            " or a.f2 not in (select f2 from [Du lieu$P4:S16]) or a.f2 not in (select f2 from [Du lieu$P4:S16] b where b.f1 = a.f1)"
    Range("I15").CopyFromRecordset cn.Execute(Query)
End Sub
 
Upvote 0
Bạn check code này và thay đổi theo dữ liệu gốc của bạn
Mã:
Sub sosanh()
    Dim Query As String
    Set cn = CreateObject("ADODB.Connection")
    cn.Open ("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties=""Excel 8.0;HDR=No;IMEX=1"";")
    Query = "select a.f1, a.f2, '', a.moi, b.cu from "
    Query = Query & "(select f1,f2,sum(f4) as moi from [Du lieu$C4:F17] group by f1,f2) a inner join (select f1,f2,sum(f4) as cu from [Du lieu$P4:S16] group by f1,f2) b on a.f1 = b.f1 and a.f2 = b.f2 and a.moi <>b.cu"
    Query = Query & Chr(10) & " union all select a.f1, a.f2, '', a.moi, '' from (select f1,f2,sum(f4) as moi from [Du lieu$C4:F17] group by f1,f2) a where a.f1 not in (select f1 from [Du lieu$P4:S16]) " & _
            " or a.f2 not in (select f2 from [Du lieu$P4:S16]) or a.f2 not in (select f2 from [Du lieu$P4:S16] b where b.f1 = a.f1)"
    Range("I15").CopyFromRecordset cn.Execute(Query)
End Sub

Đọc hoa cả mắt -+*/-+*/ . híc
Có nhã hứng mời tham gia tiết mục hỏi xoáy đáp xoay cuối tuần :
Làm sao để chỉ thực hiện truy vấn
Mã:
select from [Du lieu$C4:F]

Mã:
select from [Du lieu$P4:S]
chỉ 1 lần duy nhất trong Query ? !$@!!!$@!!!$@!!

Theo như code ở trên thì bạn đang gọi đến mỗi bảng >2 lần rồi
Chúc may mắn ;;;;;;;;;;;;;;;;;;;;;;
 
Upvote 0
Đọc hoa cả mắt -+*/-+*/ . híc
Có nhã hứng mời tham gia tiết mục hỏi xoáy đáp xoay cuối tuần :
Làm sao để chỉ thực hiện truy vấn
Mã:
select from [Du lieu$C4:F]

Mã:
select from [Du lieu$P4:S]
chỉ 1 lần duy nhất trong Query ? !$@!!!$@!!!$@!!

Theo như code ở trên thì bạn đang gọi đến mỗi bảng >2 lần rồi
Chúc may mắn ;;;;;;;;;;;;;;;;;;;;;;

Hi, theo gợi ý của anh, em sửa code lại thế này vậy
Mã:
Sub sosanh()
    Dim Query As String
    Set cn = CreateObject("ADODB.Connection")
    cn.Open ("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties=""Excel 8.0;HDR=No;IMEX=1"";")
    Query = "select a.f1, a.f2, '', a.moi, b.cu from (select f1,f2,sum(f4) as moi from [Du lieu$C4:F] group by f1,f2) a "
    Query = Query & "left join (select f1,f2,sum(f4) as cu from [Du lieu$P4:S] group by f1,f2) b on a.f1 = b.f1 and a.f2 = b.f2 where b.f1 is null or a.moi <> b.cu"
    Range("I15").CopyFromRecordset cn.Execute(Query)
    Set cn = Nothing
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Hi, theo gợi ý của anh, em sửa code lại thế này vậy
Mã:
Sub sosanh()
    Dim Query As String
    Set cn = CreateObject("ADODB.Connection")
    cn.Open ("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties=""Excel 8.0;HDR=No;IMEX=1"";")
    Query = "select a.f1, a.f2, '', a.moi, b.cu from (select f1,f2,sum(f4) as moi from [Du lieu$C4:F] group by f1,f2) a "
    Query = Query & "left join (select f1,f2,sum(f4) as cu from [Du lieu$P4:S] group by f1,f2) b on a.f1 = b.f1 and a.f2 = b.f2 where b.f1 is null or a.moi <> b.cu"
    Range("I15").CopyFromRecordset cn.Execute(Query)
    Set cn = Nothing
End Sub

Cảm ơn anh rất nhiều

Cái nỳ thuộc trình độ giáo sư mất rồi, em chưa thể hiểu nổi làm sao bào chế đây, để test thử xem sao.
 
Upvote 0
Hi, theo gợi ý của anh, em sửa code lại thế này vậy
Mã:
Sub sosanh()
    Dim Query As String
    Set cn = CreateObject("ADODB.Connection")
    cn.Open ("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties=""Excel 8.0;HDR=No;IMEX=1"";")
    Query = "select a.f1, a.f2, '', a.moi, b.cu from (select f1,f2,sum(f4) as moi from [Du lieu$C4:F] group by f1,f2) a "
    Query = Query & "left join (select f1,f2,sum(f4) as cu from [Du lieu$P4:S] group by f1,f2) b on a.f1 = b.f1 and a.f2 = b.f2 where b.f1 is null or a.moi <> b.cu"
    Range("I15").CopyFromRecordset cn.Execute(Query)
    Set cn = Nothing
End Sub
sd
Xin chào anh quanluu1989,

Sau khi test code sơ bộ thì em thấy đã chạy ok, nhưng cần chỉnh lại 1 chút, khi mặt hàng bên bảng 2 ( dữ liệu cũ) có mà bảng 1 không có thì nó cũng phải thể hiện trong bảng so sánh luôn nha anh. Hiện tại code này khi bảng 1 có thì nó mới so sánh.

Nhờ anh chỉnh code lại giúp em với nha.
 
Upvote 0
sd
Xin chào anh quanluu1989,

Sau khi test code sơ bộ thì em thấy đã chạy ok, nhưng cần chỉnh lại 1 chút, khi mặt hàng bên bảng 2 ( dữ liệu cũ) có mà bảng 1 không có thì nó cũng phải thể hiện trong bảng so sánh luôn nha anh. Hiện tại code này khi bảng 1 có thì nó mới so sánh.

Nhờ anh chỉnh code lại giúp em với nha.

qủa này phải gọi table 2 lần rùi. ko biết @doveandrose có cao kiến gì ko?
Mã:
Sub sosanh()
    Dim Query As String
    Set cn = CreateObject("ADODB.Connection")
    cn.Open ("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties=""Excel 8.0;HDR=No;IMEX=1"";")
    Query = "select a.f1, a.f2, '', a.moi, b.cu from (select f1,f2,sum(f4) as moi from [Du lieu$C4:F] group by f1,f2) a "
    Query = Query & "left join (select f1,f2,sum(f4) as cu from [Du lieu$P4:S] group by f1,f2) b on a.f1 = b.f1 and a.f2 = b.f2 where b.f1 is null or a.moi <> b.cu "
    
    Query = Query & "union all select b.f1, b.f2, '', '', sum(b.f4) from [Du lieu$C4:F]  a "
    Query = Query & "right join [Du lieu$P4:S] b on a.f1 = b.f1 and a.f2 = b.f2 where a.f1 is null and b.f1 is not null group by b.f1, b.f2"
    Range("I15").CopyFromRecordset cn.Execute(Query)
    Set cn = Nothing
End Sub
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
qủa này phải gọi table 2 lần rùi. ko biết @doveandrose có cao kiến gì ko?
Mã:
Sub sosanh()
    Dim Query As String
    Set cn = CreateObject("ADODB.Connection")
    cn.Open ("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties=""Excel 8.0;HDR=No;IMEX=1"";")
    Query = "select a.f1, a.f2, '', a.moi, b.cu from (select f1,f2,sum(f4) as moi from [Du lieu$C4:F] group by f1,f2) a "
    Query = Query & "left join (select f1,f2,sum(f4) as cu from [Du lieu$P4:S] group by f1,f2) b on a.f1 = b.f1 and a.f2 = b.f2 where b.f1 is null or a.moi <> b.cu "
    
    Query = Query & "union all select b.f1, b.f2, '', a.moi, b.cu from (select f1,f2,sum(f4) as moi from [Du lieu$C4:F] group by f1,f2) a "
    Query = Query & "right join (select f1,f2,sum(f4) as cu from [Du lieu$P4:S] group by f1,f2) b on a.f1 = b.f1 and a.f2 = b.f2 where a.f1 is null and b.f1 is not null"
    Range("I15").CopyFromRecordset cn.Execute(Query)
    Set cn = Nothing
End Sub

ủa sao càng lúc càng lầy vậy anh Quanluu1989 ? -+*/-+*/
Vấn đề không phức tạp thế , thậm chí trong Query chỉ cần gọi lệnh group by 1 lần duy nhất nữa cơ . hi hi ;;;;;;;;;;;;;;;;;;;;;;
 
Upvote 0
ủa sao càng lúc càng lầy vậy anh Quanluu1989 ? -+*/-+*/
Vấn đề không phức tạp thế , thậm chí trong Query chỉ cần gọi lệnh group by 1 lần duy nhất nữa cơ . hi hi ;;;;;;;;;;;;;;;;;;;;;;
Em chỉ rút gọn lại code #9 vế sau union thui, chứ Group by 1 lần duy nhất thì quả thật là em bó tay +-+-+-++-+-+-++-+-+-+
 
Upvote 0
Em chỉ rút gọn lại code #9 vế sau union thui, chứ Group by 1 lần duy nhất thì quả thật là em bó tay +-+-+-++-+-+-++-+-+-+

thấy bạn căng quá tôi cũng đâm ... lo . Không biết mình có hiểu sai đề bài không nữa . Thôi thì nhờ bạn kiểm tra hộ vậy **~****~**
Mã:
"select f1,f2,null,sum(f10),sum(f11) from " & _
" (select f1,f2,f4 as f10,null as f11 from [Du lieu$C4:F] " & _
" union all select f1,f2,null,f4 from [Du lieu$P4:S]) group by f1,f2 " & _
" having sum(f10) <> sum(f11) or sum(f10) is null or sum(f11) is null"
 
Upvote 0
Em chỉ rút gọn lại code #9 vế sau union thui, chứ Group by 1 lần duy nhất thì quả thật là em bó tay +-+-+-++-+-+-++-+-+-+
.
Xin chào anh quanluu1989

Code chạy ok rồi ạ, nhưng không hiểu sao nó cứ có khoảng trống dòng đầu tiên, khi em làm tiêu đề vào thì nó bị cách 1 dòng trống rất kì. Anh xem giúp em để mất luôn dòng đó nha.
Em cảm ơn anh.
 
Upvote 0
Chào hongtram2804,

Đã hỏi bạn ở bài #2 nên tôi cũng làm thử.
Bạn xem file đính kèm nhé.
Kết quả sẽ riêng biệt theo 2 bảng dữ liệu cũ/mới. Nếu bạn cần sort theo [diễn giải] như kết quả ban đầu thì chọn cột [diễn giải] rồi sort A-Z là được.
 

File đính kèm

  • so sanh.xlsb
    20.7 KB · Đọc: 69
Upvote 0
.
Xin chào anh quanluu1989

Code chạy ok rồi ạ, nhưng không hiểu sao nó cứ có khoảng trống dòng đầu tiên, khi em làm tiêu đề vào thì nó bị cách 1 dòng trống rất kì. Anh xem giúp em để mất luôn dòng đó nha.
Em cảm ơn anh.
Code của @doveandrose rất ngắn gọn và nhanh, bạn dùng code đó nhé

Mã:
Sub sosanh()
    Dim Query As String
    Set cn = CreateObject("ADODB.Connection")
    cn.Open ("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties=""Excel 8.0;HDR=No;IMEX=1"";")
    Query = "select f1,f2,null,sum(f10),sum(f11) from " & _
            " (select f1,f2,f4 as f10,null as f11 from [Du lieu$C4:F] " & _
            " union all select f1,f2,null,f4 from [Du lieu$P4:S]) group by f1,f2 " & _
            " having (sum(f10) <> sum(f11) or sum(f10) is null or sum(f11) is null) and f1 is not null"
    Range("I15").CopyFromRecordset cn.Execute(Query)
    Set cn = Nothing
End Sub
 
Upvote 0
thấy bạn căng quá tôi cũng đâm ... lo . Không biết mình có hiểu sai đề bài không nữa . Thôi thì nhờ bạn kiểm tra hộ vậy **~****~**
Mã:
"select f1,f2,null,sum(f10),sum(f11) from " & _
" (select f1,f2,f4 as f10,null as f11 from [Du lieu$C4:F] " & _
" union all select f1,f2,null,f4 from [Du lieu$P4:S]) group by f1,f2 " & _
" having sum(f10) <> sum(f11) or sum(f10) is null or sum(f11) is null"

Tôi không biết điều kiện chủa chủ thớt là gì cho nên chả thể xét truy vấn như vầy là đúng hay sai.
Chỉ cảnh báo như thế này:
Theo luật toán, so sánh tổng là một con toán hết sức nguy hiểm. Kết quả có thể sai mà không biết.
3, 5 khác với 2, 6 nhưng 3+5 = 2+6
 
Upvote 0
Chào hongtram2804,

Đã hỏi bạn ở bài #2 nên tôi cũng làm thử.
Bạn xem file đính kèm nhé.
Kết quả sẽ riêng biệt theo 2 bảng dữ liệu cũ/mới. Nếu bạn cần sort theo [diễn giải] như kết quả ban đầu thì chọn cột [diễn giải] rồi sort A-Z là được.
.
Xin chào anh befaint,
Cảm ơn anh rất nhiều, code của anh chạy ok rồi ạ.
 
Upvote 0
Code của @doveandrose rất ngắn gọn và nhanh, bạn dùng code đó nhé

Mã:
Sub sosanh()
    Dim Query As String
    Set cn = CreateObject("ADODB.Connection")
    cn.Open ("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties=""Excel 8.0;HDR=No;IMEX=1"";")
    Query = "select f1,f2,null,sum(f10),sum(f11) from " & _
            " (select f1,f2,f4 as f10,null as f11 from [Du lieu$C4:F] " & _
            " union all select f1,f2,null,f4 from [Du lieu$P4:S]) group by f1,f2 " & _
            " having (sum(f10) <> sum(f11) or sum(f10) is null or sum(f11) is null) and f1 is not null"
    Range("I15").CopyFromRecordset cn.Execute(Query)
    Set cn = Nothing
End Sub
.
Code ok rồi anh ạ, Code của anh chưa hiểu kịp thì gặp code này còn khó hiểu hơn.hjc hjc.
 
Upvote 0
cho mình hỏi với file này các bạn có thể để cột số lượng sau nằm ngang hàng với số lượng trước dc ko?
 
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom