[Xin nhờ giúp đỡ] Cách đối chiếu dữ liệu giữa hai biểu

Liên hệ QC
Tôi tuân thủ nội quy khi đăng bài
Nói thế có nghĩa là so sánh 1 cột nào đó của 5 file tạm gọi là % file nguồn) với 1 cột của 1 file (tạm gọi là file Đích) với điều kiện dữ liệu có (mã số công lệnh, mã hàng, kích thước, tên phụ kiện) như nhau được kết quả phản ánh vào 5 cột của sheet so sánh của file đích.
Dạ vâng ý của em đúng là như vậy ạ
 
Bạn nên đưa tất cả các sheet liên quan vào 1 file chuyên phục vụ việc đối chíêu
sheet "bilieu"
sheet "taohinh"
sheet "khaiphat"
sheet "thanhhinh"
sheet .....
Sau đó code sẽ tại 1 sheet "ketqua" và 1 kết quả đối chiếu giữa các sheet liên quan nhập xuất nội bộ với nhau sẽ thể hiện tại đây.
Post file lên rồi tính tiếp
 
Bạn nên đưa tất cả các sheet liên quan vào 1 file chuyên phục vụ việc đối chíêu
sheet "bilieu"
sheet "taohinh"
sheet "khaiphat"
sheet "thanhhinh"
sheet .....
Sau đó code sẽ tại 1 sheet "ketqua" và 1 kết quả đối chiếu giữa các sheet liên quan nhập xuất nội bộ với nhau sẽ thể hiện tại đây.
Post file lên rồi tính tiếp
Em cảm ơn anh ạ, em đã tổng hợp lại các file cần dùng theo lời khuyên của anh, cũng như đã nêu mô tả trong mỗi file rồi ạ, mong được anh giúp đỡ ạ.
 

File đính kèm

  • File Tong Hop Cac To.rar
    166.7 KB · Đọc: 2
Mình đã đưa tất cả vào 1 file, đặt lại tên sheet với số thứ tự và tên , ví dụ
1BiLieu
2Taohinh
...
Và 1 sheet "Doichieu" để lưu kết quả đối chiếu.
Sheet này sẽ lưu mỗi dòng mã hàng với 10 cột cho 5 sheet, mỗi sheet gồm N và X
Sau đó dùng Conditional formating để tô màu những chỗ nào mà X-N không khớp nhau
Trong file ví dụ thì từ 1-4 là khớp, chỉ có sheet 5 Dán keo là 1 mình nó 1 mã nên không khớp

PHP:
Option Explicit
Sub doichieu()
Dim lr&, i&, k&, m&, rng, res(1 To 10000, 1 To 12), st$, n
Dim ws As Worksheet, dic As Object
Set dic = CreateObject("Scripting.Dictionary")
For Each ws In Sheets
    n = Left(ws.Name, 1)
    If IsNumeric(n) Then
        lr = ws.Cells(Rows.Count, "C").End(xlUp).Row
        rng = ws.Range("B5:H" & lr).Value
        For i = 1 To UBound(rng)
            st = rng(i, 1) & "|" & rng(i, 2) & "|" & rng(i, 3) & "|" & rng(i, 4)
            If Not dic.exists(st) Then
                dic.Add st, ""
                k = k + 1: res(k, 1) = st
                res(k, n * 2) = rng(i, 6)
                res(k, n * 2 + 1) = rng(i, 7)
            Else
                For m = 1 To k
                    If res(m, 1) = st Then
                        res(m, n * 2) = res(m, n * 2) + rng(i, 6)
                        res(m, n * 2 + 1) = res(m, n * 2 + 1) + rng(i, 7)
                    End If
                Next
            End If
        Next
    End If
Next
dic.RemoveAll
Sheets("Doichieu").Activate
Range("B5:L10000").ClearContents
Range("B5").Resize(k, 12).Value = res
End Sub
 

File đính kèm

  • DoiChieu.xlsm
    242.2 KB · Đọc: 4
Mình đã đưa tất cả vào 1 file, đặt lại tên sheet với số thứ tự và tên , ví dụ
1BiLieu
2Taohinh
...
Và 1 sheet "Doichieu" để lưu kết quả đối chiếu.
Sheet này sẽ lưu mỗi dòng mã hàng với 10 cột cho 5 sheet, mỗi sheet gồm N và X
Sau đó dùng Conditional formating để tô màu những chỗ nào mà X-N không khớp nhau
Trong file ví dụ thì từ 1-4 là khớp, chỉ có sheet 5 Dán keo là 1 mình nó 1 mã nên không khớp

