Xin giải thuật về bài toán so sánh dữ liệu

  • Thread starter Thread starter leba207
  • Ngày gửi Ngày gửi
Liên hệ QC

leba207

Thành viên mới
Tham gia
9/5/10
Bài viết
29
Được thích
1
Em xin mô tả dữ liệu đầu vào và kết quả đầu ra.
1. Đầu vào 2 sheet, mỗi sheet gồm tiêu đề cột là mã hàng, tên hàng.
2. Đầu ra trả kết quả ra 3 vùng.
Vùng 1: cả 2 dữ liệu cùng có
Vùng 2: dữ liệu data 1 có , data 2 không có.
Vùng 3: dữ liệu data 1 không có, data 2 có.
xin mọi người chỉ cách làm bằng VBA.
Xin cám ơn!
 
Em xin mô tả dữ liệu đầu vào và kết quả đầu ra.
1. Đầu vào 2 sheet, mỗi sheet gồm tiêu đề cột là mã hàng, tên hàng.
2. Đầu ra trả kết quả ra 3 vùng.
Vùng 1: cả 2 dữ liệu cùng có
Vùng 2: dữ liệu data 1 có , data 2 không có.
Vùng 3: dữ liệu data 1 không có, data 2 có.
xin mọi người chỉ cách làm bằng VBA.
Xin cám ơn!
Có cần duy nhất không.Mà hướng dẫn là bạn nên duyệt qua tất cả rồi so sánh thôi.
 
Upvote 0
Có cần duy nhất không.Mà hướng dẫn là bạn nên duyệt qua tất cả rồi so sánh thôi.
Nhờ thớt đưa dữ liệu demo lên cho anh @snow25 giúp. Tại em cũng đang bị vướng chỗ này. Nhưng đang nhờ Thầy bên topic kia giúp. không tiện. Nếu được cho em tham khảo với ạ
 
Upvote 0
Em xin mô tả dữ liệu đầu vào và kết quả đầu ra.
1. Đầu vào 2 sheet, mỗi sheet gồm tiêu đề cột là mã hàng, tên hàng.
2. Đầu ra trả kết quả ra 3 vùng.
Vùng 1: cả 2 dữ liệu cùng có
Vùng 2: dữ liệu data 1 có , data 2 không có.
Vùng 3: dữ liệu data 1 không có, data 2 có.
xin mọi người chỉ cách làm bằng VBA.
Xin cám ơn!
Bài này có thể dùng Dictionary
- Lấy data có số lượng lớn hơn nạp vào Dic ( Giả sử là data1 )
- Quét data2 còn lại, so sánh với Dic:
+ Nếu phần tử data2 có trong Dic -> Gán vào vùng 1. Remove phần tử vừa xét
+ Nếu phần tử data2 không có trong Dic -> Gán vào Vùng 3
+ Gán các phần tử còn lại trong Dic vào Vùng 2
 
Upvote 0
Bạn đưa bài toán chung chung như vậy rồi code xong, lại thêm, rồi lại thêm.
Bạn nên học cách đặt một bài toán, hay một câu hỏi trước đã.
Mỗi người cứ hỏi bạn một chút một để ra bài toán hoàn chỉnh.
Mong được sự trợ giúp mà lại đặt một bài toán mơ hồ, không có tâm ý gì cả.

Ví dụ: ta có 2 mảng, kích thước mảng nhiều hàng và cùng có 5 cột.
Đầu ra trả kết quả ra 3 vùng.
Vùng 1: cả 2 dữ liệu cùng có.
Cùng có như thế nào, trong tất cả các cột hay một cột chỉ định. Nếu là một cột chỉ định nếu dữ liệu hàng mà trùng thì phải làm sao.
Vùng 2: Nhận dữ liệu data 1 không có trong data 2.
Vùng 3: Nhận dữ liệu data 2 không có trong data 1.
Không có như thế nào, chỉ cần sai số một cột xem như là đúng hay sai số ở cột chỉ định.

Còn nếu câu hỏi mảng chỉ có một cột duy nhất để duyệt, thì "xin hàng ngay thôi".
 
