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

Liên hệ QC

Người dùng đang xem chủ đề này

Tôi tuân thủ nội quy khi đăng bài

phanmoi688

Thành viên mới
Tham gia
20/3/24
Bài viết
24
Được thích
-5
- Em muốn dò dữ liệu nhập xuất giữa hai tổ (cột xuất của tổ bị liệu và cột nhập của tổ tạo hình) xem có chênh lệch hay không, ngoài việc dò số lượng nhập xuất của hai tổ em còn phải dò xem các trường: mã số công lệnh, mã hàng, kích thước, tên phụ kiện nữa (khi dò phải phát hiện được trong các trường trên có sai hoặc có thừa ký tự hay không, các trường này ở hai nhà cũng phải khớp nhau). Mong được mọi người giúp đỡ ạ.
 

File đính kèm

- Em muốn dò dữ liệu nhập xuất giữa hai tổ (cột xuất của tổ bị liệu và cột nhập của tổ tạo hình) xem có chênh lệch hay không, ngoài việc dò số lượng nhập xuất của hai tổ em còn phải dò xem các trường: mã số công lệnh, mã hàng, kích thước, tên phụ kiện nữa (khi dò phải phát hiện được trong các trường trên có sai hoặc có thừa ký tự hay không, các trường này ở hai nhà cũng phải khớp nhau). Mong được mọi người giúp đỡ ạ.
@phanmoi688
Làm bằng VBA được không?
Nếu tôi hiểu đúng và bạn cần thì có thể tham khảo file sau;
1/Mở file Tổ bị liệu.XLSX==> Copy thêm 1 Sheet giống với sheet (tên tiếng Tàu, hay nhật) và đăt tên sheet mới ấy là BiLieu=> Save==>Close.
2/Nhấn vào mặt cười để xem kết quả so sánh ở cột ghi chú.
Lưu ý thay đổi đường dẫn ở Ô L2 cho phù hợp
 

File đính kèm

em làm theo anh hướng dẫn mà nó bảo "Object variable or With block variable not set" là em làm sai chỗ nào ạ
Bài đã được tự động gộp:

@phanmoi688
Làm bằng VBA được không?
Nếu tôi hiểu đúng và bạn cần thì có thể tham khảo file sau;
1/Mở file Tổ bị liệu.XLSX==> Copy thêm 1 Sheet giống với sheet (tên tiếng Tàu, hay nhật) và đăt tên sheet mới ấy là BiLieu=> Save==>Close.
2/Nhấn vào mặt cười để xem kết quả so sánh ở cột ghi chú.
Lưu ý thay đổi đường dẫn ở Ô L2 cho phù hợp
với lại em xem chỗ code hình như nó bị lỗi font hay sao mà có mấy chữ bị lẫn tiếng trung vào nữa á
 