PHP:
Option Explicit
Sub doichieu()
Dim lr&, i&, k&, m&, rng, res(1 To 10000, 1 To 12), st$, n
Dim ws As Worksheet, dic As Object
Set dic = CreateObject("Scripting.Dictionary")
For Each ws In Sheets
    n = Left(ws.Name, 1)
    If IsNumeric(n) Then
        lr = ws.Cells(Rows.Count, "C").End(xlUp).Row
        rng = ws.Range("B5:H" & lr).Value
        For i = 1 To UBound(rng)
            st = rng(i, 1) & "|" & rng(i, 2) & "|" & rng(i, 3) & "|" & rng(i, 4)
            If Not dic.exists(st) Then
                dic.Add st, ""
                k = k + 1: res(k, 1) = st
                res(k, n * 2) = rng(i, 6)
                res(k, n * 2 + 1) = rng(i, 7)
            Else
                For m = 1 To k
                    If res(m, 1) = st Then
                        res(m, n * 2) = res(m, n * 2) + rng(i, 6)
                        res(m, n * 2 + 1) = res(m, n * 2 + 1) + rng(i, 7)
                    End If
                Next
            End If
        Next
    End If
Next
dic.RemoveAll
Sheets("Doichieu").Activate
Range("B5:L10000").ClearContents
Range("B5").Resize(k, 12).Value = res
End Sub
dạ vâng em cảm ơn anh nhiều ạ
 
dạ vâng em cảm ơn anh nhiều ạ
@phanmoi688 . Bạn đã có đáp án rồi. Code của anh bebo 021999 là code sịn đó.
tuy nhiên nếu bạn muốn tham khảo thêm thì hãy xem code trong file đính kèm dưới đây.
Thay đổi đường dẫn ở ô L2 cho phù hợp.
Nhấn nút "Chạy code so sánh cột nhập của Flie này với cột xuất của file khác" và mở các file "01.....","02...",.... để xem kết quả.
 

File đính kèm

  • TongHop.xlsm
    39.3 KB · Đọc: 3
@phanmoi688 . Bạn đã có đáp án rồi. Code của anh bebo 021999 là code sịn đó.
tuy nhiên nếu bạn muốn tham khảo thêm thì hãy xem code trong file đính kèm dưới đây.
Thay đổi đường dẫn ở ô L2 cho phù hợp.
Nhấn nút "Chạy code so sánh cột nhập của Flie này với cột xuất của file khác" và mở các file "01.....","02...",.... để xem kết quả.
Dạ em cảm ơn anh đã cho em thêm một cách để tham khảo, nhân tiện anh có thể hướng dẫn em sửa lại đoạn code này để nó hoạt động được không ạ, do ban đầu code báo lỗi "Syntax error" nên em đã thêm 1 dấu " vào chỗ code báo lỗi (em đã đánh dấu chỗ bị lỗi trên ảnh), thì code báo ra lỗi khác, mong được anh giúp ạ.
 

File đính kèm

  • screenshot_1713507600.png
    screenshot_1713507600.png
    166.9 KB · Đọc: 5
Dạ em cảm ơn anh đã cho em thêm một cách để tham khảo, nhân tiện anh có thể hướng dẫn em sửa lại đoạn code này để nó hoạt động được không ạ, do ban đầu code báo lỗi "Syntax error" nên em đã thêm 1 dấu " vào chỗ code báo lỗi (em đã đánh dấu chỗ bị lỗi trên ảnh), thì code báo ra lỗi khác, mong được anh giúp ạ.
Tôi đặt Col= Appication.Worksheet Function.Match(Range(A3:Z3),"Ghi chú",0) để tìm cột Ghi chú nhằm ghi kết quả vào cột đó.
Như trong hình thì là Lỗi đó là hàm Match không tìm thấy chữ "Ghi chú" trong range(A3:Z3) của sheet muốn gán kết quả.
Bạn thử kiểm tra lại xem range(A3:z3) có là dòng tiêu đề không? Và trong dòng tiêu đề ấy có cột Ghi chú không? Lưu ý chữ ghi chú giống chữ ghi chú trong code.
nếu vẫn không được bạn thử chuyển nó về chữ in hoa hết xem sao.
 
Lần chỉnh sửa cuối:
Khi VBA gọi hàm của Application.WorksheetFunction thì hai thằng này không thống nhất nhau về lỗi. Vì vậy lúc dịch code của lỗi trả về, sẽ xảy ra chuyện báo lỗi sai. Lý do rất dài dòng, và thực tế có biết lý do ta cũng chả làm gì được. Chỉ cần biết là khi dùng Application.WorksheetFunction.HàmGìĐó thì các lỗi #NA! nếu chạy trên bảng tính sẽ được coi như run time error trong code VBA gọi hàm.
Lỗi #NA! của hàm Match trên bảng tính là "không dò thấy dữ liệu"

@tác giả bài #28: trong bài #26 bạn có đề cập đến "code sịn". Tôi không bàn tới chỗ "sịn", chỉ nói chuyện "chuyên nghiệp"
Dân chuyên nghiệp tránh dùng Sheets trừ phi bắt buộc. Khi đề cập đến Collection của các bảng tính, họ luôn luôn dùng WorkSheets.
Sự khác biệt giữa Sheets và WorkSheets chắc bạn biết rồi nhưng tôi cũng nhắc qua cho các bạn chưa biết:
Collection WorkSheets chỉ chứa thuần một loại Object là bảng tính trong khi Collection Sheets chứa cả bảng chart.

1713552619587.png
 
Web KT
Back
Top Bottom