Cách nào là cách nhanh nhất để lọc dữ liệu từ một danh sách bằng việc dùng VBA? (1 người xem)

Liên hệ QC

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

levanduyet

Hãy để gió cuốn đi.
Thành viên danh dự
Tham gia
30/5/06
Bài viết
1,798
Được thích
4,706
Giới tính
Nam
Thưa các bạn,
Bài toán trích, lọc dữ liệu từ một bảng tính Excel(1) là bài toán mà hầu như ai đã sử dụng Excel đều gặp phải.
Việc trích lọc này nếu giải thuật tốt sẽ giúp các bạn rất nhiều.
Vậy chúng ta hãy cùng thảo luận vấn đề này ở đây.
Các bạn đã từng gặp vấn đề này, và đã từng giải quyết theo cách của các bạn thì xin các bạn Post lên chia sẻ và thảo luận cùng các bạn khác.

Lê Văn Duyệt
PS: (1) chỉ bàn về VBA mà thôi !
 
Lần chỉnh sửa cuối:
Từ đơn giản đến phức tạp!

+-+-+-+ (/ì Duyệt nói là trích lọc dữ liệu (dùng VBA), nên mình nghĩ ngay đến Advanced Filter (!)
Để tự động hóa = VBA thì xài thêm vài cái ComboBox cho ~ Criteria
Cái ComBo cuối cùng sẽ được gắn macro (Mcr);
Mcr này làm ~ việc như sau:
Lấy các kết quả từ các Combo bỏ vô vùng Criteria;
Chạy AdvFilter;
Copy kết quả đến 1 nơi nào đó mà ta ưa thích;

Mình thấy tiện khi quản lý nhân sự hay quản lý cônghệ, & kể cả bán hàng cũng tốt (VĐ bán hàng, là cửa hiệu nho nhỏ í mà!). Đây là kiểu con nhà nghèo: đầu tư tối thiểu, đạt được ~ iêu cầu bình bình đề ra!!!

(Đây là bài thứ 500 của mình!)
 
Lần chỉnh sửa cuối:
Upvote 0
anhtuan1066 đã viết:
Tôi thì nghĩ thuật toán luôn luôn có.. nhưng ta nên làm cách nào đễ đưa về trường hợp đơn giản nhất... Theo kinh nghiệm của tôi cho thấy khâu nhập liệu là quan trọng nhất... Nếu bố trí dử liệu ko khoa học thì sẽ gây khó khăn rất lớn cho giải thuật trích xuất dử liệu...
Đồng ý với vế đầu của bạn, nhưng không nhất trí với vế sau. Bố trí cách gì bạn cũng trích xuất được cả bởi "thuật toán là luôn luôn có" mà. Tôi không rành lắm về VBA nhưng trong hầu hết các trường hợp đều trích xuất được số liệu để phục vụ cho mình. Tuy không được hay nhưng không rành lắm nên đành chịu
 
Upvote 0
Đúng rồi. Nếu bố trí dữ liệu một cách khoa học và tối ưu thì việc xây dựng thuật toán trích xuất sẽ dễ hơn rất nhiều. Như vậy việc trích xuất dữ liệu sẽ đi đôi với việc nhập dữ liệu vào. Và người viết thuật toán để trích xuất dự liệu cho một bài toán cụ thể thì nghĩ luôn việc làm các form nhập liệu theo một phương án tối ưu và theo một định dạng mẫu. Có như thế thì các thuật toán mới đơn giản và không bị sai
 
Upvote 0
SA_DQ đã viết:
+-+-+-+ (/ì Duyệt nói là trích lọc dữ liệu (dùng VBA), nên mình nghĩ ngay đến Advanced Filter (!)
Để tự động hóa = VBA thì xài thêm vài cái ComboBox cho ~ Criteria
Cái ComBo cuối cùng sẽ được gắn macro (Mcr);
Mcr này làm ~ việc như sau:
Lấy các kết quả từ các Combo bỏ vô vùng Criteria;
Chạy AdvFilter;
Copy kết quả đến 1 nơi nào đó mà ta ưa thích;

Mình thấy tiện khi quản lý nhân sự hay quản lý cônghệ, & kể cả bán hàng cũng tốt (VĐ bán hàng, là cửa hiệu nho nhỏ í mà!). Đây là kiểu con nhà nghèo: đầu tư tối thiểu, đạt được ~ iêu cầu bình bình đề ra!!!
Bác vui lòng cho ví dụ cụ thể mới có thể so sánh được Bác ơi !

LVD
 
Upvote 0
Để có thể lọc được dữ liệu, tôi thường làm theo hai cách :Cách 1 : làm theo ý kiến của bác Sa ( và đây là cách hay dùng nhất )Cách 2 : Dùng vòng lặp xét theo Criteria. Nếu thỏa mãn thì copy qua vùng mới ( cách này gần đây mới sử dụng )
 
Upvote 0
Dùng Advanced Filter thì nó không cho em copy phần kết quả lọc sang sheet khác. Có cách nào làm được như vậy không các anh?
Cách em vẫn đang làm là copy qua một vùng tạm cùng sheet, sau đó dùng macro copy tiếp qua sheet khác! Quá lằng nhằng!
 
Lần chỉnh sửa cuối:
Upvote 0
duongsatdn đã viết:
Dùng Advanced Filter thì nó không cho em copy phần kết quả lọc sang sheet khác. Có cách nào làm được như vậy không các anh?
Cách em vẫn đang làm là copy qua một vùng tạm cùng sheet, sau đó dùng macro copy tiếp qua sheet khác! Quá lằng nhằng!
Tôi vẫn dùng AF (VBA) để copy từ sheet này qua sheet khác được mà.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Mình thấy dùng advan là tiện nhất vừa nhanh vừa dễ sử dụng. Các bạn có thể tham khảo file quản lý nhân viên của mình. Mình dùng advan và lọc được tất cả các kết quả. Nói như Bác anhtuan1066 mình nhất trí, việc bố trí dữ liệu rất quan trong cho viêc trích xuất dữ liệu sau này.
 
Upvote 0
levanduyet đã viết:
Thưa các bạn,
Bài toán trích, lọc dữ liệu từ một bảng tính Excel(1) là bài toán mà hầu như ai đã sử dụng Excel đều gặp phải.
Việc trích lọc này nếu giải thuật tốt sẽ giúp các bạn rất nhiều.
Vậy chúng ta hãy cùng thảo luận vấn đề này ở đây.
Các bạn đã từng gặp vấn đề này, và đã từng giải quyết theo cách của các bạn thì xin các bạn Post lên chia sẻ và thảo luận cùng các bạn khác.

Lê Văn Duyệt
PS: (1) chỉ bàn về VBA mà thôi !
Thường thì lọc sẽ có các cách sau :
  1. Dùng Auto Filter
  2. Dùng Advance Filter
  3. Dùng vòng lặp trong VBA
- Dùng Filter có cái tiện là rất nhanh (khi lọc), tuy nhiên lại có cái là phải có thêm các name, có thêm một tempsheet, vì khi lọc ta nhận được 1 bảng mới có cách bố trí dữ liệu y hệt DATA. Khi vào báo cáo thì chỉ cần 1 số chỉ tiêu, vì vậy ta phải chọn từng cột để copy (hoặc gần như thế - tức là sẽ có những cột thừa). Khi File của ta có khoảng 15 loại báo cáo trở lên thì sẽ rất rối và dễ bị sai.

- Dùng Vòng lặp : Quá trình lọc sẽ chậm hơn Filter, tuy nhiên điều kiện lọc lại đa dạng hơn, có thể lấy được những chỉ tiêu mà Filter rất khó hoặc không thể lấy được. Và ta không cần tempsheet.
VD : Trên DATA chỉ có mã Khách hàng, nhưng ra báo cáo lại phải có tên khách hàng kèm theo, như vậy nếu dùng vònh lặp thì ta có thể truy xuất ngay trong VBA tên của khách hàng, còn nếu dùng Filter thì đúng là 1 cực hình. Đấy là chưa kể ta muốn lấy các khách hàng chỉ có tên này . . tên khác (nhắc lại : DATA chỉ có mã khách hàng), cái này nếu mà dùng Filter thì coi như . . . khó khả thi. Và còn nhiều điều nữa.

Như vậy, nếu với các File và các báo cáo đơn giản, các bác cứ dùng AF cũng không sao cả, rất tiện lợi và trực quan. Nhưng đến một lúc nào đó, với 1 File chuyên nghiệp hơn (về cấu trúc dữ liệu, về báo cáo . . . ), đòi hỏi cao hơn thì chỉ có dùng vòng lặp mới làm được.

Đã có một số bài phân tích ở đây, các bác có thể tham khảo
http://tinyurl.com/ysnun8
Thân!
 
Upvote 0
anhtuan1066 đã viết:
Bạn ơi, Duyệt đã nói chỉ bàn về VBA thôi, ko bàn về chuyện khác.. nhưng.. tôi nói trích ko dc hồi nào chứ? Bạn xem lại đi! Là KHÓ chứ ko phải KO DC...

OK

Hoàn toàn đồng ý với anhtuan1066.
Tôi có đọc đâu đó, việc thiết kế 1 cơ sở dữ liệu rất quan trọng cho việc kết xuất dữ liệu. Ngoài ra còn phải bảo đảm tính toàn vẹn, độc lập, gì gì đó.... chả hiểu nữa!
Mong diễn đàn, ngoài ý tưởng bàn về giải thuật của anh Lê Văn Duyệt tôi đề nghị cũng nên đề cập nhiều tới thiết kế cơ sở dữ liệu.
(Thực tế, trên diễn đàn vừa qua cũng rất nhiều lần các bạn nhắc nhở việc tổ chức lại CSDL.... Nhưng nếu thiếu kiến thức thì.... chả biết tổ chức CSDL như thế nào là tốt cả).

Tuy nhiên, hì hì... tôi không đủ trình độ để bàn mất rồi! Khổ thân tôi.
Bây giờ xin ngồi ngắm vậy!
 
Upvote 0
Là giải pháp tốt nhất cho việc xử lý cơ sở dữ liệu (CSDL) chúng ta nên vận dụng kiến thức về T-SQL. Tất cả các hệ quản trị CSDL như Foxpro, Access, Oracle, SQL Server, Excel, Text, Interbase... đều dùng T-SQL.
Nếu chỉ lọc một bảng dữ liệu nhỏ và đơn giản thì dùng AF cho dễ. Nhưng nếu dữ liệu lớn, nhu cầu trích lọc đa dạng (móc nối giữa các table, kết hợp các điều kiện, kết hợp tính thống kê,....) thì chỉ có thể dùng ngôn ngữ T-SQL là giải pháp tốt nhất!
Trước đây tôi cũng dùng AF nhiều+kỹ thuật dùng vòng lặp Do..While;For..Next nhưng cuối cùng tôi vẫn phải dùng ngôn ngữ T-SQL, trong VBA dùng ADO để thực hiện.
(Nếu các bạn xem các ví dụ trong file Examble.xls trong bộ A-Tools tôi đã đề cập về kỹ thuật trích lọc các mẫu báo cáo cơ bản).
 
Upvote 0
Thưa các bạn,
Cuối cùng thì làm sao các bạn có thể so sánh các phương pháp lọc với nhau.
Để chứng minh được giải thuật hay nói nôm na là cách thực hiện, cách nào sẽ nhanh hơn?
Đây là vấn đề tôi muốn đề cập. Bởi vì tôi cũng có thể nói cách A là nhanh hơn, người khác lại nói cách B là nhanh hơn...

To: TuanVNUNI,
Anh không có đề cập đến T-SQL. Hoàn toàn đồng ý với ý kiến của em.

Lê Văn Duyệt
 
Upvote 0
levanduyet đã viết:
Thưa các bạn,
Cuối cùng thì làm sao các bạn có thể so sánh các phương pháp lọc với nhau.


Đây là vấn đề tôi muốn đề cập. Bởi vì tôi cũng có thể nói cách A là nhanh hơn, người khác lại nói cách B là nhanh hơn...

Thật là khó chứng minh bởi xét trên từng quy mô thì mỗi PP có thế mạnh riêng của mình. Giống như đi xe đạp, xe máy, ô tô hay máy bay vậy.

Tùy từng điều kiện đường sá, tùy từng quy định của pháp luật (về bằng lái, về học vấn, sức khỏe để lái phương tiện đó) để có thể áp dụng linh động.

Em VD : Đoạn đường chỉ có 5m mà bảo cái nào nhanh hơn cái nào thì không thế nào được.

Hoặc đi ở SG giờ cao điểm thì đi bằng cái nào nhanh nhất thì cũng . . . bó tay.

Vì vậy em nghĩ là tùy người và tùy chương trình đó thế nào.

Thân!
 
Upvote 0
Mr Okebab đã viết:
Thật là khó chứng minh bởi xét trên từng quy mô thì mỗi PP có thế mạnh riêng của mình. Giống như đi xe đạp, xe máy, ô tô hay máy bay vậy.

Đồng ý, nhưng chúng ta cũng phải so sánh. Đây là một minh chứng cho phương pháp hay giải thuật của mình. Như Tuân đưa ra đây.
http://www.giaiphapexcel.com/forum/showthread.php?p=33484#post33484

_Để so sánh chúng ta sẽ dùng khối dữ liệu có theo như file đính kèm này.
http://www.giaiphapexcel.com/forum/showthread.php?t=4540
_Dùng thủ tục của Tuân để thử xem, và tính thời gian thực hiện.

Lê Văn Duyệt
 
Upvote 0
Chào các bạn mình không rành về excel nhưng công việc hiện tại cần giải quyết một vấn đề như Vidu gởi kèm , mình mô tả cụ thể như thé này:
sheet 1 mình có một bảng điểm gồm nhiều cột từng môn học giờ mình muốn chuyển điểm từng môn của từng người thành nhiều dòng như sheet 2 tên có thể trùng nhưng mã không trùng dùng mã làm chuẩn . mong mỗi người giúp đỡ cám ơn mọi người rất nhiều!
 

File đính kèm

Upvote 0
Ok, cảm ơn bạn hpkhuong rất nhiều, chúc bạn nhiều sức khỏe và thành công trong cuộc sống
 
Upvote 0
Đây là cách tôi làm theo đề xuất của bác SA_DQ ở bài #2:

- Dùng combo trên Form chọn và nhập liệu vào tiêu chí lọc.

- Lọc xong lấy dữ liệu vào ListBox.

- Chọn trong ListBox nhập liệu vào vùng cần nhập liệu.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Web KT

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

Back
Top Bottom