Lần chỉnh sửa cuối:
Bạn có biết VBA không?
Nếu có biết tí chút thì thử như sau:
Trên cửa sổ VBE bạn đưa chuột vào lề trái (như chỗ có mũi tên vàng và nháy chuột để nó xuất hiện ở chỗ đó 1 dấu tròn. Bạn nháy vào chỗ này Dic(key)=Arr(i,8) và dòng Set WsMoi = Workbook.Open.... và dòng If Sh.name ..... và dòng tiếp theo . sau đó thử nhấn F5 xem code chạy nó có dừng ở chỗ có các dấu tròn lề trái ấy không. Nếu nó dừng nhấn F8 (dòng tô vàng sẽ nhảy thêm 1 dòng), lại nhấn F5 và F8 ... (mục đích là Để xem Code có nạp dic không). Nếu nó không dừng chỗ dấu tròn ấy có nghĩa là code không nạp dic và như thế Dòng If Dic.Exists(Temp) chạy bị lỗi.
Hoặc có thể Temp xác định sai, Bạn thử kiểm tra xem Temp có giá trị là như thế nào?
 
Bạn có biết VBA không?
Nếu có biết tí chút thì thử như sau:
Trên cửa sổ VBE bạn đưa chuột vào lề trái (như chỗ có mũi tên vàng và nháy chuột để nó xuất hiện ở chỗ đó 1 dấu tròn. Bạn nháy vào chỗ này Dic(key)=Arr(i,8) và dòng Set WsMoi = Workbook.Open.... và dòng If Sh.name ..... và dòng tiếp theo . sau đó thử nhấn F5 xem code chạy nó có dừng ở chỗ có các dấu tròn lề trái ấy không. Nếu nó dừng nhấn F8 (dòng tô vàng sẽ nhảy thêm 1 dòng), lại nhấn F5 và F8 ... (mục đích là Để xem Code có nạp dic không). Nếu nó không dừng chỗ dấu tròn ấy có nghĩa là code không nạp dic và như thế Dòng If Dic.Exists(Temp) chạy bị lỗi.
Hoặc có thể Temp xác định sai, Bạn thử kiểm tra xem Temp có giá trị là như thế nào
e ko biết về VBA nma e sẽ thử làm theo anh hướng dẫn ạ
 
Bạn có biết VBA không?
Nếu có biết tí chút thì thử như sau:
Trên cửa sổ VBE bạn đưa chuột vào lề trái (như chỗ có mũi tên vàng và nháy chuột để nó xuất hiện ở chỗ đó 1 dấu tròn. Bạn nháy vào chỗ này Dic(key)=Arr(i,8) và dòng Set WsMoi = Workbook.Open.... và dòng If Sh.name ..... và dòng tiếp theo . sau đó thử nhấn F5 xem code chạy nó có dừng ở chỗ có các dấu tròn lề trái ấy không. Nếu nó dừng nhấn F8 (dòng tô vàng sẽ nhảy thêm 1 dòng), lại nhấn F5 và F8 ... (mục đích là Để xem Code có nạp dic không). Nếu nó không dừng chỗ dấu tròn ấy có nghĩa là code không nạp dic và như thế Dòng If Dic.Exists(Temp) chạy bị lỗi.
Hoặc có thể Temp xác định sai, Bạn thử kiểm tra xem Temp có giá trị là như thế nào?
em làm thử mà ko ddc ạ, a xem có cách nào giúp e ko
 
do thói quen của mình thôi
Đã có thành viên nhắc bạn là không nên viết tắt rồi và tác hại của nó ra sao rồi .
Chỉ chân thành khuyên bạn là : khi viết cho ai đó nhất là người đó bạn không biết họ là ai thì hãy nên viết bằng tiếng mẹ đẻ, câu văn trong sáng để thể hiện mình là người có văn hóa. Bạn hãy hình dung ra câu văn sau : t muốn thế này thế nọ, ... hoặc m có thể cho t cái gì đó... thì người khác có thể hiểu là (tao,(tôi hoặc tớ hoặc thầy muốn ....) , hoặc : mày hoặc mình, hoặc mi, hoặc mụ có thể cho (như chữ t ở trên đã viết)..... thử hỏi nếu người đọc là người có địa vị (chú bác-hoặc tuổi cao) cao hơn bạn họ nghĩ sao?
Thấy bạn viết tắt kinh quá có chữ nổ cả não mà không dịch được (nma e..., ...ddc...) nên chờn và có ý định bỏ qua. khi đến bài #12 bạn cũng đã có ý cầu thị và do vậy tôi gợi ý bạn sửa lại thế này:
Dòng code If File.Name Like "t? b? li?u.xlsm" đổi thành If File.Name Like "t? b? li?u.XLSX" và chạy thử. Có thể do file t? b? li?u.xlsm không có tren máy bạn nên code không tìm thấy và do vậy không nạp dictionary
nếu vẫn không được thì chụp ảnh màn hình dòng code bị lỗi và up lên.
 
Khi hỏi, đưa một vấn đề của mình ra cho người ta làm (giúp) thì đầu tiên hết phải cố gắng dùng văn từ cho thật rõ rệt, và tuân thủ luật của "thói thường".
Đâu lại cứ cắm đầu đi theo "thói quen".
 
Đã có thành viên nhắc bạn là không nên viết tắt rồi và tác hại của nó ra sao rồi .
Chỉ chân thành khuyên bạn là : khi viết cho ai đó nhất là người đó bạn không biết họ là ai thì hãy nên viết bằng tiếng mẹ đẻ, câu văn trong sáng để thể hiện mình là người có văn hóa. Bạn hãy hình dung ra câu văn sau : t muốn thế này thế nọ, ... hoặc m có thể cho t cái gì đó... thì người khác có thể hiểu là (tao,(tôi hoặc tớ hoặc thầy muốn ....) , hoặc : mày hoặc mình, hoặc mi, hoặc mụ có thể cho (như chữ t ở trên đã viết)..... thử hỏi nếu người đọc là người có địa vị (chú bác-hoặc tuổi cao) cao hơn bạn họ nghĩ sao?
Thấy bạn viết tắt kinh quá có chữ nổ cả não mà không dịch được (nma e..., ...ddc...) nên chờn và có ý định bỏ qua. khi đến bài #12 bạn cũng đã có ý cầu thị và do vậy tôi gợi ý bạn sửa lại thế này:
Dòng code If File.Name Like "t? b? li?u.xlsm" đổi thành If File.Name Like "t? b? li?u.XLSX" và chạy thử. Có thể do file t? b? li?u.xlsm không có tren máy bạn nên code không tìm thấy và do vậy không nạp dictionary
nếu vẫn không được thì chụp ảnh màn hình dòng code bị lỗi và up lên.
Dạ vâng em cảm ơn, em đã làm được rồi, vậy nếu em muốn dùng code này áp dụng cho các biểu của các tổ tương tự thì em phải làm như thế nào ạ.
 
Dạ vâng em cảm ơn, em đã làm được rồi, vậy nếu em muốn dùng code này áp dụng cho các biểu của các tổ tương tự thì em phải làm như thế nào ạ.
Có nhiều tổ không? và mỗi file ấy thì so sánh với cột nào của sheet nào?
Nếu nhiều thì liệt kê tên các tổ (ví dự : AA1=Tổ bị liệu.XLSX, AA2=Tổ tiết liệu.XLSX, AA3=Tổ hư thận,AA4=.... rồi dùng vòng lặp duyệt qua từng ô của cột AA để lấy tên file đưa vào code.
 
Có nhiều tổ không? và mỗi file ấy thì so sánh với cột nào của sheet nào?
Nếu nhiều thì liệt kê tên các tổ (ví dự : AA1=Tổ bị liệu.XLSX, AA2=Tổ tiết liệu.XLSX, AA3=Tổ hư thận,AA4=.... rồi dùng vòng lặp duyệt qua từng ô của cột AA để lấy tên file đưa vào code.
có 5 tổ và dữ liệu cần dò tìm của các tổ đều như nhau ạ
 
có 5 tổ và dữ liệu cần dò tìm của các tổ đều như nhau ạ
Bạn có thấy vế thứ 2 của câu hỏi không? nó là "...file ấy thì so sánh với cột nào của sheet nào?".
Lưu ý: hỏi bài mà để người khác phải hỏi lại thì sao? chắc bạn biết.
 
Bạn có thấy vế thứ 2 của câu hỏi không? nó là "...file ấy thì so sánh với cột nào của sheet nào?".
Lưu ý: hỏi bài mà để người khác phải hỏi lại thì sao? chắc bạn biết.
Vâng em xin lỗi vì đã không nói rõ ý, trường dữ liệu ở các tổ khác cũng tương tự với nhau, và cái em cần dò cũng là dữ liệu nhập xuất (mã số công lệnh, mã hàng, kích thước, tên phụ kiện) như hai tổ ban đầu ạ
 
Vâng em xin lỗi vì đã không nói rõ ý, trường dữ liệu ở các tổ khác cũng tương tự với nhau, và cái em cần dò cũng là dữ liệu nhập xuất (mã số công lệnh, mã hàng, kích thước, tên phụ kiện) như hai tổ ban đầu ạ
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.
 
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

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

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

@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: 6
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
 

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

Back
Top Bottom