Bài toán tìm và lọc

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

dqt_nt

Thành viên hoạt động
Tham gia
7/6/08
Bài viết
100
Được thích
29
Chào các anh chị!
Tôi bị vướng ở chổ tìm và lọc dữ liệu. Đã thử đủ mọi cách nhưng vẫn chưa tìm ra đáp số
Tôi có danh sách các loại bằng như sau:
Kỹ sư cơ khí
Kỹ sư cơ khí chế tạo
Kỹ sư cơ khí tàu thuyền
Kỹ sư cơ khí động lực
Kỹ sư cơ khí vỏ tàu
Cử nhân cao đẳng điện
Kỹ sư điện
Trung cấp điện
Cử nhân kế toán
Cử nhân CĐ Kế toán
Cử nhân Văn hóa
Cử nhân CNTT
Yêu cầu của tôi là tìm trong các loại bằng đó, loại nào là cơ khí, loại nào là điện cho ra kết quả tương ứng.
Tất cả yêu cầu tôi đã mô tả trong file. Mong các anh chị giúp sức.
Cảm ơn!
 

File đính kèm

Theo tôi thì bạn nen đặt Mã cho dữ liệu bạn muốn lọc.Còn nếu dùng công thức cũng khá kho khăn vì dữ liệu của bạn rất khó để bóc tách, và tôi cũng chưa rõ bạn muốn những bàng nào vào nhóm naò? tất cả cử nhân vào một nhóm hay phải tác riêng ra?
 
Chào các anh chị!
Tôi bị vướng ở chổ tìm và lọc dữ liệu. Đã thử đủ mọi cách nhưng vẫn chưa tìm ra đáp số
Tôi có danh sách các loại bằng như sau:

Yêu cầu của tôi là tìm trong các loại bằng đó, loại nào là cơ khí, loại nào là điện cho ra kết quả tương ứng.
Tất cả yêu cầu tôi đã mô tả trong file. Mong các anh chị giúp sức.
Cảm ơn!
Bạn thử xem file có được không? vấn đề này có rất nhiều trên diễn đàn rồi mà
 

File đính kèm

Theo tôi thì bạn nen đặt Mã cho dữ liệu bạn muốn lọc.Còn nếu dùng công thức cũng khá kho khăn vì dữ liệu của bạn rất khó để bóc tách, và tôi cũng chưa rõ bạn muốn những bàng nào vào nhóm naò? tất cả cử nhân vào một nhóm hay phải tác riêng ra?
Thế này bạn ạ!!! Ý của tôi là muốn thống kê những ông tốt nghiệp về cơ khí, về điện, về .... Chỉ cần tìm trong text ở cột A có chữ "cơ khí" thì trả giá trị "cơ khí" ở cột B.... Mục đích là sau đó đếm có bao nhiêu người.
Ví dụ cho dễ hiểu nhé!
Cột A ..................................... Cột B
Kỹ sư cơ khí ........................ Cơ khí
Kỹ sư cơ khí động lực ............ Cơ khí
Trung cấp điện .......................Điện
Cao đẳng điện ........................ Điện
.....
Sau đó tôi sẽ thống kê lại có bao nhiêu người có bằng cơ khí. Thực ra dữ liệu còn nhiều ràng buộc lắm, nhưng tôi chỉ trích cái cần hỏi thôi. Rất mong giúp sức.
@Hoangminhtien: Cái bạn làm rất hay, tôi sẽ ứng dụng vào việc phù hợp khác, nhưng với bài toán này nó vẫn chưa đúng ý tôi. Cảm ơn bạn. Bạn lại giúp tôi nhé!
 
Lần chỉnh sửa cuối:
Thế này bạn ạ!!! Ý của tôi là muốn thống kê những ông tốt nghiệp về cơ khí, về điện, về .... Chỉ cần tìm trong text ở cột A có chữ "cơ khí" thì trả giá trị "cơ khí" ở cột B.... Mục đích là sau đó đếm có bao nhiêu người.
Ví dụ cho dễ hiểu nhé!

Sau đó tôi sẽ thống kê lại có bao nhiêu người có bằng cơ khí. Thực ra dữ liệu còn nhiều ràng buộc lắm, nhưng tôi chỉ trích cái cần hỏi thôi. Rất mong giúp sức.
@Hoangminhtien: Cái bạn làm rất hay, tôi sẽ ứng dụng vào việc phù hợp khác, nhưng với bài toán này nó vẫn chưa đúng ý tôi. Cảm ơn bạn. Bạn lại giúp tôi nhé!
Bạn phải cho biết trong phần LỌC có tổng cộng bao nhiêu LOẠI
ví dụ:
Cử nhân Văn hóa thuộc loại gì?
Cử nhân CNTT thuộc loại gì?
Tốt nhất bạn liệt kê vào file đính kèm đi
 
Bạn xem trong file có đúng ý bạn không nhé!
 

File đính kèm

Macro sau sẽ chép tuần tự

Để thấy kết quả, bạn cần thêm 1 cột STT trước cột 'A' hiện tại & thêm 2 cột 'C] & [D] sau cột này
Thứ nữa cột có chữ 'Lọc' của bạn giớ là cột 'E', ta hãy bôi chọn các ô trong cột có chứa dữ liệu & gán cho nó cái tên, VD 'Loc' (Không dấu nặng nha.)

Cho chạy mảco sau để có kiết quả & thực hiện việc kiểm xem đúng ý bạn chưa;
Cần bổ sung điều gì, hãy phát biểu!

