Lọc dữ liệu theo cột cho trước

Liên hệ QC

Ca_Rot_Xanh

Thành viên mới
Tham gia
9/9/10
Bài viết
23
Được thích
3
Chào các anh/chị!!!
Em là nebi, em rất ngưỡng mộ các anh/chị trên dd... Hôm nay em xin được các anh/chị chỉ giáo cho em 1 vấn đề về lọc dữ liệu ạ. Mong các anh/chị giúp đỡ!

Em có 1 sheet excel. Khi em nhấn nút Lọc sẽ xuất hiện 1 form hoặc 1 combo bõ cho phép mình nhập vào địa chỉ cột muốn lọc dữ liệu. Ví dụ gõ vào D: sẽ lọc dữ liệu theo cột D (trong file của em là Ngành nghề).... Em còn bập bẹ quá nên mò mẫn mấy ngày mà chưa ra..Rất mong được sự giúp đỡ của các anh/chị trên dd. Chúc anh/chị sức khoẻ và thành công
 

File đính kèm

  • LOC DIEU KIEN.rar
    113.4 KB · Đọc: 80
Các anh/chị giúp em với ạ. Rất mong hồi âm. Ý định của em là có 1 textbox hay 1 ô nào đó để cho phép người dùng nhập vào địa chỉ cột (VD: A, B, C...), và nhấn nút Lọc, sẽ lọc dữ liệu theo ô đã cho trước. Dữ liệu tách ra từng sheet. Em hơi mù mờ nên ngồi mấy ngày rồi chưa ra ạ....hic...Mong được sự chỉ giáo
 
Chào các anh/chị!!!
Em là nebi, em rất ngưỡng mộ các anh/chị trên dd... Hôm nay em xin được các anh/chị chỉ giáo cho em 1 vấn đề về lọc dữ liệu ạ. Mong các anh/chị giúp đỡ!

Em có 1 sheet excel. Khi em nhấn nút Lọc sẽ xuất hiện 1 form hoặc 1 combo bõ cho phép mình nhập vào địa chỉ cột muốn lọc dữ liệu. Ví dụ gõ vào D: sẽ lọc dữ liệu theo cột D (trong file của em là Ngành nghề).... Em còn bập bẹ quá nên mò mẫn mấy ngày mà chưa ra..Rất mong được sự giúp đỡ của các anh/chị trên dd. Chúc anh/chị sức khoẻ và thành công
Híc, khó hiểu quá
Chơi một ngụm rượu của Bác Sa xong mới hiểu được một tí tẹo
Làm đại, trật .....làm lại
Sửa code TachSheet() một tý
Mã:
Sub TachSheet()
  Application.ScreenUpdating = False
  Application.DisplayAlerts = False
    Dim tam As Integer, Loc As String, Vung As Range, Cot As Range
    On Error Resume Next
    Set Vung = Range([b3], [b1000].End(xlUp))
        Loc = UCase(InputBox("nhâp côt muôn loc"))
        tam = VBA.Asc(Loc) - 64
            Vung.Resize(, 4).Sort Key1:=Range(Loc & 4), Order1:=xlAscending, Header:=xlGuess
            Vung.Offset(0, tam - 2).AdvancedFilter 2, , [g3], 1
                Set Cot = Range([g3], [g3].End(xlDown))
                    For i = 2 To Cot.Rows.Count
                        dv = Cot(i)
                        Sheets.Add
                            With Vung.Offset(0, -1).Resize(, 5)
                                .AutoFilter Field:=tam, Criteria1:=dv
                                .SpecialCells(12).Copy Sheets(dv).[a1]
                                .AutoFilter
                                End With
                        Sheets(dv).Range([b2], [b100].End(xlUp)).Offset(0, -1) = [row(A:A)]
                    Next
        Cot.Clear
  Application.DisplayAlerts = True
  Application.ScreenUpdating = True
End Sub
Mình mới thử cột C, D, E ( cột Stt "zí" cột Tên chắc chẳng lọc đâu nhỉ bạn)
 

File đính kèm

  • LOC DIEU KIEN.rar
    29.3 KB · Đọc: 70
Híc, khó hiểu quá
Chơi một ngụm rượu của Bác Sa xong mới hiểu được một tí tẹo
Làm đại, trật .....làm lại
Sửa code TachSheet() một tý
Mã:
Sub TachSheet()
  Application.ScreenUpdating = False
  Application.DisplayAlerts = False
    Dim tam As Integer, Loc As String, Vung As Range, Cot As Range
    On Error Resume Next
    Set Vung = Range([b3], [b1000].End(xlUp))
        Loc = UCase(InputBox("nhâp côt muôn loc"))
        [COLOR=Red][B]tam = VBA.Asc(Loc) - 64  [/B][/COLOR]
            [B][COLOR=Red]Vung.Resize(, 4).Sort Key1:=Range(Loc & 4), Order1:=xlAscending, Header:=xlGuess
            Vung.Offset(0, tam - 2).AdvancedFilter 2, , [g3], 1[/COLOR][/B]
                Set Cot = Range([g3], [g3].End(xlDown))
                    For i = 2 To Cot.Rows.Count
                        dv = Cot(i)
                        Sheets.Add
                            With Vung.Offset(0, -1).Resize(, 5)
                                .AutoFilter Field:=tam, Criteria1:=dv
                                .SpecialCells(12).Copy Sheets(dv).[a1]
                                .AutoFilter
                                End With
                        Sheets(dv).Range([b2], [b100].End(xlUp)).Offset(0, -1) = [row(A:A)]
                    Next
        Cot.Clear
  Application.DisplayAlerts = True
  Application.ScreenUpdating = True
End Sub
Mình mới thử cột C, D, E ( cột Stt "zí" cột Tên chắc chẳng lọc đâu nhỉ bạn)
Ôi, tks bác nhiều... Em mới xem qua, đúng y em, nhưng hình như file bị chậm bác nhỉ. Bác ơi, em không hiểu cái chỗ đỏ đỏ, bác có lòng giúp em, bác giải thích dùm em với... tks bác nhiều, Chúc bác sức khoẻ và thành công
 
