VanHao nói:
Tôi xin mạn phép góp ý kiến một chút.
Tôi có xem qua file tìm giá trị thoả mãn n điều kiện và làm thử bằng cách dùng công thức. Tôi thấy dễ dàng chứ có khó khăn gì đâu. Tôi chỉ sử dụng hàm Vlookup, if và một bộ lọc là đáp ứng ngay yêu cầu trên. Còn về VBA thì chịu, không dám múa rìu qua mắt thợ.
Nếu lập công thức để đáp ứng n điều kiện mình thấy rất khó và chưa có cách.
Bạn có thể đưa ra để mọi người tham khảo không?
Ở đây chúng ta cùng bàn để cho ra một giải pháp cùng thuật toán tốt nhất trên Excel.
adam_tran nói:
...để giải quyết 1 vấn đề của mình thì mò hoài cũng ra. Nhưng tôi nghỉ "tham vọng" của anh Tuân là tạo ra 1 công cụ để tổng hợp hay so sánh các bảng CSDL của Excel qua một hay vài "key column" tương tự so sánh các table qua công cụ querry bên Access, từ đó tạo ra 1 CSDL mới (1 sheet mới) thỏa mãn những điều kiện nào đó.
Đúng vậy bác Adam sờ mít đã thấy tham vọng của mình, nhưng để làm vậy thật khó! Tham vọng này mình sẽ bạn trên một topic khác, còn ở topic này mình muốn có một hàm
DFind(criteria) Đào Việt Cường nói:
...Em cứ hình dung thấy một công cụ filter to report kiểu như A-Excel, rất chuyên nghiệp! Kiểu này chắc nhờ anh 2 chia sẻ cách làm - nhất là cái màn hình visible mà được ứng dụng làm màn hình tìm kiếm và tra cứu thì thật là tuyệt!
Bật mí với Cường là chức năng "Lọc chứng từ đã ghi..." trong A-Excel (filter to report) được thiết kế hoàn toàn là EXCEL dựa trên cơ sở thiết kế A-Tools không dùng ADO, DAO, ODBC,...Trong phiên bản mới (4.*) sẽ có công cụ đặt quan hệ và truy vấn các Sheet/Range->báo cáo như kiểu Access nhưng nó là Excel.
Mình đã đọc tất cả các giải pháp các bạn đưa ra và thấy có hướng giải quyết, nhưng vẫn mong các bác cụ thể hóa hơn bằng công thức cụ thể hay vài đoạn code.
Tập hợp các hàm mà MS Excel đưa ra rất phong phú, đặc biệt nhóm hàm Database (DSUM, DCOUT,DMAX,...D*) giải quyết việc thống kê với n điều kiện rất hữu hiệu, với công thức mảng MS Excel cũng đã cho người dùng như thêm một đôi tay.
Nhưng dù sao vẫn chưa thỏa lòng tham của mình!
+ Trong nhóm hàm Database
D*(database,field,criteria), vùng điều kiện (hay còn gọi là vùng tiêu chuẩn) criteria chỉ giới hạn các cột so sánh trong một Sheet/Table.
+ Trong nhóm hàm Lookup (Vlookup, Hlookup, Lookup,...) chỉ tìm trên một giá trị không có điều kiện?
Đây là hai vấn đề chúng ta rất cần và nếu MS Excel mà có thì càng tuyệt vời hơn. MS không nghĩ hay nghĩ nhưng không làm? Hay chúng ta chưa khai thác được hết?
Từ những mặt còn thiếu của MS Excel, tham vọng của mình là:
+ Tạo ra nhóm hàm thống kê D**, chức năng tương tự như D* nhưng criteria mở rộng cho nhiều Sheet trong CSDL. Mục đích này sẽ làm trên topic khác.
+ Tạo ra hàm tìm kiếm DFind(criteria), chức năng để tìm và cho ra giá trị theo nhiều điều kiện. (criteria gọi là vùng điều kiện hay vùng tiêu chuẩn)
Nếu thành công thì mỗi khi tìm kiếm theo nhiều điều kiện (Multsheet) chúng ta chỉ cần gõ =DFind(A1:Bn) là Ok.
Ý tưởng về cách dùng và thiết kế hàm DFind của mình như thế này:
+ Cấu trúc hàm DFind(criteria).
+ Cách dùng. Người dùng cần có một vùng (mảng) điều kiện VD như bắt đầu từ dòng 1, cột A là cột so sách; cột B là giá trị so sách. Như vậy, mỗi điều kiện là một dòng, A1:Bn là vùng có n điều kiện.
+ Thiết kế hàm DFind trên VBA:
Có 2 lựa chọn
1- Dùng kỹ thuật SQL
2- Không dùng kỹ thuật SQL (nếu không biết)
Cột so sánh:
Ngôn ngữ SQL thường nhận biết cột A là của sổ nào nó thường dùng dấu "!" hay dấu "." như là Hoso!Gia đình (cột gia đình trong sổ hoso).
Như vậy cột so sánh ta cần phải ghi rõ: Chamcong!Số công; Hoso!Gia đình; Hoso!Số con. Như thế thì hàm DFind mới có cơ sở để biết những Sheet/Rang/Table nào cùng tham gia điều kiện.
Cột giá trị so sánh
Dúng ra chúng ta phải có một cột "phép so sánh" để vào các phép SS: >, <, >=, <>... Nhưng để đơn giản cho người dùng cũng như giống cấu trúc Criteria của nhóm hàm Database (D*), trước mỗi giá trị so sánh cần đặt các phép so sánh như >=26; <3; =1.
Nhận biết điều kiện And và Or (cái này có thể làm sau)
Các điều kiện trên cùng một cột ở các dòng khác nhau sẽ được hiểu là điều kiện kết nối And, các điều kiện trên cùng một dòng ở các cột khác nhau sẽ được hiểu là điều kiện kết nối Or.
Trên là sơ lược để tạo hàm DFind theo hướng lập trình, còn bằng công thức thì mình chưa có hướng giải quyết. Theo cách nghĩ chủ quan của mình thì công thức không thể làm động được?
Đến bây giờ mình thấy vấn đề này khó hơn những gì nghĩ ban đầu!:wall: