Lọc dữ liệu Excel (1 người xem)

  • Thread starter Thread starter laddy9x
  • Ngày gửi Ngày gửi

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

laddy9x

Thành viên mới
Tham gia
31/8/14
Bài viết
8
Được thích
0
Các bác cho em hỏi với ạ:
- Em có sheet 1 là thông tin về nhật ký bán hàng:
+ Ngày tháng
+ Khách hàng
+ Sản phẩm
+ Số lượng
+ Tiền
- Em muốn ở Sheet 2 tạo ra các list lựa chọn, khi click chọn khách hàng 1 thì nó sẽ hiện ra các đơn hàng của khách hàng 1 (ngày tháng, sản phẩm, số lượng, tiền...) và tương tự với khách hàng 2,3,4...
Vậy em phải dùng những hàm nào để làm được điều này ạ. Em cảm ơn%#^#$
 
Bạn cho file mẫu đi. Tui nghĩ bài của bạn chưa chắc đã chỉ dùng mỗi hàm đâu ^^
 
Bạn cho file mẫu đi. Tui nghĩ bài của bạn chưa chắc đã chỉ dùng mỗi hàm đâu ^^
File của em đây ạ, ở sheet bán hàng là nhật ký bán hàng cho từng khách hàng, em muốn ở 1 sheet khác em có các lựa chọn để cho ra được các đơn hàng của khách hàng đó cũng như doanh thu ạ. Em cảm ơn
 

File đính kèm

Cụ thể là như thế nào? sao không trình bày chi tiết ra để mọi người có thể hiểu thì mới giúp được chứ.
1. Từ sheet Bán hàng, dựa vào tiêu chí gì, cột nào cần lấy....
2. Xuất ra cho vào sheet nào? Mẫu sheet mong muốn đâu???
3. ....
Dạ,
1. từ sheet bán hàng dựa vào việc lựa chọn mã khách hàng (ở sheet kết quả - BCDT), từ đó cho ra 1 bảng dữ liệu bao gồm các tiêu chí:
+ Ngày tháng
+ Tên khách hàng
+ Sản phẩm
+ Số lượng
+ Thành tiền
2. Xuất vào sheet BCDT em đã tạo mẫu ạ

Em cảm ơn %#^#$
 

File đính kèm

Bạn chạy code sau. Alt+F11, click vào sheet8(BCDT) Paste code bên dưới vào. Thay đổi giá trị tại C3 để code chạy
Nhớ Enable Macro trên máy của bạn.
Bạn tự copy tiêu đề vào dòng 5 & 6 nha. Tiêu đề thì trừ 2 cái là Mã & tên khách hàng ra, còn lại tôi lấy hết. Vì 2 cái này thấy bạn đã làm ở trên rồi đó....
Dữ liệu sau khi lọc được dán vào từ dòng 7 trở đi
Mã:
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Dim DL, Kq(1 To 65000, 1 To 12), lr As Long, Arr
Dim r As Long, I As Long, Dk As String, J As Long
Dk = [C3].Value
Arr = Array(2, 3, 6, 7, 8, 9, 10, 11, 12, 13, 14)
Application.ScreenUpdating = False
If Target.Address = "$C$3" Then
    With Sheet4
        DL = .Range(.[A4], .[A65000].End(3)).Resize(, 14)
    End With


    For r = 1 To UBound(DL)
        If DL(r, 4) = Dk Then
            I = I + 1
                Kq(I, 1) = I
            For J = 0 To UBound(Arr)
                Kq(I, J + 2) = DL(r, Arr(J))
            Next J
        End If
    Next r
    If I Then
        Range("A7:L65000").ClearContents
        Range("A7").Resize(I, 12) = Kq
        lr = Range("A65000").End(3).Row
        Range("A7:L65000").Borders.LineStyle = 0
        Range("A7:L" & lr).Borders.LineStyle = 1
    Else
        Range("A7:L65000").Borders.LineStyle = 0
        Range("A7:L65000").ClearContents
    End If
End If
Application.ScreenUpdating = True
End Sub

em hơi gà chút, em đã "Alt+F11, click vào sheet8(BCDT) Paste code bên dưới vào" nhưng đến chỗ thay đổi giá trị C3 để cho chạy em không hiểu lắm :-s phải làm ntn ạ? em đã enable macro rồi ạ
 