Ôi, tks bác nhiều... Em mới xem qua, đúng y em, nhưng hình như file bị chậm bác nhỉ. Bác ơi, em không hiểu cái chỗ đỏ đỏ, bác có lòng giúp em, bác giải thích dùm em với... tks bác nhiều, Chúc bác sức khoẻ và thành công
Máy mình cấu hình trung bình thôi mà chạy cũng ngon lành mà
tam = VBA.Asc(Loc) - 64 Lấy mã Asc của biến Loc (chính là chữ mình nhập vào) - 64 để ra cột muốn lọc (trừ 64 vì mã Asc của "A" là 65)
Vung.Resize(, 4).Sort Key1:=Range(Loc & 4), Order1:=xlAscending, Header:=xlGuess Biến Vung là vùng tử B3 trở xuống tới hết dữ liệu trong cột B ở Sheet1 ==> tấn công về phía bên phải thêm 3 cột nữa rồi Sort nó ( cái này bỏ đi cũng được, mình làm để khi bạn chèn các sheet vào thì nó theo thứ tự bạn dễ tìm kiếm, kiểm soát
Vung.Offset(0, tam - 2).AdvancedFilter 2, , [g3], 1 Từ cột B chạy tới cái cột mình muốn lọc, lấy ra dữ liệu duy nhất, đây chính là tên của các sheet bạn chèn vào ( nếu sau khi sort mình cũng có thể cho nó chạy ngay trong cột để lấy tên sheet chen nhưng như thế sẽ phải chạy nhiều hơn vì nó phải quét qua toàn bộ dữ liệu trong cột
Híc, mình cũng biết tới đó, hy vọng giúp được bạn tí tẹo
Thân
 
Híc, khó hiểu quá
Chơi một ngụm rượu của Bác Sa xong mới hiểu được một tí tẹo
Làm đại, trật .....làm lại
Sửa code TachSheet() một tý
Mã:
Sub TachSheet()
  Application.ScreenUpdating = False
  Application.DisplayAlerts = False
    Dim tam As Integer, Loc As String, Vung As Range, Cot As Range
    On Error Resume Next
    Set Vung = Range([b3], [b1000].End(xlUp))
        Loc = UCase(InputBox("nhâp côt muôn loc"))
        tam = VBA.Asc(Loc) - 64
            Vung.Resize(, 4).Sort Key1:=Range(Loc & 4), Order1:=xlAscending, Header:=xlGuess
            Vung.Offset(0, tam - 2).AdvancedFilter 2, , [g3], 1
                Set Cot = Range([g3], [g3].End(xlDown))
                    For i = 2 To Cot.Rows.Count
                        dv = Cot(i)
                        Sheets.Add
                            With Vung.Offset(0, -1).Resize(, 5)
                                .AutoFilter Field:=tam, Criteria1:=dv
                                .SpecialCells(12).Copy Sheets(dv).[a1]
                                .AutoFilter
                                End With
                        Sheets(dv).Range([b2], [b100].End(xlUp)).Offset(0, -1) = [row(A:A)]
                    Next
        Cot.Clear
  Application.DisplayAlerts = True
  Application.ScreenUpdating = True
End Sub
Mình mới thử cột C, D, E ( cột Stt "zí" cột Tên chắc chẳng lọc đâu nhỉ bạn)
bài này hay quá bác cocogia ơi, bác làm hộ theo mẫu em với được không Bác hihii. Bác xem file nhé
thanks Bác!!!
 

File đính kèm

  • Copy of TEST CÔNG NỢ.xls
    57 KB · Đọc: 14
Máy mình cấu hình trung bình thôi mà chạy cũng ngon lành mà

Híc, mình cũng biết tới đó, hy vọng giúp được bạn tí tẹo
Thân

Hic, sau một hồi hì hục chỉnh sửa theo ý mình, nó báo lỗi...Bác giúp em cái... Mình có thể tạo hàm chung không bác, không cần hàm Tạo DS có được không bác nhỉ
 

File đính kèm

  • LOC DIEU KIEN COT_THU.rar
    140.4 KB · Đọc: 12
Máy mình cấu hình trung bình thôi mà chạy cũng ngon lành mà
tam = VBA.Asc(Loc) - 64 Lấy mã Asc của biến Loc (chính là chữ mình nhập vào) - 64 để ra cột muốn lọc (trừ 64 vì mã Asc của "A" là 65)
Đang nghĩ nếu cột cần lọc nằm từ cột AA trở đi thì sao trời
Asc(Loc) - 64 e rằng không ăn
Có chăng là vầy anh à:
PHP:
Loc = UCase(InputBox("nhâp côt muôn loc"))
tam = Columns(Loc).Column
Ngoài ra còn phải tính vị trí tương đối của cột cần lọc với vùng dữ liệu
 
Đang nghĩ nếu cột cần lọc nằm từ cột AA trở đi thì sao trời
Asc(Loc) - 64 e rằng không ăn
Có chăng là vầy anh à:
PHP:
Loc = UCase(InputBox("nhâp côt muôn loc"))
tam = Columns(Loc).Column
Ngoài ra còn phải tính vị trí tương đối của cột cần lọc với vùng dữ liệu
Híc, nếu mà lọc tới đó chắc mình đi ngủ thôi Thầy ơi, cái này chỉ áp dụng cho bài này, mà cái yêu cầu này cũng ngộ thật, cũng đã tính như Thầy nói nhưng thấy bài không nhiều cột nên "chơi" nó "zị" cũng được mà
 
Hiện có 2 người đang xem đề tài này. (2 thành viên và 0 khách)

Bác cogia, ty của em ....}}}}}}}}}} Cám ơn bác lắm lắm...Em mới vào mà được bác quan tâm giúp đỡ thế, em cảm động lắm ạ ... Bác xem lại giúp em nhá. Vì em muốn thử lại với sheet nhiều cột hơn, dữ liệu nhiều hơn mà nó báo lỗi quá. tks bác
 
Lần chỉnh sửa cuối:
nhìn nức mắt quá. hic