Upvote 0
Bạn đưa bài toán chung chung như vậy rồi code xong, lại thêm, rồi lại thêm.
Bạn nên học cách đặt một bài toán, hay một câu hỏi trước đã.
Mỗi người cứ hỏi bạn một chút một để ra bài toán hoàn chỉnh.
Mong được sự trợ giúp mà lại đặt một bài toán mơ hồ, không có tâm ý gì cả.

Ví dụ: ta có 2 mảng, kích thước mảng nhiều hàng và cùng có 5 cột.
Đầu ra trả kết quả ra 3 vùng.
Vùng 1: cả 2 dữ liệu cùng có.
Cùng có như thế nào, trong tất cả các cột hay một cột chỉ định. Nếu là một cột chỉ định nếu dữ liệu hàng mà trùng thì phải làm sao.
Vùng 2: Nhận dữ liệu data 1 không có trong data 2.
Vùng 3: Nhận dữ liệu data 2 không có trong data 1.
Không có như thế nào, chỉ cần sai số một cột xem như là đúng hay sai số ở cột chỉ định.

Còn nếu câu hỏi mảng chỉ có một cột duy nhất để duyệt, thì "xin hàng ngay thôi".
mình đang hỏi cách giải thuật kg hỏi code bạn nhé
 
Upvote 0
Giải thuật:
1. Dùng vba, adodb. Câu lệnh sql cho vùng 1 là inner join 2 bảng; cho vùng 2 là left outer join; ch vùng 3 là right outer join.
2. Dùng powerquery, câu lệnh tương tự như các câu sql nêu trên
dùng sql mình làm được rồi, nhưng chuyển cho người khác cùng dùng nên muốn dùng vba gói gọn vào nút bấm nên mông muốn dùng VBA để làm.
chắc chỉ có dùng dic duyệt như bạn CHAOQUAY
 
Upvote 0
chắc chỉ có dùng dic duyệt như bạn CHAOQUAY
Thực ra dùng dic để thuận tiện và tố ưu thôi.
Nếu "người khác cùng dùng" mà họ không chỉ dị ứng với sql mà còn cả với dic thì dùng vòng FOR cũng được.
Bài đã được tự động gộp:

Nhưng ............................................... "người khác cùng dùng" họ dị ứng với sql.
 
Upvote 0
...
Nhưng ............................................... "người khác cùng dùng" họ dị ứng với sql.
Nhưng ... "gói trọn vào nút bấm" rồi mà. Có cái gì ló ra đâu để dị ứng.

... muốn dùng vba gói gọn vào nút bấm ...

Miệng nó cứng "hỏi cách giải thuật kg hỏi code" chứ thấy giải thuật có biết code đâu.
Hay là do mình hiểu nhầm từ "kg" nhỉ. Thời cổ đại của mình từ kg có nghĩa là "kính gửi". Chắc bây giờ có nghĩa là "khác giống"
 
Upvote 0
Nhưng ... "gói trọn vào nút bấm" rồi mà. Có cái gì ló ra đâu để dị ứng.



Miệng nó cứng "hỏi cách giải thuật kg hỏi code" chứ thấy giải thuật có biết code đâu.
Hay là do mình hiểu nhầm từ "kg" nhỉ. Thời cổ đại của mình từ kg có nghĩa là "kính gửi". Chắc bây giờ có nghĩa là "khác giống"
Ngay bài thứ 2 em đã trả lời là duyệt qua tất cả rồi so sánh với nhau mà.
 
Upvote 0
Thực ra dùng dic để thuận tiện và tố ưu thôi.
Nếu "người khác cùng dùng" mà họ không chỉ dị ứng với sql mà còn cả với dic thì dùng vòng FOR cũng được.
Bài đã được tự động gộp:


Nhưng ............................................... "người khác cùng dùng" họ dị ứng với sql.
Sao dị ứng vậy bác?

Sql hay VBA đều là mở, ai cũng đọc được hết
 
Upvote 0
Thế thì sao bạn không dùng sql mà bạn đã có? Trừ phi là họ dị ứng với sql.

Còn nếu muốn "gói gọn vào nút bấm" thì code dùng sql gói vào nút bấm thôi.
Bác nhầm với người hỏi chăng, chủ thớt? Thôi kệ họ vậy, cứ hỏi có người giúp thì tiếp tục hỏi .
 
