tối ưu code so sánh dữ liệu giữa sheet1 và sheet2

Liên hệ QC

hoabattu3387

Thành viên chính thức
Tham gia
11/9/08
Bài viết
91
Được thích
2
Hi các anh/chị diễn đàn
em có một file gồm 3 sheets dữ liệu. mục đích là đối chiếu các trường thông tin theo dòng của sheet1 và sheet2 với nhau (từ cột A đến cột H, bỏ qua cột G). nếu dữ liệu nào có ở sheet2 mà ko có ở sheet1 hoặc dữ liệu có ở sheet1 mà không có ở sheet2 thì kết quả gửi sheet3. dữ liệu nào có cả 2 sheet1 và sheet2 thì sum tổng tiền cột C ạ.
Em có viết một đoạn code so sánh một chiều giữa sheet2 và sheet1, nhưng code dài quá, e thấy loằng ngoằng và ko tối ưu, nên chưa viết chiều so sánh giữa sheet1 và sheet2. nhờ các anh/chị giúp e cải thiện nhé!


Sub Oval1_Click()
Dim dic, dic1 As Object, arr1(), arr2(), wrong(), notwrong(), i, j As Integer
Set dic = CreateObject("Scripting.Dictionary")
With Sheet1
arr1 = .Range(.[a1], .[h65536].End(xlUp)).Value
For i = 1 To UBound(arr1, 1)
orgin = Val(.Range("B" & i).Value) & Val(.Range("C" & i).Value) & .Range("e" & i).Value & Val(.Range("h" & i).Value)
If Not dic.exists(orgin) Then
dic.Add orgin, i
End If
Next
End With
With Sheet2
arr2 = .Range(.[a1], .[j65536].End(xlUp)).Value
ReDim wrong(1 To UBound(arr2, 1), 1 To 10)
ReDim notwrong(1 To UBound(arr2, 1), 1 To 10)
k = 1
H = 1
For j = 1 To UBound(arr2, 1)
ORGIN1 = Val(.Range("B" & j).Value) & Val(.Range("C" & j).Value) & .Range("e" & j).Value & .Range("h" & j).Value
If Not dic.exists(ORGIN1) Then
dic.Add ORGIN1, j
For t = 1 To 10
wrong(k, t) = arr2(j, t)
Next
k = k + 1
Else
For m = 1 To 10
notwrong(H, m) = arr2(j, m)
Next
tong = tong + notwrong(H, 3)
H = H + 1
End If
Next
End With
MsgBox (tong)
With Sheet3
.[a1].Resize(k, 10) = wrong


End With
End Sub


 

File đính kèm

Bạn đếm sô dòng chứ đâu phải cột phải hôn? Khi đếm dòng dùng count(*), chỉ dùng count(trường) khi ta muốn bỏ qua null.

"select f1, f2, f3, f5 from (select f1, f2, f3, f5 from [sheetNum1] union all select f1, f2, f3, f5 from [sheetNum1]) group by f1, f2, f3, f5 having count(*) < 2"

"select f1, f2, f3, f5, sum(f4) from (select f1, f2, f3, f4, f5 from [sheetNum1] union all select f1, f2, f3, f4, f5 from [sheetNum1]) group by f1, f2, f3, f5 having count(*) >= 2"

ủa rồi cũng đâu khác gì đâu anh ? cũng vẫn bị sót như ở trên khi ta đem

"select f1, f2, f3, f5 from (select f1, f2, f3, f5 from [sheetNum1] union all select f1, f2, f3, f5 from [sheetNum1]) group by f1, f2, f3, f5 having count(*) < 2"

JOIN với nguyên bảng trong 2 sheet

nói vui 1 chút , em nghĩ chỗ này sai
"select f1, f2, f3, f5, sum(f4) from (select f1, f2, f3, f4, f5 from [sheetNum1] union all select f1, f2, f3, f4, f5 from [sheetNum1]) group by f1, f2, f3, f5 having count(*) >= 2"

bởi vì đây là dạng so sánh đối chiếu sổ sách , nên khi tính tổng như trên thì tiền cầm trên tay là 2 000 000 nhưng tiền sổ sách đếm được là 4 000 000 . hi hi
 