Em tìm được file này của anh Dfromwear thấy cũng na ná mà em mò cũng lâu chỉ hiểu được khoảng 30 % ., để áp dụng . em thấy code cũng ngắn nữa mấy a xem thử coi có rut gì ra được cho bạn ấy ko .
thanks
 

File đính kèm

  • TachSheetTheoKhach.xls
    57.5 KB · Đọc: 9
Hiện có 2 người đang xem đề tài này. (2 thành viên và 0 khách)

Bác cogia, ty của em ....}}}}}}}}}} Cám ơn bác lắm lắm...Em mới vào mà được bác quan tâm giúp đỡ thế, em cảm động lắm ạ ... Bác xem lại giúp em nhá. Vì em muốn thử lại với sheet nhiều cột hơn, dữ liệu nhiều hơn mà nó báo lỗi quá. tks bác
Nó đây
Mã:
Sub TachSheet()
  Application.ScreenUpdating = False
  Application.DisplayAlerts = False
    Dim tam As Integer, Loc As String, Vung As Range, Cot As Range, Tg As Double
    Tg = Timer
    On Error Resume Next
    Set Vung = Range([C3], [C6000].End(xlUp))
        Loc = UCase(InputBox("NHAP COT MUON LOC"))
        tam = VBA.Asc(Loc) - 64
            Vung.Offset(0, -1).Resize(, 12).Sort Key1:=Range(Loc & 4), Order1:=xlAscending, Header:=xlGuess
            Vung.Offset(0, tam - 3).AdvancedFilter Action:=xlFilterCopy, CopyToRange:=Range( _
        "aa3"), Unique:=True
                Set Cot = Range([AA3], [AA3].End(xlDown))
                    For i = 2 To Cot.Rows.Count
                        dv = Cot(i)
                        Sheets.Add
                            With Vung.Offset(0, -2).Resize(, 13)
                                .AutoFilter Field:=tam, Criteria1:=dv
                                .SpecialCells(12).Copy Sheets(dv).[a1]
                                .AutoFilter
                                End With
                        Sheets(dv).Range([C2], [C6000].End(xlUp)).Offset(0, -2) = [row(A:A)]
                    Next
        Cot.Clear
        Sheet1.[b1] = Timer - Tg
  Application.DisplayAlerts = True
  Application.ScreenUpdating = True
End Sub
Nói vui thôi nhé: cái yêu cầu của bạn lạ và "mắc cười" quá, lọc cột 4 mất 7 giây (ghê quá) bạn phải nhớ điền đủ dữ liệu ở các cột bạn muốn lọc nhé
Híc
 
Ối bác ơi, vẫn báo lỗi như cũ mà bác....hic..Bác xem file em đính kèm nhá, em copy đoạn code bác vừa sửa cho em vào, nhưng vẫn báo lỗi giống lúc nãy...
 

File đính kèm

  • LOC DIEU KIEN COT_THU.rar
    139.5 KB · Đọc: 6
Ối bác ơi, vẫn báo lỗi như cũ mà bác....hic..Bác xem file em đính kèm nhá, em copy đoạn code bác vừa sửa cho em vào, nhưng vẫn báo lỗi giống lúc nãy...
Mình thử cột D chạy Ok, cột E, F báo lỗi
Bạn nhìn bảng nó báo xem nó muốn nói gì với mình
Hoặc là sheet mình đổi tện trên 31 ký tự ( cái này "hổng" dính)
Hoặc là trong tên của mình có những ký tự mà ông Bill ổng cấm: "/" "?" v.v..( cái này dính chắc)
Mình đã thay tám mươi mấy cái "/" ở trong cột E là nó chạy ngon lành
Bạn thử lại đi, đổi những cái nó cấm thành ký hiệu khác
Híc, chúc thành công (không thành công cũng biết thêm một tí)
Thân
 
Mình thử cột D chạy Ok, cột E, F báo lỗi
Bạn nhìn bảng nó báo xem nó muốn nói gì với mình
Hoặc là sheet mình đổi tện trên 31 ký tự ( cái này "hổng" dính)
Hoặc là trong tên của mình có những ký tự mà ông Bill ổng cấm: "/" "?" v.v..( cái này dính chắc)
Mình đã thay tám mươi mấy cái "/" ở trong cột E là nó chạy ngon lành
Bạn thử lại đi, đổi những cái nó cấm thành ký hiệu khác
Híc, chúc thành công (không thành công cũng biết thêm một tí)
Thân
Anh concogia xem giùm bài em với hic!$@!!
 
