Hỏi về lọc và tìm kiếm theo điều kiện? (1 người xem)

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

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

KUMI

Bụi phấn
Tham gia
17/1/12
Bài viết
564
Được thích
571
Xin chào Thầy Cô và các Anh chị trong GPE!
Em đang gặp một vướng mắc như đã trình bày cụ thể trong file kèm.
Mong Thầy Cô và Anh Chị tìm cách giúp đỡ ạ!
Em xin cảm ơn!
 

File đính kèm

Bạn có thể ngâm cứu code sau để tuỳ biến
Mã:
Sub ValueToTable()
    Dim i As Long
    For j = 7 To 9  'j chay tu thu tu cot G => thu tu cot I
        For i = 1 To 9 '=Count(C8:C100)
            If Cells(i + 7, 4) = Cells(7, j) Then    'So sanh
                Cells(1000, j).End(3).Offset(1, 0) = Cells(i + 7, 3)   'Dien du lieu vao bang
            End If
        Next
    Next
End Sub
 
Upvote 0
Bạn có thể ngâm cứu code sau để tuỳ biến
Mã:
Sub ValueToTable()
    Dim i As Long
    For j = 7 To 9  'j chay tu thu tu cot G => thu tu cot I
        For i = 1 To 9 '=Count(C8:C100)
            If Cells(i + [COLOR=#0000CD][B]7[/B][/COLOR], 4) = Cells([COLOR=#FF0000][B]7[/B][/COLOR], j) Then    'So sanh
                Cells([COLOR=#FF0000][B]1000[/B][/COLOR], j).End([COLOR=#800080][B]3[/B][/COLOR]).Offset([COLOR=#008000][B]1[/B][/COLOR], 0) = Cells(i + [COLOR=#0000CD][B]7[/B][/COLOR], [B]3[/B])   'Dien du lieu vao bang
            End If
        Next
    Next
End Sub
Cảm ơn anh Ninh nhé!
Code chạy rất đúng ý với file đính kèm, tuy nhiên em vẫn chưa hiểu lắm,phiền anh chỉ rõ thêm ạ:
-Có phải những số màu xanh là của bảng 1 và những số màu đỏ là của bảng 2 phải không anh?
-Số 3-1-3 ý nghĩa là gì vậy anh?
Untitled.jpg
Em đã test code chạy thấy chậm chậm, nếu bảng dữ liệu 1 của Em tầm 1500 dòng và bảng 2 khoảng 40 cột thì code trên liệu có chậm lắm không ạ?
 
Upvote 0
Em đã test code chạy thấy chậm chậm, nếu bảng dữ liệu 1 của Em tầm 1500 dòng và bảng 2 khoảng 40 cột thì code trên liệu có chậm lắm không ạ?
Thì việc của bạn là phải giả lập dữ liệu cho giống với thật (nếu không muốn đưa file thật lên đây)
Tôi cũng chưa hình dung lọc thế để làm gì nữa
Tôi thấy bài này nhưng chưa viết code vì.... tính tôi hơi kỳ: Phải thấy được sự cần thiết và sự hữu ích sau này thì mới tiến hành viết code. Hiếm khi viết code chỉ dùng 1 lần
 
Upvote 0
Xin chào Thầy Cô và các Anh chị trong GPE!
Em đang gặp một vướng mắc như đã trình bày cụ thể trong file kèm.
Mong Thầy Cô và Anh Chị tìm cách giúp đỡ ạ!
Em xin cảm ơn!

khi thầy viết bảng bụi phấn rơi rơi.....
G8=INDEX($C$8:$C$16,SMALL(IF($D$8:$D$16=G$7,ROW($C$8:$C$16)-7,""),ROW(1:1)))-->Ctrl shift enter
làm sao để bẫy lỗi
 
Upvote 0
Cảm ơn anh Ninh nhé!
Code chạy rất đúng ý với file đính kèm, tuy nhiên em vẫn chưa hiểu lắm,phiền anh chỉ rõ thêm ạ:
-Có phải những số màu xanh là của bảng 1 và những số màu đỏ là của bảng 2 phải không anh?
-Số 3-1-3 ý nghĩa là gì vậy anh?
Em đã test code chạy thấy chậm chậm, nếu bảng dữ liệu 1 của Em tầm 1500 dòng và bảng 2 khoảng 40 cột thì code trên liệu có chậm lắm không ạ?
Tôi tưởng bạn đang tìm hiểu VBA, nên thắc mắc để học hỏi, thế nên tôi đã "com men" một số dòng. Nhưng hoá ra là hỏi bâng quơ cho dữ liệu thực
Thôi thì...biết vậy lần sau đợi thực rồi làm
 
Lần chỉnh sửa cuối:
Upvote 0
Thì việc của bạn là phải giả lập dữ liệu cho giống với thật (nếu không muốn đưa file thật lên đây)
Tôi cũng chưa hình dung lọc thế để làm gì nữa
Tôi thấy bài này nhưng chưa viết code vì.... tính tôi hơi kỳ: Phải thấy được sự cần thiết và sự hữu ích sau này thì mới tiến hành viết code. Hiếm khi viết code chỉ dùng 1 lần

Hì,con rất vui khi nhìn thấy Thầy xuất hiện ở đây ,hihi dữ liệu của con trong file thật nó cũng y trang như vậy thôi Thầy ạ khác mỗi cái là số lượng dòng cột nó lớn hơn. 1500 dòng tương đương với 1500 người và 40 cột tương ứng với 40 tổ.
Ở bảng 1 là danh sách tên và các tổ, ở bảng 2 là lọc theo từng tổ.

Mục đích làm vậy là để đưa các mã số từ bảng 2 tại mỗi cột sang mỗi Sheet khác nhau dành cho mỗi tổ.
Nói cách khác là bảng 2 của con chỉ là dữ liệu phụ.

Thầy xem thêm file kèm ạ. Nếu có cách nào từ bảng 1 mà ra luôn các Sheet bên thì con đỡ khỏi dùng bảng 2.
Thầy giúp con với ạ! Cảm ơn Thầy!
 

File đính kèm

Upvote 0
huhuuh.........sao hôm nay dệ tử ruột..mà bị các thầy đập dữ vậy...hichic
 
Upvote 0
Tôi tưởng bạn đang tìm hiểu VBA, nên thắc mắc để học hỏi, thế nên tôi đã "com men" một số dòng. Nhưng hoá ra là hỏi bâng quơ cho dữ liệu thực
Thôi thì...biết vậy lần sau đợi thực rồi làm
Anh Ninh thông cảm cho ạ có những cái mà em không thể up lên được. vì đó là thông tin nội bộ.
Nhưng nếu cần thiết em cũng có thể gửi thư riêng. (Đã có lần em cũng gửi riêng cho Thầy NDU về thông tin nộ bộ rồi đó ạ).
Nội qui của công ty đặt ra nên em cũng phải tuân theo thôi anh ạ.
Em rất muốn gửi luôn file thật để đỡ khỏi mất thời gian giả lập. Nhưng giả lập để up lên như thế này thì để tiện mọi người trao đổi cái nào hiệu quả nhất thì áp dụng Anh ạ.

Em không muốn gây khó dễ cho ai nhất là mọi người trong GPE.
Mong Anh hiểu và thông cảm cho ạ!
Cảm ơn Anh!
 
Upvote 0
khi thầy viết bảng bụi phấn rơi rơi.....
G8=INDEX($C$8:$C$16,SMALL(IF($D$8:$D$16=G$7,ROW($C$8:$C$16)-7,""),ROW(1:1)))-->Ctrl shift enter
làm sao để bẫy lỗi
Cảm ơn Anh Nhập môn ạ! Em muốn dùng VBA cơ. Vì sử dụng công thức mảng em cũng có áp dụng rồi:
http://www.giaiphapexcel.com/forum/showthread.php?80866-Hỏi-về-Hàm-lọc-theo-điều-kiện
Nhưng Em thấy ì ạch quá nên mới chuyển sang VBA xem có khá hơn không ạ.
 
Upvote 0
khi thầy viết bảng bụi phấn rơi rơi.....
G8=INDEX($C$8:$C$16,SMALL(IF($D$8:$D$16=G$7,ROW($C$8:$C$16)-7,""),ROW(1:1)))-->Ctrl shift enter
làm sao để bẫy lỗi
Bảng giờ.....xài bảng từ, bụi phấn ...........cóc có rơi
=IF(ROW(A1)>COUNTIF($D$8:$D$16,G$7),"",INDEX($C$8:$C$16,SMALL(IF($D$8:$D$16=G$7,ROW($C$8:$C$16)-7,""),ROW(1:1))))
Bẫy lỗi "dzì" nè
Xì- pam í a xì- pam
To: KUMI
40 tổ làm 40 sheet, híc, sao không làm một bảng lọc thôi, cần xem hay in Tổ thì lôi tổ đó ra thôi
Thân
 
Upvote 0
Bảng giờ.....xài bảng từ, bụi phấn ...........cóc có rơi

Bẫy lỗi "dzì" nè
Xì- pam í a xì- pam
To: KUMI
40 tổ làm 40 sheet, híc, sao không làm một bảng lọc thôi, cần xem hay in Tổ thì lôi tổ đó ra thôi
Thân
Cảm ơn Thầy Cò ạ! :D
Sở dĩ con tách nhiều Sheets như vậy là vì dữ liệu không chỉ đơn giản là mấy cột đó thôi đâu ạ. mà còn rất nhiều cột và nhiều dòng khác nữa.
Con chỉ phác họa những ý chính cần thiết làm sao đủ để áp dụng được vào file thật của mình thôi ạ.

Ý kiến của Thầy con thấy rất có lý đấy ạ, vì mình có thể dùng auto filter để quản lý.
Nhưng hiện giờ file này liên quan đến nhiều các file khác quá. Nếu thay đổi cấu trúc e là mệt hơn nhiều đó ạ. Hì, có lẽ sau này có nhiều thời gian và kiến thức con sẽ xem lại sau vậy.
Cảm ơn sự góp ý của Thầy!
 
Upvote 0
Cảm ơn Thầy Cò ạ! :D
Sở dĩ con tách nhiều Sheets như vậy là vì dữ liệu không chỉ đơn giản là mấy cột đó thôi đâu ạ. mà còn rất nhiều cột và nhiều dòng khác nữa.
Con chỉ phác họa những ý chính cần thiết làm sao đủ để áp dụng được vào file thật của mình thôi ạ.

Ý kiến của Thầy con thấy rất có lý đấy ạ, vì mình có thể dùng auto filter để quản lý.
Nhưng hiện giờ file này liên quan đến nhiều các file khác quá. Nếu thay đổi cấu trúc e là mệt hơn nhiều đó ạ. Hì, có lẽ sau này có nhiều thời gian và kiến thức con sẽ xem lại sau vậy.
Cảm ơn sự góp ý của Thầy!
Thôi thì cứ giữ nguyên cấu trúc như file hiện có của bạn. Bạn sử dụng code sau cho đối tượng ThisWorkbook, lưu ý: Ngoại trừ Sheet1, các sheet còn lại phải có tên giống như trong cột BP (cột D) của Sheet1, vì code sẽ dựa trên tên sheet để lấy dữ liệu.
[GPECODE=vb]Private Sub Workbook_SheetActivate(ByVal Sh As Object)
Dim Tmp, Arr(), i As Long, k As Long, S As String
Application.ScreenUpdating = False
If Sh.Name = "Sheet1" Then Exit Sub
Tmp = Sheet1.[C8:D10000]: S = Sh.Name
Sh.[B11:D10000].Clear
ReDim Arr(1 To UBound(Tmp), 1 To 2)
For i = 1 To UBound(Tmp)
If IsEmpty(Tmp(i, 1)) Then Exit For
If Tmp(i, 2) = S Then
k = k + 1
Arr(k, 1) = k: Arr(k, 2) = Tmp(i, 1)
End If
Next
If k = 0 Then Exit Sub
Sh.[B11].Resize(k, 2) = Arr
Sh.[D11].Resize(k) = S
Sh.[B11].CurrentRegion.Borders.LineStyle = 1
Application.ScreenUpdating = True
End Sub[/GPECODE]
 

File đính kèm

Upvote 0
Mục đích làm vậy là để đưa các mã số từ bảng 2 tại mỗi cột sang mỗi Sheet khác nhau dành cho mỗi tổ.
Nói cách khác là bảng 2 của con chỉ là dữ liệu phụ.

Vậy hỏi tiếp: Bạn đưa danh sách ấy sang các sheet để làm gì? Dùng làm validation list chăng?
Tôi phải hỏi cho rõ để biết MỤC ĐÍCH CUỐI CÙNG, nhằm làm luôn 1 lần (mất công làm cái chuyện dở dở ương ương)
 
Upvote 0
Con định cho con bé con đi ngủ rồi ngủ luôn nhưng tự nhiên nghĩ đến ý tưởng của Thầy Cò nên ngẫm nghĩ một hồi thấy căng thẳng vì nhiều vướng mắc quá nên hết buồn ngủ lại mò dậy.

To: KUMI
40 tổ làm 40 sheet, híc, sao không làm một bảng lọc thôi, cần xem hay in Tổ thì lôi tổ đó ra thôi
Thân
Xin hỏi các Thầy có cách nào để tính tổng khi autofil không ạ?
Các Thầy xem file kèm ạ!

Vậy hỏi tiếp: Bạn đưa danh sách ấy sang các sheet để làm gì? Dùng làm validation list chăng?
Mục đích của con chỉ là đưa mã số từ bảng 1 các cột mã số ở từng Sheet nhỏ là công đoạn cuối cùng rồi Thầy ạ! mục đích là để quản lý thông tin của từng người,từng bộ phận.
Thầy cẩn thận như vậy con cảm thấy rất yên tâm. hihi
 

File đính kèm

Upvote 0
Thôi thì cứ giữ nguyên cấu trúc như file hiện có của bạn. Bạn sử dụng code sau cho đối tượng ThisWorkbook, lưu ý: Ngoại trừ Sheet1, các sheet còn lại phải có tên giống như trong cột BP (cột D) của Sheet1, vì code sẽ dựa trên tên sheet để lấy dữ liệu.
[GPECODE=vb]Private Sub Workbook_SheetActivate(ByVal Sh As Object)
Dim Tmp, Arr(), i As Long, k As Long, S As String
Application.ScreenUpdating = False
If Sh.Name = "Sheet1" Then Exit Sub
Tmp = Sheet1.[C8:D10000]: S = Sh.Name
Sh.[B11:D10000].Clear
ReDim Arr(1 To UBound(Tmp), 1 To 2)
For i = 1 To UBound(Tmp)
If IsEmpty(Tmp(i, 1)) Then Exit For
If Tmp(i, 2) = S Then
k = k + 1
Arr(k, 1) = k: Arr(k, 2) = Tmp(i, 1)
End If
Next
If k = 0 Then Exit Sub
Sh.[B11].Resize(k, 2) = Arr
Sh.[D11].Resize(k) = S
Sh.[B11].CurrentRegion.Borders.LineStyle = 1
Application.ScreenUpdating = True
End Sub[/GPECODE]

Cảm ơn Anh Nghĩa Phúc đã dành thời gian để nghĩ cách giúp em.
Em Test với file kèm thì đúng ạ.
Nhưng để đưa vào file thực em nghĩ chưa ổn lắm. Vì file thực của Em số dòng cột mỗi Sheets là Cố định (khoảng 120 dòng và 80 cột).
Ngoài 2 cột minh họa ra thì còn các cột thể hiện thông tin về mỗi cá nhân theo từng hạng mục.
Vì thế em chỉ muốn cập nhật dữ liệu kiểu value cho một cột duy nhất là cột mã số thôi ạ. Nhưng em thử file thấy cập nhật cả định dạng và cột bộ phận nữa ạ.
Ngoài có thể thay thế sự kiện Workbook_SheetActivate bằng việc chạy code được không Anh? Nghĩa là chỉ khi nào chạy code mới cập nhật anh ạ? chứ không nhất thiết phải liên tục khi đổi sheet như vậy ạ.
 
Upvote 0
Xin lỗi Thầy NDU và Anh Nghĩa Phúc nhé!
Con định đợi 2 bài của 2 người nhưng thôi con đi ngủ đây ạ,khuya khuya rồi :D,hôm nay con cũng hơi mệt, ngày thì cũng bận rộn. Hi vọng mai ngủ dậy sẽ có kết quả tốt đẹp từ Thầy và Anh. hihi

Thầy và Anh giữ gìn sức khỏe nhé!

hehe...SPam giống Thầy Cò tí.. ^^
 
Upvote 0
Cảm ơn Anh Nghĩa Phúc đã dành thời gian để nghĩ cách giúp em.
Em Test với file kèm thì đúng ạ.
Nhưng để đưa vào file thực em nghĩ chưa ổn lắm. Vì file thực của Em số dòng cột mỗi Sheets là Cố định (khoảng 120 dòng và 80 cột).
Ngoài 2 cột minh họa ra thì còn các cột thể hiện thông tin về mỗi cá nhân theo từng hạng mục.
Vì thế em chỉ muốn cập nhật dữ liệu kiểu value cho một cột duy nhất là cột mã số thôi ạ. Nhưng em thử file thấy cập nhật cả định dạng và cột bộ phận nữa ạ.
Ngoài có thể thay thế sự kiện Workbook_SheetActivate bằng việc chạy code được không Anh? Nghĩa là chỉ khi nào chạy code mới cập nhật anh ạ? chứ không nhất thiết phải liên tục khi đổi sheet như vậy ạ.
- Nếu không muốn cập nhật cột Bộ phận thì bạn bỏ dòng lệnh thứ 17 đi.
- Nếu không muốn thay đổi định dạng thì bạn sửa dòng thứ 6 thành Sh.[B11:C10000].ClearContents
- Bạn hoàn toàn có thể thay sử kiện Workbook_SheetActivate bởi 1 Sub trong Module, chỉ cần khai báo 1 biến Sh kiểu WorkSheet, sử dụng vòng lặp For để duyệt qua các sheet của Workbook là được.
- Còn việc code chạy ổn với file thực của bạn thì tôi đành chịu vì không biết file thực của bạn ra sao.
 
Upvote 0
- Nếu không muốn cập nhật cột Bộ phận thì bạn bỏ dòng lệnh thứ 17 đi.
- Nếu không muốn thay đổi định dạng thì bạn sửa dòng thứ 6 thành Sh.[B11:C10000].ClearContents
- Bạn hoàn toàn có thể thay sử kiện Workbook_SheetActivate bởi 1 Sub trong Module, chỉ cần khai báo 1 biến Sh kiểu WorkSheet, sử dụng vòng lặp For để duyệt qua các sheet của Workbook là được.
- Còn việc code chạy ổn với file thực của bạn thì tôi đành chịu vì không biết file thực của bạn ra sao.

Hi, Em cảm ơn Anh Phúc nhiều nhé! Code của anh em áp dụng được vào file kèm rồi ạ.
Em tiện đây em xin hỏi thêm nếu trong trường hợp em áp dụng với một file kèm như thế này, thì code phải sửa thế nào vậy Anh?
Cảm ơn anh ạ!
 

File đính kèm

Upvote 0
Hi, Em cảm ơn Anh Phúc nhiều nhé! Code của anh em áp dụng được vào file kèm rồi ạ.
Em tiện đây em xin hỏi thêm nếu trong trường hợp em áp dụng với một file kèm như thế này, thì code phải sửa thế nào vậy Anh?
Cảm ơn anh ạ!
Thiệt tình cứ nhìn mấy file Merge cell là thấy oải, chẳng muốn nghiên cứu gì thêm. Hãy bố trí dữ liệu cho khoa học đi bạn ơi.
 
Upvote 0
Dạ vâng! Cảm ơn Anh đã chỉ giáo ạ. Em hỏi như vậy cũng là nghĩ do nghĩ đến một file tương tự dạng này thôi ạ.
Vậy nếu bỏ Merge cell thì như thế này.
Liệu code trên có thể sửa lại để phù hợp với dạng này không ạ?

nghĩa là dữ liệu điền xen kẽ qua 2 dòng. Anh xem thêm file kèm ạ!
 

File đính kèm

Upvote 0
Dạ vâng! Cảm ơn Anh đã chỉ giáo ạ. Em hỏi như vậy cũng là nghĩ do nghĩ đến một file tương tự dạng này thôi ạ.
Vậy nếu bỏ Merge cell thì như thế này.
Liệu code trên có thể sửa lại để phù hợp với dạng này không ạ?

nghĩa là dữ liệu điền xen kẽ qua 2 dòng. Anh xem thêm file kèm ạ!
Về cơ bản thì nó là thế này:
[GPECODE=vb]Sub LocDuLieu()
Dim Tmp, Arr(), i As Long, k As Long, Sh As Worksheet, S As String
Application.ScreenUpdating = False
For Each Sh In ThisWorkbook.Sheets
If Sh.Name <> "Sheet1" Then
Tmp = Sheets("Sheet1").[C8:D10000]: S = Sh.Name
Sh.[B11:C10000].ClearContents
ReDim Arr(1 To 3 * UBound(Tmp), 1 To 2)
k = 1
For i = 1 To UBound(Tmp)
If IsEmpty(Tmp(i, 1)) Then Exit For
If Tmp(i, 2) = S Then
Arr(k, 1) = k \ 3 + 1: Arr(k, 2) = Tmp(i, 1)
k = k + 3
End If
Next
If k = 1 Then Exit Sub
Sh.[B11].Resize(k - 3, 2) = Arr
End If
Next
Application.ScreenUpdating = True
End Sub[/GPECODE]
Còn thêm màu mè, mắm muối gì đó thì tùy bạn.
 
Upvote 0
Về cơ bản thì nó là thế này:
[GPECODE=vb]Sub LocDuLieu()
Dim Tmp, Arr(), i As Long, k As Long, Sh As Worksheet, S As String
Application.ScreenUpdating = False
For Each Sh In ThisWorkbook.Sheets
If Sh.Name <> "Sheet1" Then
Tmp = Sheets("Sheet1").[C8:D10000]: S = Sh.Name
Sh.[B11:C10000].ClearContents
ReDim Arr(1 To 3 * UBound(Tmp), 1 To 2)
k = 1
For i = 1 To UBound(Tmp)
If IsEmpty(Tmp(i, 1)) Then Exit For
If Tmp(i, 2) = S Then
Arr(k, 1) = k \ 3 + 1: Arr(k, 2) = Tmp(i, 1)
k = k + 3
End If
Next
If k = 1 Then Exit Sub
Sh.[B11].Resize(k - 3, 2) = Arr
End If
Next
Application.ScreenUpdating = True
End Sub[/GPECODE]
Còn thêm màu mè, mắm muối gì đó thì tùy bạn.

Em cảm ơn ạ! Hiện tại em đã thử thấy rất ổn. Sau có vấn đề gì phát sinh em lại tìm anh..hihi!
 
Upvote 0
Em cảm ơn ạ! Hiện tại em đã thử thấy rất ổn. Sau có vấn đề gì phát sinh em lại tìm anh..hihi!
Chỉnh sửa code trên một chút sẽ hợp lý hơn:
[GPECODE=vb]Sub LocDuLieu()
Dim Tmp, Arr(), i As Long, k As Long, Sh As Worksheet, S As String
Application.ScreenUpdating = False
Tmp = Sheets("Sheet1").[C8:D10000]
For Each Sh In ThisWorkbook.Sheets
If Sh.Name <> "Sheet1" Then
S = Sh.Name
Sh.[B11:C10000].ClearContents
ReDim Arr(1 To 3 * UBound(Tmp), 1 To 2)
k = -2
For i = 1 To UBound(Tmp)
If IsEmpty(Tmp(i, 1)) Then Exit For
If Tmp(i, 2) = S Then
k = k + 3
Arr(k, 1) = k \ 3 + 1: Arr(k, 2) = Tmp(i, 1)
End If
Next
If k = -2 Then Exit Sub
Sh.[B11].Resize(k, 2) = Arr
End If
Next
Application.ScreenUpdating = True
End Sub[/GPECODE]
Có 2 thay đổi chủ yếu trong code này:
1. Đưa câu lệnh Tmp = Sheets("Sheet1").[C8:D10000] ra ngoài vòng For Each..., việc này là nên làm vì việc gán giá trị cho Tmp chỉ cần thực hiện 1 lần, nếu đưa vào trong vòng For thì sẽ thừa thao tác gán không cần thiết.
2. Tăng giá trị của k trước khi gán giá trị vào mảng, thực ra thì việc này không quan trọng nhưng làm như vậy có vẻ tự nhiên hơn.
 
Upvote 0

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

Back
Top Bottom