Upvote 0
Em đoán: chắc chủ thớt nghĩ SQL ở nền tảng khác.. chứ không nghĩ là SQL trong VBA. :)
Vậy mới nói là làm bộ hỏi giải thuật chứ có hiểu giải thuật là gì đâu.
Khi tôi viết bài #7, tôi cứ dự định thớt sẽ đưa ra vài điểm, ví dụ mã thì giống nhưng tên không giống hoặc ngược lại thì giải quyết thế nào.
Đọc câu "dùng sql mình làm được rồi", tôi chưng hửng.
 
Upvote 0
Thấy bạn muốn công cụ để giải quyết vấn đề chứ không phải giải thuật.

Dictionary chỉ là công cụ để đơn giản hóa giải thuật phần nào đó.

Trong khi với Office, VBA là nền tảng để kiểm thử giải thuật, thì bạn nói không cần code.

Nếu là VBA thuần thì.

Giải thuật là:
Lọc Mảng A so với mảng B để lấy vùng 1 và vùng 2
Lọc Mảng B so với mảng A để lấy vùng 3

Code nháp:

1. Vùng 1 và Vùng 2:
Vòng Lặp I Duyệt Mảng A
Biến Bool Đúng/Sai sẽ xác nhận để lấy Vùng 2 Nếu Duyệt hết mảng B không nhận được gì. K2 = K2 + 1
Vòng Lặp J Duyệt Mảng B Nằm trong Vòng I
Nếu lặp xong A(I,Cột) = B(J,Cột) thì:
Biến K1 = K1 + 1​
Vùng 1 Nhận Hàng J Vòng Lặp M Gán kết quả các cột vào mảng.​
Kết Thúc Vòng J Tại I​

Khai Báo ReDim hoặc ReDim Preserve để nhận vùng 1 và 2.

2. Vùng 3:
Đưa vòng J Mảng B ra ngoài Vòng I, duyệt như cũ. Nhưng chỉ nhận thêm vùng 3.


*Gợi ý về Dict: Thay vì dùng Dictionary, bạn thử dùng VBA Json xem sao. VBA Json trong VBA là sự kết hợp giữa hai thư viện Collection và Dictionary.

*Còn nếu áp dụng SQL thông qua ADODB trong VBA thì không cần đến giải thuật.
 
Upvote 0
...Nếu là VBA thuần thì.

Giải thuật là:
Lọc Mảng A so với mảng B để lấy vùng 1 và vùng 2
Lọc Mảng B so với mảng A để lấy vùng 3
...

Mảng A hơi lớn hơn vùng 1. Khi lấy vùng 3 chỉ cần lọc mảng B so với vùng 1. Những gì B không tìm được trong vùng 1 thì chắc chắn đã không có trong A.

Tuy nhiên:

Giải thuật mà khi lấy vùng 3 lại phải "duyệt như cũ" là hơi bết.
Giải thuật cải tiến chỉ cần đọc bảng 1 và dò trong bảng 2 thôi. Nguyên tắc là sau khi tìm được vùng 1 và vùng 2 thì vùng 3 có thể dùng phép loại trừ.

1. Đọc bảng 1 vào mảng b1, bảng 2 vào mảng b2
2. Duyệt từng dòng b1. Xét hiện hữu trong bảng 2 (dùng hàm Application.Match hoặc gì đó)
2.1 nếu không có thì ghi vào vùng 2
2.2 nếu có thì ghi vào vùng 1; VÀ đồng thời xoá trị trong mảng b2
3. Duyệt từng dòng b2, cái nào chưa xoá thì ghi vào vùng 3

Đó là giải thuật thuần tuý. Dùng Dictionary chỉ là giúp cho phép tìm nhanh hơn bằng cách chép bảng 2 vào Dictonary.

Giải thuật nhanh hơn (nếu không dùng Dictionary) là dùng phép trộn và sắp xếp mảng.

1. Chép bảng 1 vào mảng a, thêm một cột số 1
2. Chép tiếp bảng 2 vào mảng a, thêm mọt cột số 2
3. sắp xếp mảng a
4. Đọc mảng a
4.1 dòng chỉ có 1 và không có 2 kế tiếp thì ghi vào vùng 2
4.2 dòng có 1 và có 2 kế tiếp thì ghi vào vùng 1
4.3 dòng có 2 mà không có 1 đi trước thì ghi vào vùng 3
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT

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

Back
Top Bottom