Upvote 0
Join chi vậy? đây là giải thuật chỉ dùng Union.

Chú ý: tôi có nói trước là giải thuật này chỉ dùng được khi dũ liệu trong cùng một sheet là duy nhất. Dữ liệu giữa sheetA và sheetB có thể trùng nhưng dữ liệu của sheetA không lặp lại trong chính nó, sheetB cũng vậy.
 
Upvote 0
Join chi vậy? đây là giải thuật chỉ dùng Union.

Chú ý: tôi có nói trước là giải thuật này chỉ dùng được khi dũ liệu trong cùng một sheet là duy nhất. Dữ liệu giữa sheetA và sheetB có thể trùng nhưng dữ liệu của sheetA không lặp lại trong chính nó, sheetB cũng vậy.
à vậy ra ta chỉ bàn về giải thuật . Nhưng em vẫn muốn nhờ anh VetMini giúp trong trường hợp ta cần xem 2 giá trị NULL là như nhau trong câu lệnh JOIN ON thì giải quyết sao anh ? cám ơn anh
 
Upvote 0
Lý thuyết CSDL:
NULL không phải là một giá trị. Không so sánh được. Chỉ có thể xet 1 giá trị có NULL hay không, chứ không thể coi 2 NULL là bằng nhau.
Bạn có thể dùng IIF để ép NULL thành một trị nào đó rồi so sánh.
 
Upvote 0
Hiện tại em có 2 kho nhưng trước kia do đặt tên không khớp nhau nên bây giờ đối chiếu khó khăn
- Có vật tư trên kho công ty 2 mã dưới nhà máy thì 1 mã ( và ngược lại)
- Đơn vị tính cũng khác nhau
E mong anh có cách nào để hàng tháng khi lấy dữ liệu chỉ cần update vào sheet CTY và sheet NM sẽ chạy ra sheet BAOCAO các vật tư không ạ
E xin chân thành cảm on
 

File đính kèm

Upvote 0
Hiện tại em có 2 kho nhưng trước kia do đặt tên không khớp nhau nên bây giờ đối chiếu khó khăn
- Có vật tư trên kho công ty 2 mã dưới nhà máy thì 1 mã ( và ngược lại)
- Đơn vị tính cũng khác nhau
E mong anh có cách nào để hàng tháng khi lấy dữ liệu chỉ cần update vào sheet CTY và sheet NM sẽ chạy ra sheet BAOCAO các vật tư không ạ
E xin chân thành cảm on
Góp vui. Kết quả được dò được 1125 mã (của Sh KHO NM) so với 1241 mã (của Sh KHO CTY) cần dò. và 128 mã của Sh KHO NM không khớp với các mã của Sh KHO CTY.
các mã của 2 kho đều được liệt kê ở cột J và K /Sh BC TON KHO> bạn chủ thớt có thể căn cứ vào đó để sửa lại các mã và tên cho thống nhất.
 

File đính kèm

Upvote 0
Góp vui. Kết quả được dò được 1125 mã (của Sh KHO NM) so với 1241 mã (của Sh KHO CTY) cần dò. và 128 mã của Sh KHO NM không khớp với các mã của Sh KHO CTY.
các mã của 2 kho đều được liệt kê ở cột J và K /Sh BC TON KHO> bạn chủ thớt có thể căn cứ vào đó để sửa lại các mã và tên cho thống nhất.
Dạ xin phép hỏi anh là file đó hoạt động như thế nào vậy. E không rành về Macro + VBa ạ
 
Upvote 0
Dạ xin phép hỏi anh là file đó hoạt động như thế nào vậy. E không rành về Macro + VBa ạ
1/Bạn mở file. BấmAlt+F11 để vào cửa sổ VBA.
Tìm đến Module có Sub Tim, nhấn F5
2/ Cách 2:
Vẽ 1 Shape trên sh BC Ton kho, để chuột trên shape vừa vẽ và phải chuột==>tìm đến và chọn dòng Assign Macro , Chọn Tim/OK .
 

File đính kèm

Upvote 0
Web KT

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

Back
Top Bottom