PHP:
Option Explicit
Sub LietKeNganh()
 Dim Chuan As Range, Rng As Range, Clls As Range, sRng As Range, cRng As Range
 Dim MyAdd As String
 
 Set Chuan = Range("Loc"):       Set Rng = Range([B1], [B1].End(xlDown))
 Range([C1], Cells(Rng.Rows.Count, "D")).Clear
 
 For Each Clls In Chuan
   
   Set sRng = Rng.Find(Clls.Value, , xlFormulas, xlPart, MatchCase:=False)
   If Not sRng Is Nothing Then
      MyAdd = sRng.Address
      Do
         If cRng Is Nothing Then
            Set cRng = sRng.Offset(, -1).Resize(, 2)
         Else
            Set cRng = Union(cRng, sRng.Offset(, -1).Resize(, 2))
         End If
         Set sRng = Rng.FindNext(sRng)
      Loop While Not sRng Is Nothing And sRng.Address <> MyAdd
   End If
   If Not cRng Is Nothing Then
      cRng.Copy Destination:=[c65500].End(xlUp).Offset(1)
      Set cRng = Nothing
   End If
 Next Clls
End Sub
 
Bạn xem trong file có đúng ý bạn không nhé!
Nếu có 1 cột phụ chứa LOẠI BẰNG như bạn Hoangminhtien vừa đưa lên trong file đính kèm thì chỉ cần 1 công thức duy nhất, không cần bất cứ name hay cột phụ nào:
PHP:
=INDEX($H$2:$H$6,MAX(IF(ISERROR(SEARCH($H$2:$H$6,$A2,1)),"",ROW($1:$5))),)
Đây là công thức mãng ---> Phải Ctrl + Shift + Enter
 

File đính kèm

Lần chỉnh sửa cuối:
Nếu có 1 cột phụ chứa LOẠI BẰNG như bạn Hoangminhtien vừa đưa lên trong file đính kèm thì chỉ cần 1 công thức duy nhất, không cần bất cứ name hay cột phụ nào:
PHP:
=INDEX($H$2:$H$6,MAX(IF(ISERROR(SEARCH($H$2:$H$6,$A2,1)),"",ROW(INDIRECT("1:"&ROWS($H$2:$H$6))))),)
Đây là công thức mãng ---> Phải Ctrl + Shift + Enter
Vậy cái này cũng tiện hơn. Hôm giờ vẫn đang vật lộn với cái QLNS anh NDU ạ!

@HYen17: Thank bạn đã nhiệt tình giúp đỡ. Trình độ VBA của mình còn non lắm. Dù sao cũng cảm ơn bạn. Để ngâm cứu sau //**/
 
Có một lỗi nhỏ các anh ơi!
Hiện tôi đang ứng dụng cái của anh ndu96081631 thì phát hiện thế này:

- Nếu như bên cột bằng cấp rỗng, thì bên cột lọc lại cho giá trị đầu tiên của vùng tham chiếu (tức là CNTT) --> cái này thì tôi đã khắc phục được bằng hàm if.
=IF(A2="","",INDEX($H$2:$H$6,MAX(IF(ISERROR(SEARCH($H$2:$H$6,$A2,1)),"",ROW(INDIRECT("1:"&ROWS(H2:H6))))),))

- Tuy nhiên, nếu trong cột A (cột bằng cấp) mà có loại bằng khác ngoài danh sách (ví dụ: Cử nhân An toàn Hàng hải) thì cột lọc lại trải về giá trị đầu tiên của vùng tham chiếu (tức CNTT). --> Vậy có cách nàp khắc phục điều này: Tức là, trong DS bằng cấp có rất nhiều loại, giờ tôi chỉ muốn lọc một số loại thôi. Loại nào không có trong tham chiếu thì bỏ trống.

Đang nghiên cứu cái của bạn Tiến...
 
Có một lỗi nhỏ các anh ơi!
Hiện tôi đang ứng dụng cái của anh ndu96081631 thì phát hiện thế này:

- Nếu như bên cột bằng cấp rỗng, thì bên cột lọc lại cho giá trị đầu tiên của vùng tham chiếu (tức là CNTT) --> cái này thì tôi đã khắc phục được bằng hàm if.


- Tuy nhiên, nếu trong cột A (cột bằng cấp) mà có loại bằng khác ngoài danh sách (ví dụ: Cử nhân An toàn Hàng hải) thì cột lọc lại trải về giá trị đầu tiên của vùng tham chiếu (tức CNTT). --> Vậy có cách nàp khắc phục điều này: Tức là, trong DS bằng cấp có rất nhiều loại, giờ tôi chỉ muốn lọc một số loại thôi. Loại nào không có trong tham chiếu thì bỏ trống.

Đang nghiên cứu cái của bạn Tiến...
Sửa thế này đây:
Công thức củ:
PHP:
=INDEX($H$2:$H$6,MAX(IF(ISERROR(SEARCH($H$2:$H$6,$A2,1)),"",ROW($1:$5))),)
Sửa lại thành:
PHP:
=IF(MAX(IF(ISERROR(SEARCH($H$2:$H$6,$A2,1)),"",ROW($1:$5)))=0,"",INDEX($H$2:$H$6,MAX(IF(ISERROR(SEARCH($H$2:$H$6,$A2,1)),"",ROW($1:$5))),))
Hơi dài. vì thế trường hợp này đặt name là hợp lý
Bạn xem file tiếp theo
1> Đăt name:
PHP:
VT =IF(ISERROR(SEARCH(Sheet1!$H$2:$H$6,Sheet1!$A2,1)),"",ROW(Sheet1!$1:$5))
2> Công thức
PHP:
=IF(COUNT(VT)=0,"",INDEX($H$2:$H$6,MAX(VT),))
 

File đính kèm

Web KT

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

Back
Top Bottom