Chào các anh/chị!!!
Em là nebi, em rất ngưỡng mộ các anh/chị trên dd... Hôm nay em xin được các anh/chị chỉ giáo cho em 1 vấn đề về lọc dữ liệu ạ. Mong các anh/chị giúp đỡ!

Em có 1 sheet excel. Khi em nhấn nút Lọc sẽ xuất hiện 1 form hoặc 1 combo bõ cho phép mình nhập vào địa chỉ cột muốn lọc dữ liệu. Ví dụ gõ vào D: sẽ lọc dữ liệu theo cột D (trong file của em là Ngành nghề).... Em còn bập bẹ quá nên mò mẫn mấy ngày mà chưa ra..Rất mong được sự giúp đỡ của các anh/chị trên dd. Chúc anh/chị sức khoẻ và thành công
Có phải bạn muốn thế này không? (Xem file đính kèm)

Code nút LOC
PHP:
Sub GPE_Loc()
Dim data As Range, clls As Range, iC As Byte, dk As Boolean
With Sheet1
    .[aa1].CurrentRegion.ClearContents
Set data = .[a2].CurrentRegion
    Application.ScreenUpdating = False
    iC = AscW(UCase(InputBox("Loc du lieu theo cot:", "Tach du lieu trung", ""))) - 64
    data.Resize(, 1).Offset(, iC - 1).AdvancedFilter 2, , .[aa1], 1
    .[aa1].CurrentRegion.Sort key1:=.[aa1], header:=1
End With
For Each clls In Intersect(Sheet1.[aa1].CurrentRegion, Sheet1.[aa1].CurrentRegion.Offset(1))
    data.AutoFilter Field:=iC, Criteria1:=clls.Value
    dk = False
    For Each sh In Worksheets
        If sh.Name = clls Then
            dk = 1: sh.Select
        End If
    Next
    If dk = False Then Sheets.Add
    With ActiveSheet
        .Name = clls
        data.SpecialCells(12).Copy .[a1]
        .[a2].Resize(.[a1].End(xlDown).Row - 1) = [row(a:a)]
        .[a2].CurrentRegion.ColumnWidth = 60
        .[a2].CurrentRegion.Columns.AutoFit
        .[a2].CurrentRegion.Rows.AutoFit
        .Move After:=Sheets(Sheets.Count)
        .Tab.ColorIndex = 3 + (Sheets.Count Mod 3)
    End With
Next
    Sheet1.Select: Selection.AutoFilter
    Application.ScreenUpdating = True
End Sub
Code nút Xoá Sheet vừa tạo
PHP:
Sub XoaSheets()
Dim sh
    Application.ScreenUpdating = False
Application.DisplayAlerts = False
    For Each sh In Worksheets
        If sh.CodeName <> "Sheet1" And sh.CodeName <> "Sheet2" Then sh.Delete
    Next
Application.DisplayAlerts = True
    Application.ScreenUpdating = True
End Sub
 

File đính kèm

  • Loc dk.rar
    139.8 KB · Đọc: 25
Em cám ơn anh boy_xịn, anh con cò già ạ.... Hic...Em đang mừng như bắt được kim cương đấy ạ..Mấy bữa nay mù mờ mò mẫn nhức đầu quá. may có 2 anh.... Một lần nữa em cám ơn các anh rất nhiều. Chúc các anh sức khoẻ và thành công.
 
