Tim và lấy giá trị thoả mãn nhiều đều kiện?

Thảo luận trong 'Ứng dụng Excel' bắt đầu bởi Tuanktcdcn, 23 Tháng mười hai 2005.

46,391 lượt xem

  1. Tuanktcdcn

    Tuanktcdcn Lão già ham vui

    Bài viết:
    548
    Đã được thích:
    50
    Nơi ở:
    Hà Nội
    Trong Excel có hàm Vlookup, Hlookup,..để tìm và cho ra một giá trị náo đó, những hàm này đơn thuần là tìm theo một điều kiện hay một giá trị.
    Trong một CSDL các thông tim thường có liên hệ với nhau, đôi khi chúng ta cần tìm ra một giá trị thoả mãn n hiều điều kiện.
    VD: Mình muốn tìm một nhân viên mà:
    - Có gia đình
    - Số con <3
    - Số ngày công >=26

    Các thông tin về gia đình, số con nằm trong DMNV, ngày công có trong sổ chấm công.

    Với VD trên thì hình như các công cụ của Excel và các hàm không làm được?
    (Autofilter và Advance Filter chỉ thực hiện trên một sổ -sheet))

    Mình muốn gõ công thức vào một ô để nhận được tên nhân viên thoả mãn các điều kiện trên.

    Các bạn xem có cách nào làm được không? Kể cả việc ứng dụng VBA.
    Cảm ơn các bạn!
     
    #1
  2. handung107

    handung107 Thành viên thân thiết

    Bài viết:
    576
    Đã được thích:
    13
    Nơi ở:
    VN
    Có thật là Tuanktcdcn hỏi câu này không đấy ? Nếu có ai giải được thì có thưởng không nhỉ ?
     
    #2
  3. omron

    omron Thành viên hoạt động

    Bài viết:
    34
    Đã được thích:
    0
    Nơi ở:
    TPHCM
    Phải thiệt hay giỡn vậy bác Tuanktcdcn ! cái này bác đố hay k biết thật. Không biết chết liền đó.
     
    #3
  4. quocnghia

    quocnghia Thành viên hoạt động

    Bài viết:
    64
    Đã được thích:
    0
    cuối năm mà bác Tuanktcdcn còn giỡn. Cái này k cần VBA đâu, Excel hỗ trợ rồi mà ! Hi hi
     
    #4
  5. duyennt

    duyennt Thành viên thân thiết

    Bài viết:
    94
    Đã được thích:
    0
    Nơi ở:
    Bình Dương
    Tôi nghĩ bác Tuanktcdcn này "phá" mọi người chút thôi, chứ việc này thì chỉ cần kết hợp hàm If với Vlookup là tìm ra được những người thỏa mãn điều kiện đó thôi.
     
    #5
  6. Bình_OverAC

    Bình_OverAC Over Abnormal / Crazy

    Bài viết:
    845
    Đã được thích:
    7
    Nơi ở:
    Nha Trang
    He he. Có 4 bài trả lời nhưng cả bốn bài đều có chung một thắc mắc là không biết người post câu hỏi là ai :biggrin: ? Liệu có phải là Tuanktcdcn đang phá mọi người hay liệu có ai đó dùng nick của anh Tuanktcdcn để hỏi. Cái này phải mở cuộc điều tra thật nghiêm túc àh nha :Biggrin:
     
    #6
  7. Tuanktcdcn

    Tuanktcdcn Lão già ham vui

    Bài viết:
    548
    Đã được thích:
    50
    Nơi ở:
    Hà Nội
    Đúng chị Dung ạ! Bác nào giải giúp em sẽ có quà.
    Chết em! Các bác bây giờ không tin em nữa rồi? Quả thực trước đây I thường tính bằng các hàm thống kê (Sum,SumProduct,Count...), có dùng Autofilter, Advance Filter để lọc nhưng nó cho ra danh sách.
    Giờ mình muốn lấy một giá trị tại một ô mà giá trị tìm được thỏa mãn n điều kiện? Quả thực vấn đề này mình chưa làm các bác ạ! I nghĩ thấy có vẻ khó nên post bài để hỏi.

    Các bác giúp nhé!
     
    #7
  8. Bình_OverAC

    Bình_OverAC Over Abnormal / Crazy

    Bài viết:
    845
    Đã được thích:
    7
    Nơi ở:
    Nha Trang
    Nếu quả thật như vậy thì chuyện của bác Tuanktcdcn ắc hẳn không bình thường. Bác hãy cho lên một file đính kèm để mọi người còn đánh giá vấn đề chứ chắc là chưa ai tưởng tượng vấn đề của bác nghiêm trọng đến mức nào?
     
    #8
  9. Anh Hong

    Anh Hong Thành viên sơ cấp

    Bài viết:
    1
    Đã được thích:
    0
    Nơi ở:
    Ha Noi
    Tôi là một thành viên mới, và cũng đang có cùng khúc mắc như bác Tuanktcdcn.
    Tôi đang phải quản lý rất nhiều khoá học và danh sách học viên của các khoá. Để thống kê một học viên nào đó đã tham gia bao nhiêu khoá học (có chi tiết các khoá học) thì phải làm thế nào?
    Để kiểm tra một số học viên hoặc một nhóm học viên xem họ có tham gia vào 1 khoá đào tạo nào đó ko thì dùng hàm nào? Cách dùng.
    Rất mong các bác chỉ giúp e. Thanks các bác trước.
     
    #9
  10. Bình_OverAC

    Bình_OverAC Over Abnormal / Crazy

    Bài viết:
    845
    Đã được thích:
    7
    Nơi ở:
    Nha Trang
    Em cũng quên mất cái vụ này tự dưng chìm xuồng.

    Anh Hong: Bác có thể gởi cho em file của bác em sẽ up nó lên đây cho mọi người tham khảo thì hay hơn. Mong bác.
     
    #10
  11. adam_tran

    adam_tran Steel Partner

    Bài viết:
    1,373
    Đã được thích:
    32
    Nơi ở:
    Goooogle
    Theo tôi nghỉ cái gì cũng có giới hạn của nó.
    Giới hạn về số lượng: Trước hết là cấu trúc của CSDL, vấn đề anh Tuân đặt ra là tìm trên CSDL record nào có giá trị các trường (biến) từ A1 đến An thỏa mãn các điều kiện X1-Xn. Giá trị trả về là giá trị của biến An+1 chẳng hạn, hoặc là số index của record đó. Trong CSDL có n biến thôi, nếu n cố định hoặc max 1 số nào đó thì được.
    Giới hạn kiểu: Trong tất cả các điều kiện X1-Xn là đk True/False, =, >, >=, <> v...v, kiểu thì có kiểu ngày (với các đk =, >, >=, <, <=, <>, between...), số, text v...v. Ta phải đưa ra 1 số điều kiện chuẩn thì được chứ không đưa ra thì chịu.
    Tóm lại trên 1 CSDL mà số biến cũng như kiểu biến, điều kiện tìm kiếm là "xác định" thì dùng VBA không khó khăn gì. Nếu "không xác định" thì.... chịu!
     
    #11
  12. Tuanktcdcn

    Tuanktcdcn Lão già ham vui

    Bài viết:
    548
    Đã được thích:
    50
    Nơi ở:
    Hà Nội
    Vẫn chưa làm được

    Mình gửi file lên đây nhờ các bạn chỉ giúp.
    Cách 1- Lập công thức?
    Cách 2- VBA ?

    Mình nghĩ với cách 1 phải cố định số điều kiện thì mới làm được, còn cách 2 thì số điều kiện sẽ "động" hơn (có thể n điều kiện)?

    Bằng VBA thì mình có thể sẽ làm được, nhưng lập công thức (cách 1) thì hiện nay chưa.

    Cảm ơn các bạn!
     

    Các file đính kèm:

    #12
  13. Đào Việt Cường

    Đào Việt Cường Moderator

    Bài viết:
    400
    Đã được thích:
    2
    Giới tính:
    Nam
    Nơi ở:
    Khánh Hòa
    Dear TuanKTCDCN,
    -------------------
    Theo em hiểu thì việc tổ chức các bảng cơ sở như trong file đính kèm của bác là bắt buộc(?). Nếu không, em có thể tạo một bảng phụ hoặc là gộp luôn cả 2 bảng vào làm 1. Xử lý sẽ rất đơn giản bằng Filter.
    Còn nếu điều kiện lọc bắt buộc nằm trên nhiều bảng như vậy, em sẽ phải lọc điều kiện qua 2 bước:
    Bước 1: Lọc điều kiện trên bảng chấm công
    Bước 2: Lọc điều kiện trong bảng hồ sơ, kết hợp với mã tìm được ở bước 1.
    Vấn đề sẽ đơn giản nếu tổ chức lại cơ sở dữ liệu đáp ứng được yêu cầu, mặc dù chưa được tối ưu lắm!
    (Trong file đính kèm em gộp 2 bảng cơ sở dữ liệu làm 1, hơi thừa nhưng đáp ứng được yêu cầu thống kê)
     
    Last edited: 3 Tháng tư 2006
    #13
  14. adam_tran

    adam_tran Steel Partner

    Bài viết:
    1,373
    Đã được thích:
    32
    Nơi ở:
    Goooogle
    Vấn đề của anh Tuân là tìm giải pháp từ công thức hay VBA để giải quyết chuyện của Querry. Nếu dùng công cụ truy vấn tin để tìm những giá trị thỏa mãn từ n Databse thì...
    Ý tưởng của em là chôm 1 công cụ Querry nào đó, dùng VBA để điểu khiển.
    Đồ chơi trong Excel kiểu này hình như là Ms Querry thì phải, nhưng điều khiển nó = VBA thì chịu.
     
    Last edited: 17 Tháng một 2006
    #14
  15. IChiNoVa

    IChiNoVa Phu cà phê

    Bài viết:
    134
    Đã được thích:
    4
    Nơi ở:
    Sòn Gài
    Đối với các giá trị: ">=26", "<3",
    Sao mít tơ Tuan không ghi thành 26; 3 thôi, bỏ dấu ">, <, =" đi. Coi như quy ước nó là lớn hơn hoặc bằng 26, nhỏ hơn 3.

    Làm như vậy có phải là dễ xử lý không, đỡ phải xử lý nhiều
     
    #15
  16. Tuanktcdcn

    Tuanktcdcn Lão già ham vui

    Bài viết:
    548
    Đã được thích:
    50
    Nơi ở:
    Hà Nội
    Cảm ơn bạn Cường

    Ghép bảng và dùng Filter, Advance Filter cũng được nhưng không ổn khi quản trị CSDL, không phải cứ có điều kiện thì lại thêm cột.

    Có thể dùng công thức trong ô (=?) để nhận giá trị được không?

    Vâng, để đơn giản hóa trong bài này có thể tự hiểu vậy.

    Dùng Query bàng dòng lệnh (VBA) có lẽ là giải pháp tốt. Nếu không rõ về Excel Query thì vẫn có thể có cách khác.

    Cảm ơn và mong các bạn tiếp tục quan tâm!
     
    #16
  17. Đào Việt Cường

    Đào Việt Cường Moderator

    Bài viết:
    400
    Đã được thích:
    2
    Giới tính:
    Nam
    Nơi ở:
    Khánh Hòa
    Dear all,
    -------
    Trong trường hợp bắt buộc như thế này, chọn giải pháp Query là thích hợp nhất.
    Nhưng nếu xử lý Query bằng MS Access thì mạnh hơn nhiều.
    Việc chuyển đổi từ Excel sang Access không mất mấy công đâu ạ!
    Hi vọng đây cũng là một giải pháp!
     
    #17
  18. hai2hai

    hai2hai VNUNI Makes a difference

    Bài viết:
    2,012
    Đã được thích:
    128
    Nơi ở:
    Hà nội
    :biggrin:

    strSQL = "....." Thì ở đâu cũng giống nhau.

    Query bằng MS Access, MS Query và thậm chí ...ui, nhiều tools lắm... cũng chỉ là công cụ để thể hiện cái PL SQL ra thôi (cho phép ta tạo các câu lệnh SQL 1 cách visualize). (ko hiểu có mấy người hiểu PL SQL có nghĩa là gì nhỉ?). Vì thế, nếu muốn so sánh bất kỳ cái gì với nhau, tốt nhất mọi người xem nó có cùng bản chất ko đã nhé.

    Chú ý:

    Chương trình (writen in programing IDE) -->> Database Engine -->> Database
    Ví dụ về Database Engine, nôm na là DAO, RDO, ADO, v.v... ODBC, ODBC APIs,... thì nó là... giá mà show cho mọi người cái model nhỉ. Ko vẽ được nên hơi khó nói.

    Ở mỗi loại Database thì ngôn ngữ sql riêng cho từng món hơi khác nhau chút nhưng nó có những điểm chung. Đó gọi là ngôn ngữ SQL.

    ....
     
    Last edited: 17 Tháng một 2006
    #18
  19. IChiNoVa

    IChiNoVa Phu cà phê

    Bài viết:
    134
    Đã được thích:
    4
    Nơi ở:
    Sòn Gài
    Mít tơ Hải tu hải làm một mớ như vậy, mình đọc mà muốn bệnh luôn.
    Đừng có phức tạp hóa vấn đề lên chứ.

    Mình quy ước: Những các giá trị: 26, 3, 1 gọi là giá trị so sánh.
    Còn những thứ như: gia đình, số con, số công của từng người là giá trị bị so sánh.
    Cái này giống như số trừ và số bị trừ đấy hì hì....

    Trước tiên, mình sẽ khởi tạo vài biến (nếu biết trước là sẽ có bao nhiêu giá trị so sánh) để chứa các giá trị so sánh:
    đối với file của Mr Tuan, mình tạo 3 biến a, b, c. Mà cũng chỉ cần 2 biến là được bởi vì giá trị gia đình là 0 hoặc 1.

    Đó là trường hợp chỉ có 3 thứ để so sánh, nếu phát sinh thêm nhiều thứ khác, mà không thể biết được sẽ phải tạo bao nhiêu biến thì không thể dùng biến như trên được, mà phải dùng mảng A[i...n]

    Mỗi A chứa một giá trị so sánh.

    Mảng này mình khai báo nhỏ thôi khoảng 10 chẳng hạn.
    Làm gì có ông nội nào so sánh nhiều điều kiện quá.

    Để gán giá trị so sánh cho biến, mình dùng refedit,
    Hoặc cho nó làm tham số truyền vào của thủ tục luôn.

    Đến đây thì còn gì nữa đâu,
    Dùng While hoặc Repeat để duyệt từ trên xuống dưới đến khi nào không còn nhân viên nào thì thôi. Hoặc tổng hợp số lượng nhân viên trước sau đó dùng For.

    PP1: kiểm tra từng người.
    Trước tiên so sánh số công, nếu số công OK, thì so sánh đến gia đình, nếu có gia đình, thì so sánh tiếp số con.

    Nếu trong công ty có ai mà chưa có gia đình, mà vẫn có con thì phải phải kiểm tra số con. hì hì.....

    PP2: Kiểm tra từng Sheet.
    Trước tiên ở sheet chấm công, tìm ra những người thỏa mãn điều kiện về số công. Lưu lại mã nhân viên thỏa điều kiện.

    ở sheet Hồ sơ, tìm ra những người thỏa mãn về số con, và gia đình. Lưu lại mã nhân viên thỏa điều kiện.

    Sau đó so sánh 2 kết quả tìm được ở 2 sheet, chọn ra những mã nhân viên nào mà có mặt ở cả 2 kết quả trên.
     
    #19
  20. Đào Việt Cường

    Đào Việt Cường Moderator

    Bài viết:
    400
    Đã được thích:
    2
    Giới tính:
    Nam
    Nơi ở:
    Khánh Hòa
    Dear IChiNoVa,
    ---------------
    Giờ thì em mới hiểu vì sao bác "Cám ơn cái mông của tôi!" :biggrin:
    Em không biết vòng duyệt của bác chạy nhanh đến mức nào khi mà bảng cơ sở dữ liệu đầy lên và các điều kiện so sánh dài ra.
    Chắc là chúng ta phải thi xem ai giành được giải thưởng của bác Tuân nhé!
    Thôi được, tạm gác không màng tới MS Access nữa. Và nếu ngại đụng đến MS Query, cách mà em vẫn thường làm đối với sổ kế toán:
    - Tạo ra một vùng điều kiện trong đó các cột phải tương ứng với bảng cần Filter (trong trường hợp này em sẽ chọn bảng Hoso là bảng filter vì nó có nhiều điều kiện hơn)
    - Lọc bảng có điều kiện ít trước: ở đây bảng Chamcong chỉ có một điều kiện - em lọc bảng này trước để tìm ra những thoả điều kiện
    - Copy mã tìm được vào bảng điều kiện sau đó thực hiện lọc bảng Hoso
    Em nghĩ cách này không cần dùng vòng duyệt nào sẽ nhanh hơn và đáp ứng được mọi điều kiện, kể cả việc mở rộng thêm điều kiện!
     
    #20

Chia sẻ trang này