Thay đổi ở đây có nghĩa là bạn làm động tác chọn cái mã khác hàng ở C3 mà bạn đang làm Data validation cho code nó chạy thôi. Vì là code sự kiện nên ta phải tác động vào ô C3 đó thì code nó mới chạy được...hiểu chửa???
em cảm ơn ạ, em đã làm được rồi ạ. CHo em hỏi thêm với ạ:
1.em muốn lọc tương tự cho từng sản phẩm như lọc cho từng khách hàng ở sheet BCSP như file: http://www.mediafire.com/view/f4qyc58y6fftr4i/Book1.xlsx
thì phải dùng code nào ạ?
2. Đối với việc lọc như trên em không muốn lấy tất cả các cột mà chỉ muốn lấy
+ Ngày tháng
+ Tên khách hàng
+ Sản phẩm
+ Số lượng
+ Thành tiền
thì phải sửa code như nào ạ
 
em cảm ơn ạ, em đã làm được rồi ạ. CHo em hỏi thêm với ạ:
1.em muốn lọc tương tự cho từng sản phẩm như lọc cho từng khách hàng ở sheet BCSP như file: http://www.mediafire.com/view/f4qyc58y6fftr4i/Book1.xlsx
thì phải dùng code nào ạ?
2. Đối với việc lọc như trên em không muốn lấy tất cả các cột mà chỉ muốn lấy
+ Ngày tháng
+ Tên khách hàng
+ Sản phẩm
+ Số lượng
+ Thành tiền
thì phải sửa code như nào ạ
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("C3:D3")) Is Nothing Then
    Call GiGido ' Ten Sub
End Sub
Mình nghĩ nên tách thủ tục và sự kiện ra cho nó dễ nhìn (quan điểm của cá nhân)
Có thể lọc song song của mã k hách hoặc tên khách hàng, hoặc đồng thời cả hai.
Có thể thêm một điều kiện nữa như code của Khương, hoặc dùng Ucase với Like
C3 và D3 sẽ là nơi mình để mã KH và tên khách hàng
 
em cảm ơn bác nhiều ạ :D
PHP:
Sub Gigido()
Dim Sarr, Darr(1 To 65000, 1 To 3), i As Long, k As Long, DK1, DK2
With Sheets("Ban hang")
        Sarr = .Range(.[A4], .[A65000].End(xlUp)).Resize(, 14).Value2
End With
With Sheets("BCDT")
    DK1 = UCase(.[C3])
    DK2 = UCase(.[D3])
    For i = 1 To UBound(Sarr)
        If UCase(Sarr(i, 4)) Like "*" & DK1 & "*" Then
               If UCase(Sarr(i, 5)) Like "*" & DK2 & "*" Then
                    k = k + 1
                    Darr(k, 1) = Sarr(i, 2)
                    Darr(k, 2) = Sarr(i, 7)
                    Darr(k, 3) = Sarr(i, 8)
                End If
        End If
    Next i
    .[A7:C65000].ClearContents
    If k Then
        .[A7].Resize(k, 3).Value = Darr
    End If
End With
End Sub
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Range("C3:D3")) Is Nothing Then
        Call Gigido
    End If
End Sub
Ví dụ thế này chẳng hạn, mình nghĩ cũng là một cách
 
PHP:
Sub Gigido()
Dim Sarr, Darr(1 To 65000, 1 To 3), i As Long, k As Long, DK1, DK2
With Sheets("Ban hang")
        Sarr = .Range(.[A4], .[A65000].End(xlUp)).Resize(, 14).Value2
End With
With Sheets("BCDT")
    DK1 = UCase(.[C3])
    DK2 = UCase(.[D3])
    For i = 1 To UBound(Sarr)
        If UCase(Sarr(i, 4)) Like "*" & DK1 & "*" Then
               If UCase(Sarr(i, 5)) Like "*" & DK2 & "*" Then
                    k = k + 1
                    Darr(k, 1) = Sarr(i, 2)
                    Darr(k, 2) = Sarr(i, 7)
                    Darr(k, 3) = Sarr(i, 8)
                End If
        End If
    Next i
    .[A7:C65000].ClearContents
    If k Then
        .[A7].Resize(k, 3).Value = Darr
    End If
End With
End Sub
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Range("C3:D3")) Is Nothing Then
        Call Gigido
    End If
End Sub
Ví dụ thế này chẳng hạn, mình nghĩ cũng là một cách

code này dùng ntn vậy ạ?
 
code này dùng ntn vậy ạ?
Bạn kích đúp vào sheet BCDT rồi dán sự kiện phía dưới vào
Còn thủ tục Sub Gigido còn copy vào Insert Module. C3 là mã khách, D3 là tên khách hàng. Kích vào một trong hai ô này là chạy thôi (giống như ở trên). Nhưng cài này mình chỉ làm tạm cho 3 cột thôi nhé.
 

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

Back
Top Bottom