bài này hay quá bác cocogia ơi, bác làm hộ theo mẫu em với được không Bác hihii. Bác xem file nhé
thanks Bác!!!
Hihi, bạn vanhesing vui tính quá
1)- Bạn nhờ mình: khi chọn tên nào thì tạo ra cái sheet mới mang tên cái tên mình vừa chọn - Híc, cái tên để chọn bạn muốn nó nằm ở sheet sẽ lọc dữ liệu nhưng lúc đó nó chưa ra đời thì làm sao mà chọn tên hả Trời (giống như :muốn đứng tên nhà phải có hộ khẩu, muốn vô hộ khẩu phải đứng tên nhà)
2)- Thay vì bài này là chọn cột chỉnh lại của em là chon tên nhe anh :.,=Hổng hiểu (Cột? Tên?)
3)- 3 cột cuối là sao??? cái này mình thấy bạn nói "zí" Thầy Thunghi nhiều mà "bi' giờ mình vẫn chưa hiểu
4)- Bài này mình đã làm cho bạn "zồi" mà, như thế này theo mình lấy code bữa trước mình làm chạy ngon lành thôi, bảng biểu đâu có gì thay đổi
Nói vui thôi, có gì đừng giận nhé
Thân
 
Ối bác ơi, vẫn báo lỗi như cũ mà bác....hic..Bác xem file em đính kèm nhá, em copy đoạn code bác vừa sửa cho em vào, nhưng vẫn báo lỗi giống lúc nãy...
Tôi dùng UserForm để lọc... Bạn kiểm tra xem thế nào nhé
- Bấm nút Lọc, Form sẽ mở
- Quét chọn vùng dữ liệu
- Chọn cột cần lọc
- Bấm nút Lọc và xem kết quả
----------------------------------------
Có phải bạn muốn thế này không? (Xem file đính kèm)

Code nút LOC
PHP:
Sub GPE_Loc()
   ..............
    iC = AscW(UCase(InputBox("Loc du lieu theo cot:", "Tach du lieu trung", ""))) - 64
   .............
End Sub
Lại dùng hàm Asc ---> Sẽ có lúc die nếu cột dữ liệu nằm từ AA trở về sau
Nói chung, xác định Column kiểu này là không ăn thua
Ngoài ra, không phải muốn đặt tên sheet thế nào cũng được đâu! Chẳng hạn nếu lọc theo cột E (Địa chỉ) thì tên sheet kiểu này: 1/4, Ấp 2 sẽ bị lỗi ngay lập tức (nó chẳng chịu dấu / đâu)
 

File đính kèm

  • LOC DIEU KIEN.rar
    151.6 KB · Đọc: 38
Lần chỉnh sửa cuối:
Hihi, bạn vanhesing vui tính quá
1)- Bạn nhờ mình: khi chọn tên nào thì tạo ra cái sheet mới mang tên cái tên mình vừa chọn - Híc, cái tên để chọn bạn muốn nó nằm ở sheet sẽ lọc dữ liệu nhưng lúc đó nó chưa ra đời thì làm sao mà chọn tên hả Trời (giống như :muốn đứng tên nhà phải có hộ khẩu, muốn vô hộ khẩu phải đứng tên nhà)
2)- Thay vì bài này là chọn cột chỉnh lại của em là chon tên nhe anh :.,=Hổng hiểu (Cột? Tên?)
3)- 3 cột cuối là sao??? cái này mình thấy bạn nói "zí" Thầy Thunghi nhiều mà "bi' giờ mình vẫn chưa hiểu
4)- Bài này mình đã làm cho bạn "zồi" mà, như thế này theo mình lấy code bữa trước mình làm chạy ngon lành thôi, bảng biểu đâu có gì thay đổi
Nói vui thôi, có gì đừng giận nhé
Thân
em đâu giám giận anh . hic oan quá!!!
Vậy tạo sheet là tạo ra tất cả các tên có ntrong dâtta chứ không chọn 1 tên mà tạo được à?
Tại em thấy cách này hay quá nên muốn thử và học hỏi , Bài mà anh giúp bạn Ca_rot ... tạo sheet theo cột nếu bài của em tạo được thì nó có tạo theo tên được ko?
Không thì anh chỉnh lại file của em 1 chút giùm, 3 cột cuối là " công nợ đầu", "công nợ cuối " và "ghi chú", em điền công thức 3 cột đó khi searrch tên ra thì nó để lỗi #N/A.
Thanks anh vì đã dạy dỗ em !
(Em chân thành ko hàm ý anh đừng giận oan e nữa. hic)
 
Web KT
Back
Top Bottom