Lọc dữ liệu trên 4 điều kiện. (2 người xem)

Liên hệ QC

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

trungthanhviva

Thành viên mới
Tham gia
10/6/09
Bài viết
35
Được thích
4
Chào các bạn.

Mình đã nghiên cứu rất nhiều bài viết trong mục Lọc và sắp xếp dữ liệu này, nhưng đến khi gặp vấn đề thực tế của mình thì mình lại không làm được, cho dù đã thử các cách, các bài có liên quan trong mục này, nhưng vẫn chưa ổn lắm, vì được điều kiện này, thì lại hỏng điều kiện kia, vì vậy mà mình lên đây, nhờ các bạn giúp đỡ. Rất mong nhận được sự giúp đỡ của các bạn. Chân thành cảm ơn.

Các bạn vui lòng tải file đính kèm:

Dưới đây là 1 số yêu cầu cần giúp đỡ (Chi tiết xin vui lòng xem file đính kèm):

Thống kê

Theo tháng, năm
Tháng, năm Hoặc Từ tháng, năm: Đến tháng, năm:

Theo tên đối tác
Tên đối tác Tên đối tác lấy theo bảng Data.

Theo mặt hàng
Tên mặt hàng Tên mặt hàng lấy theo bảng Data.

Theo biển số xe
Biển số xe Lấy theo bảng Data.

Yêu cầu: 1. Nếu chọn ô E3, hoặc ô H, J (từ ngày đến ngày), bảng thống kê biên dưới, sẽ lọc toàn bộ dữ liệu trong tháng, năm tương ứng của Sheet Data.

2. Nếu chọn ô E3 rồi chọn ô E4 (tên đối tác), bảng thống kê biên dưới, sẽ lọc toàn bộ dữ liệu trong tháng, năm tương ứng với tên đối tác trong tháng đó của Sheet Data. Nếu chọn là tất cả các đối tác, thì giá trị doanh thu, chi phí, lãi lỗ đều được tổng cộng theo từng đối tác trong khoảng thời gian được chọn ở E3. Các ô điều kiện khác cũng vậy, Nếu đã chọn "tất cả" thì đều phải tổng cộng theo 1 dữ liệu (ví dụ, 1 xe chở nhiều chuyến, thì chỉ hiển thị 1 lần biển số xe và cộng tất cả số liệu trong tháng được chọn của xe đó, các xe khác cũng vậy).

3. Nếu chọn ô E3 rồi chọn ô E4 (tên đối tác), rồi chọn ô E5 (tên mặt hàng), bảng thống kê biên dưới, sẽ lọc toàn bộ dữ liệu trong tháng, năm tương ứng với tên đối tác, tên mặt hàng trong tháng đó của Sheet Data.

4. Nếu chọn ô E3 rồi chọn ô E4 (tên đối tác), rồi chọn ô E5 (tên mặt hàng), rồi chọn ô E6 (biển số xe ) bảng thống kê biên dưới, sẽ lọc toàn bộ dữ liệu trong tháng, năm tương ứng với tên đối tác, tên mặt hàng trong tháng đó của Sheet Data.

5. Bắt buộc phải chọn ít nhất 2 ô điều kiện (ô điều kiện tháng, năm là bắt buộc), còn các ô E4, E5, E6, có thể chọn hoặc ko chọn vẫn được.

6. Xóa hoặc ẩn những ô không có dữ liệu.

7. Sắp xếp số thứ tự tại cột STT theo chiều tăng dần.

8. Tổng cộng giá trị Doanh thu, chi phí, lãi - lỗ ở dòng cuối cùng của bảng dưới đây, sau khi đã lọc dữ liệu xong.

9. Cảm ơn các bạn đã giúp đỡ.

BẢNG DOANH THU - CHI PHÍ VẬN TẢI

Đơn vị tính: VND

Stt Tháng, năm Biển số xe Mã đối tác Tên đối tác Tên mặt hàng Doanh thu Chi phí Lãi - Lỗ
 

File đính kèm

Lần chỉnh sửa cuối:
Bạn xem thử file đính kèm của mình nhé!MÌnh vừa tạo cho bạn theo yêu cầu!
 

File đính kèm

Cảm ơn bạn nhiều nhé. Mình vừa tải về... lát về nhà xem. Nhưng cũng xin được cảm ơn bạn trước.

À, mình vừa xem xong, nói thật là rất thán phục bạn, chỉ dùng công thức mà ko dùng code, nhưng còn thiếu 1 chút nữa, đó là nếu mình chọn điều kiện là tất cả của 1 nhóm nào đó (ví dụ là tháng 3, và tên đối tác là tất cả chẳng hạn, thì 2 nhóm còn lại là tên mặt hàng, và biển số xe sẽ ko được chọn nữa. và bảng dưới chỉ tổng cộng giá trị doanh thu, chi phí, lãi lỗ của các đối tác này lại thôi. Và ngược lại, Nếu chọn Tháng, năm, và chọn tất cả của tên mặt hàng thì ô tên đối tác và biển số xe cũng bị trắng (ko chọn) luôn, sau đó là tổng cộng giá trị doanh thu, chi phí, lãi lỗ của các mặt hàng đó.


Khi chọn tất cả như vậy, thì tên đối tác hay mặt hàng được lọc ra đều ko được trùng nhau, nếu trùng thì cộng thành 1 giá trị doanh thu, chi phí, lãi lỗ.

Nói chung : có 4 điều kiện, nhưng mỗi lần lọc, chỉ cho chọn tối đa 2 điều kiện, trong đó điều kiện về tháng (thời gian) là bắt buộc, còn lại chỉ được chọn 1 trong 3 điều kiện còn lại (hoặc là Tên đối tác, hoặc là tên mặt hàng, hoặc là biển số xe).

Bạn giải tiếp giùm mình nhé, vì mình mày mò cả tuần nay rồi mà ko ra đủ được như vậy.

Cảm ơn bạn rất nhiều.
 
Lần chỉnh sửa cuối:
Nói chung : có 4 điều kiện, nhưng mỗi lần lọc, chỉ cho chọn tối đa 2 điều kiện, trong đó điều kiện về tháng (thời gian) là bắt buộc, còn lại chỉ được chọn 1 trong 3 điều kiện còn lại (hoặc là Tên đối tác, hoặc là tên mặt hàng, hoặc là biển số xe).

.[/QUOTE]
Nếu bạn không muốn chọn điều kiện nào thì xóa điều kiện đó đi thì dữ liệu lọc cũng sẽ tự động thay đổi thỏa mãn 2 điều kiện bạn chọn. Chọn tối đa 2 điều kiện và điều kiện ngày tháng là bắt buộc, bạn xem file đính kèm nhé. Mình thấy bài bạn sáng nay rồi nhưng giờ mới có thời gian trả lời, vì đến công ty nhiều việc quá. Chúc bạn làm việc tốt!
 

File đính kèm

Cảm ơn bạn Hoamattroicoi rất nhiều, từ 2 bài giải của bạn, mình đã chỉnh sửa lại được theo ý mình 1 chút rồi (các bạn xem file đính kèm nhé). Nhưng nó vẫn chưa đạt chuẩn theo điều kiện bài toán mình đưa ra, vì nó còn các điều kiện sau:

Bây giờ, từ file của mình, các bạn hãy giúp mình 1 chút nữa, đó là lọc duy nhất, tính tổng, và xóa dòng trống. Ví dụ:

1. Lọc duy nhất theo tên đối tác hoặc tháng, năm, cụ thể như sau :

- Nếu mình chọn tháng năm là "tất cả", hoặc 1 tháng bất kỳ nào đó (3 ô còn lại là tên đối tác, tên mặt hàng, và biển số xe không được chọn): thì bảng bên dưới, cột tháng, năm sẽ chỉ hiển thị 2 dòng là tháng 3 và tháng 4, và cộng các giá trị của tất cả doanh thu, chi phí, lãi lỗ của các đối tác, các mặt hàng, các xe trong tháng 3 và tháng 4, sau đó tổng cộng cho tháng 3 và tháng 4 ở dòng cuối cùng. Riêng các cột "Biển số xe, mã đối tác, tên đối tác, tên mặt hàng" không hiển thị.

- Nếu mình chọn tên đối tác là "tất cả", ô tháng, năm cũng có thể chọn bất kỳ tháng nào hoặc "tất cả" (2 ô còn lại là tên tên mặt hàng, và biển số xe không được chọn): thì bảng bên dưới, cột tên đối tác sẽ hiển thị tên của tất cả các đối tác (hiển thị duy nhất, 1 tên đối tác 1 dòng trong bảng), cột tháng, năm, sẽ hiển thị dòng tháng 3 hoặc tháng 4 tùy theo điều kiện chọn, nhưng nếu điều kiện chọn tháng, năm là "tất cả" thì cột tên đối tác lúc này sẽ phải tách ra tên đối tác theo từng tháng tương ứng (nghĩa là mỗi tháng sẽ tổng hợp doanh thu, chi phí, lãi lỗ của đối tác đó 1 lần), sau đó cộng các giá trị của tất cả doanh thu, chi phí, lãi lỗ tương ứng với các đối tác đó theo từng tháng đã chọn, sau đó tổng cộng cho các đối tác đó ở dòng cuối cùng. Riêng các cột "Biển số xe, tên mặt hàng" không cần hiển thị.

- Các điều kiện còn lại là Tên mặt hàng, và biển số xe cũng sẽ được làm tương tự như 2 điều kiện trên. Chọn thời gian (tháng, năm) sau đó chọn từng tên mặt hàng hoặc chọn tất cả mặt hàng, cũng như chọn biển số xe hoặc "tất cả" biển số xe thì đều được làm như 2 điều kiện trên.

2. Sau khi lọc và tổng cộng giá trị xong, nếu các ô trống, có thể cho ẩn, hoặc tự động xóa đi.

Một lần nữa, xin được cảm ơn bạn rất nhiều, và cũng xin được các cao thủ chỉ giáo. Xin trân thành cảm ơn.
 

File đính kèm

Lần chỉnh sửa cuối:
Bạn kiểm trong file xem sao nha.

Chủ iếu dùng hàm DSUM() với sự trợ giúp tận tình của VBA


Còn 2 mục số xe & tên hàng nữa sẽ tiếp sau khi có ~ nhận xét của bạn.
 

File đính kèm

Rất vui mừng và cảm ơn bạn SA_DQ rất nhiều, bạn đã làm đúng ý mình và tuyệt vời hơn cả những gì mình mong muốn. Qua đây, rất mong muốn được bạn sớm giúp đỡ cho mình nốt 2 phần còn lại (Biển số xe và tên mặt hàng). Một lần nữa xin cảm ơn bạn rất nhiều.http://www.giaiphapexcel.com/forum/member.php?10-SA_DQ
 
Bạn lấy cặp macro này chép đè lên toàn bô cái cũ & chạy thử với 'MatHang'

PHP:
Option Explicit
Dim Sh As Worksheet, Rng As Range, Crit As Range
Dim eRw As Long

Private Sub Worksheet_Change(ByVal Target As Range)
 Dim Cls As Range
 Dim Jj As Byte:                                Dim Nam As String
 
 Set Sh = ThisWorkbook.Worksheets("Data")
 eRw = Sh.[B65500].End(xlUp).Row
'Dien Thang & Nam Cho Cac O Chua Co:'
 If Sh.[j6].End(xlDown).Row < eRw Then
    For Each Cls In Sh.Range(Sh.[j6].End(xlDown), Sh.Cells(eRw, "J"))
        Cls.FormulaR1C1 = "=MONTH(RC[-8])"
        Cls.Offset(, 1).FormulaR1C1 = "=YEAR(RC[-9])"
    Next Cls
 End If
 Set Rng = Sh.[B6].Resize(eRw, 10)
 [b1:B99].EntireRow.Hidden = False
     
 If Not Intersect(Target, [e3]) Is Nothing Then
    [b20].CurrentRegion.Offset(3, 1).ClearContents
    If Target.Value <> "All" Then
        With [B99].End(xlUp).Offset(1)
            .Value = "'" & Right("0" & [e3].Value, 2) & "/" & [G3].Value
            Set Crit = Sh.[AA1].Resize(2, 2)
            DoanhSo Crit
        End With
    Else
        Sh.[ac1].Value = "Th"
        For Jj = 1 To 12
            Sh.[ac2].Value = Jj
            With [B99].End(xlUp).Offset(1)
                .Value = "'" & Right("0" & Sh.[ac2].Value, 2) & "/" & [G3].Value
                Set Crit = Sh.[Ab1].Resize(2, 2)
                DoanhSo Crit
            End With
        Next Jj
    End If
    Range([b11].End(xlDown).Offset(2), [B98]).EntireRow.Hidden = True
    
 ElseIf Not Intersect(Target, [e5]) Is Nothing Then
    [b20].CurrentRegion.Offset(3, 1).ClearContents
    Sh.[ac1].Value = Sh.[F6].Value  '*'
    If Target.Value <> "All" Then
        Sh.[ac2].Value = [e5].Value  '*'
        If [e3].Value <> "All" Then
            With [B99].End(xlUp).Offset(1)
                .Value = "'" & Right("0" & [e3].Value, 2) & "/" & [G3].Value
                .Offset(, 4).Value = [e5].Value  '*'
                Set Crit = Sh.[AA1].Resize(2, 3)
                DoanhSo Crit
            End With
        Else
            Sh.[ad1].Value = "Th"
            For Jj = 1 To 12
                Sh.[ad2].Value = Jj
                Set Crit = Sh.[Ab1].Resize(2, 3)
                With [B99].End(xlUp).Offset(1)
                    .Value = "'" & Right("0" & Jj, 2) & "/" & [G3].Value
                    .Offset(, 4).Value = [e5].Value  '*'
                    DoanhSo Crit
                End With
            Next Jj
        End If
    Else
    
        If [e3].Value <> "All" Then
            Set Crit = Sh.[AA1].Resize(2, 3)
            Nam = Right([C3].Value, 5) & " " & [e3].Value & "/" & [G3].Value
        Else
            Set Crit = Sh.[Ab1].Resize(2, 2)
            Nam = Right([b11].Value, 3) & " " & [G3].Value
        End If
        For Each Cls In Sheets("DKien").Range("Mathang").SpecialCells(xlCellTypeConstants, 2).Offset(1) '*'
            If Cls.Value = "All" Then Exit For
            Sh.[ac2].Value = Cls.Value
            With [B99].End(xlUp).Offset(1)
                .Value = Nam
                .Offset(, 4).Value = Cls.Value
                DoanhSo Crit
            End With
        Next Cls
    End If
    Range([b11].End(xlDown).Offset(2), [B98]).EntireRow.Hidden = True
 ElseIf Not Intersect(Target, [e4]) Is Nothing Then
    [b20].CurrentRegion.Offset(3, 1).ClearContents
    Sh.[ac1].Value = Sh.[d6].Value
    If Target.Value <> "All" Then
        Sh.[ac2].Value = [G4].Value
        If [e3].Value <> "All" Then
            With [B99].End(xlUp).Offset(1)
                .Value = "'" & Right("0" & [e3].Value, 2) & "/" & [G3].Value
                .Offset(, 2).Value = [G4].Value
                .Offset(, 3).Value = [e4].Value
                Set Crit = Sh.[AA1].Resize(2, 3)
                DoanhSo Crit
            End With
        Else
            Sh.[ad1].Value = "Th"
            For Jj = 1 To 12
                Sh.[ad2].Value = Jj
                Set Crit = Sh.[Ab1].Resize(2, 3)
                With [B99].End(xlUp).Offset(1)
                    .Value = "'" & Right("0" & Jj, 2) & "/" & [G3].Value
                    .Offset(, 2).Value = [G4].Value
                    .Offset(, 3).Value = [e4].Value
                    DoanhSo Crit
                    
                End With
            Next Jj
        End If
    Else
        If [e3].Value <> "All" Then
            Set Crit = Sh.[AA1].Resize(2, 3)
            Nam = Right([C3].Value, 5) & " " & [e3].Value & "/" & [G3].Value
        Else
            Set Crit = Sh.[Ab1].Resize(2, 2)
            Nam = Right([b11].Value, 3) & " " & [G3].Value
        End If
        For Each Cls In Sheets("DKien").Range("MaDT").SpecialCells(xlCellTypeConstants, 2).Offset(1)
            If Cls.Value = "All" Then Exit For
            Sh.[ac2].Value = Cls.Value
            With [B99].End(xlUp).Offset(1)
                .Value = Nam
                .Offset(, 2).Value = Cls.Value
                .Offset(, 3).Value = Sheets("DKien").Range("MaDT"). _
                    Find(Cls.Value, , xlFormulas, xlWhole).Offset(, -1).Value
                DoanhSo Crit
            End With
        Next Cls
    End If
    Range([b11].End(xlDown).Offset(2), [B98]).EntireRow.Hidden = True
 End If
End Sub
Mã:
Sub DoanhSo(Crit As Range)
 Dim WF As Object
 Set WF = Application.WorksheetFunction
 With [B99].End(xlUp)
    .Offset(, 5).Value = WF.DSum(Rng, Sh.[g6], Crit)
    .Offset(, 6).Value = WF.DSum(Rng, Sh.[H6], Crit)
    .Offset(, 7).Value = WF.DSum(Rng, Sh.[I6], Crit)
 End With
End Sub
Chú í nhỏ:
Nút cảm ơn có trên diễn đàn!
Khi Copy nên bỏ các từ [php ], [/php] hay [code ] & [/code] đi nha.

(húc thành công nhiều!
 
Cảm ơm bạn HYen17. Chạy rất chuẩn bạn ạ. Mong các bạn sớm tiếp tục giúp mình điều kiện cuối cùng còn lại (Biển số xe). Trân thành cảm ơn rất nhiều.

À, có 1 điều mình muốn hỏi thêm là, trong trường hợp, danh sách đối tác, danh sách mặt hàng, và danh sách biển số xe vẫn được thêm mới vào hàng tháng chứ ko chỉ giới hạn như hiện tại, vậy có ảnh hưởng gì ko ? hay có phải chỉnh sửa lại Code ở trên hay ko ? nếu phải chỉnh sửa thì chỉnh sửa đoạn nào ? Các bạn hướng dẫn mình với nhé. Trân trọng cảm ơn rất nhiều.
 
Lần chỉnh sửa cuối:
(ác macro của bạn đây:

PHP:
Option Explicit
Dim Sh As Worksheet, Rng As Range, Crit As Range
Dim eRw As Long
Private Sub Worksheet_Change(ByVal Target As Range)
 Dim Cls As Range, nRng As Range
 Dim jJ As Byte:                                Dim Nam As String
 
 Set Sh = ThisWorkbook.Worksheets("Data")
 eRw = Sh.[B65500].End(xlUp).Row
 Set Rng = Sh.[B6].Resize(eRw, 10)
 [b1:B99].EntireRow.Hidden = False
 
 If Not Intersect(Target, [e3]) Is Nothing Then
    [b20].CurrentRegion.Offset(3, 1).ClearContents
    If Target.Value <> "All" Then
        With [B99].End(xlUp).Offset(1)
            .Value = "'" & Right("0" & [e3].Value, 2) & "/" & [G3].Value
            Set Crit = Sh.[AA1].Resize(2, 2)
            DoanhSo Crit
        End With
    Else
        Sh.[ac1].Value = "Th"
        For jJ = 1 To 12
            Sh.[ac2].Value = jJ
            With [B99].End(xlUp).Offset(1)
                .Value = "'" & Right("0" & Sh.[ac2].Value, 2) & "/" & [G3].Value
                Set Crit = Sh.[Ab1].Resize(2, 2)
                DoanhSo Crit
            End With
        Next jJ
    End If
    Range([b11].End(xlDown).Offset(2), [B98]).EntireRow.Hidden = True
 
 ElseIf Not Intersect(Target, [e6]) Is Nothing Then
    Set nRng = Sheets("DKien").Range("Biensoxe").Offset(1)
    GopMatHang_BienXe Target, Sh.[c6].Value, [e6].Value, nRng
 ElseIf Not Intersect(Target, [e5]) Is Nothing Then
    Set nRng = Sheets("DKien").Range("Mathang").Offset(1)
    GopMatHang_BienXe Target, Sh.[F6].Value, [e5].Value, nRng
 ElseIf Not Intersect(Target, [e4]) Is Nothing Then
1    [b20].CurrentRegion.Offset(3, 1).ClearContents
    Sh.[ac1].Value = Sh.[d6].Value
    If Target.Value <> "All" Then
        Sh.[ac2].Value = [G4].Value
        If [e3].Value <> "All" Then
            With [B99].End(xlUp).Offset(1)
                .Value = "'" & Right("0" & [e3].Value, 2) & "/" & [G3].Value
                .Offset(, 2).Value = [G4].Value
                .Offset(, 3).Value = [e4].Value
                Set Crit = Sh.[AA1].Resize(2, 3)
                DoanhSo Crit
            End With
        Else
            Sh.[ad1].Value = "Th"
            For jJ = 1 To 12
                Sh.[ad2].Value = jJ
                Set Crit = Sh.[Ab1].Resize(2, 3)
                With [B99].End(xlUp).Offset(1)
                    .Value = "'" & Right("0" & jJ, 2) & "/" & [G3].Value
                    .Offset(, 2).Value = [G4].Value
                    .Offset(, 3).Value = [e4].Value
                    DoanhSo Crit
 
                End With
            Next jJ
        End If
    Else
        If [e3].Value <> "All" Then
            Set Crit = Sh.[AA1].Resize(2, 3)
            Nam = Right([C3].Value, 5) & " " & [e3].Value & "/" & [G3].Value
        Else
            Set Crit = Sh.[Ab1].Resize(2, 2)
            Nam = Right([b11].Value, 3) & " " & [G3].Value
        End If
        For Each Cls In Sheets("DKien").Range("MaDT").SpecialCells(xlCellTypeConstants, 2).Offset(1)
            If Cls.Value = "All" Then Exit For
            Sh.[ac2].Value = Cls.Value
            With [B99].End(xlUp).Offset(1)
                .Value = Nam
                .Offset(, 2).Value = Cls.Value
                .Offset(, 3).Value = Sheets("DKien").Range("MaDT"). _
                    Find(Cls.Value, , xlFormulas, xlWhole).Offset(, -1).Value
                DoanhSo Crit
            End With
        Next Cls
    End If
2    Range([b11].End(xlDown).Offset(2), [B98]).EntireRow.Hidden = True
 End If
End Sub
Mã:
[B]Sub GopMatHang_BienXe(Targ As Range, AC1Value As String, AC2Value As String, VungTen As Range)[/B]
 Dim jJ As Byte, Nam As String, Cls As Range
    [b20].CurrentRegion.Offset(3, 1).ClearContents
    Sh.[ac1].Value = AC1Value
    If Targ.Value <> "All" Then
        Sh.[ac2].Value = AC2Value
        If [e3].Value <> "All" Then
            With [B99].End(xlUp).Offset(1)
                .Value = "'" & Right("0" & [e3].Value, 2) & "/" & [G3].Value
                .Offset(, 1).Value = AC2Value
                Set Crit = Sh.[AA1].Resize(2, 3)
                DoanhSo Crit
            End With
        Else
            Sh.[ad1].Value = "Th"
            For jJ = 1 To 12
                Sh.[ad2].Value = jJ
                Set Crit = Sh.[Ab1].Resize(2, 3)
                With [B99].End(xlUp).Offset(1)
                    .Value = "'" & Right("0" & jJ, 2) & "/" & [G3].Value
                    .Offset(, 1).Value = AC2Value
                    DoanhSo Crit
                End With
            Next jJ
        End If
    Else
        If [e3].Value <> "All" Then
            Set Crit = Sh.[AA1].Resize(2, 3)
            Nam = Right([C3].Value, 5) & " " & [e3].Value & "/" & [G3].Value
        Else
            Set Crit = Sh.[Ab1].Resize(2, 2)
            Nam = Right([b11].Value, 3) & " " & [G3].Value
        End If
        For Each Cls In VungTen             'Sheets("DKien").Range("Biensoxe").Offset(1) '*/'
            If Cls.Value = "All" Then Exit For
            Sh.[ac2].Value = Cls.Value
            With [B99].End(xlUp).Offset(1)
                .Value = Nam
                .Offset(, 1).Value = Cls.Value
                DoanhSo Crit
            End With
        Next Cls
    End If
    Range([b11].End(xlDown).Offset(2), [B98]).EntireRow.Hidden = True
[B]End Sub [/B]

PHP:
Sub DoanhSo(Crit As Range)
 Dim WF As Object
 Set WF = Application.WorksheetFunction
 With [B99].End(xlUp)
    .Offset(, 5).Value = WF.DSum(Rng, Sh.[g6], Crit)
    .Offset(, 6).Value = WF.DSum(Rng, Sh.[H6], Crit)
    .Offset(, 7).Value = WF.DSum(Rng, Sh.[I6], Crit)
 End With
End Sub
Mã:
[B]Private Sub Worksheet_Activate()[/B]
 Dim Cls As Range
 
 Set Sh = ThisWorkbook.Worksheets("Data")
 eRw = Sh.[B65500].End(xlUp).Row
'Dien Thang & Nam Cho Cac O Chua Co:'
 If Sh.[j6].End(xlDown).Row < eRw Then
    For Each Cls In Sh.Range(Sh.[j6].End(xlDown), Sh.Cells(eRw, "J"))
        Cls.FormulaR1C1 = "=MONTH(RC[-8])"
        Cls.Offset(, 1).FormulaR1C1 = "=YEAR(RC[-9])"
    Next Cls
 End If
 Set Sh = Nothing
[B]End Sub [/B]

(1) Nếu bạn có kiến thức về CSDL khá hơn thì ta còn rút gọn lại thêm nữa; Nhưng giờ sửa giúp bạn thì hơn oãi!
Này nha: Thực tế cột [MaDoiTac] tại trang 'Loc' là không cần thiết đưa ra đó; nó chỉ cần ở ô [G4] để hỗ trợ chúng ta tìm nhanh các đối tác cần thiết mà thôi;
Thêm 1 điều này nữa: theo cột 'E' của trang này , bạn tăng dần từ Đốitác=> Mặthàng => BiểnXe; Nhưng trong trang CSDL bạn lại xếp thứ tự ngược lại; Điều này sẽ khó thêm xíu cho tiến trình tự động hóa thống kê dữ liệu cho bạn.

(2) Mình đã tách fần thêm dữ liệu tự động từ hàm Month() & Year() cho các records mới nhập thành macro sự kiện riêng (macro cuối); Bạn cứ nhập dữ liệu mới vô CSDL, Một khi mở trang tính 'Loc', macro sự kiện này sẽ giúp bạn cập nhựt tự động 2 trường cuối của CSDL cho bạn!

(3) Cái ni rất chi là nhỏ nhoi, nhưng cũng cần thông báo cho bạn có thói quen tốt hơn: Các vùng đặt tên của bạn như 'Biensoxe' chỉ nên là 'BienXe' hay 'SoXe' mà thôi; & 'Mathang' thì nên là 'MatHang' dễ nhòm hơn nhiều!

Vài lòi cùng bạn & vui nha!
 
Cảm ơn bạn ChanhTA@ rất nhiều, các ý kiến của bạn rất hữu ích, mình cũng biết là đang bị thừa cột sau khi lọc, nhưng cũng rất khó để bỏ nó đi, nên mình đành để vậy luôn. Còn việc sắp xếp các điều kiện ở cột E như thế là vì mình muốn chọn điều kiện theo thứ tự ưu tiên từ quan trọng đến ko quan trọng.

Mới đầu mình tính là chỉ dùng các hàm có sẵn trong Excel để làm thôi, nhưng càng làm càng bí, trong khi mình lại ko biết gì về VBA. Rất may là có các bạn giúp đỡ, Cảm ơn các bạn rất nhiều. Cảm ơn giaiphapexcel.com.

À, chỗ này còn thiếu 1 chút, các bạn ạ, nếu mình chọn biển số xe là tất cả, hoặc 1 xe bất kỳ, thì nó sẽ lọc ra các xe, hoặc 1 xe, nhưng cột mã đối tác và tên đối tác thì sẽ phải hiển thị ra để biết được là xe đó thuộc đối tác nào (vì hiện giờ là đang chưa hiển thị), vậy nhờ các bạn làm thêm phần này giúp mình nhé.

Mình vừa chạy lọc lại bài của bạn ChanhTA@ gửi. Có chỗ này bị nhầm 1 chút (đó là cột Biển số xe) . Vì Nếu mình chọn tên mặt hàng là All, hoặc mặt hàng bất kỳ nào đó, nó đều hiển thị ở cột biển số xe thay vì phải hiển thị ở cột Tên mặt hàng.

Thêm 1 điều này nữa: nếu chọn điều kiện tháng, năm chỉ là 1 tháng nào đó chứ ko phải là All, và 1 trong các điều kiện còn lại, mình chọn là All, thì cột Tháng, năm sẽ không cần hiển thị tháng, năm nữa. Còn nếu chọn điều kiện Tháng, năm là All thì vẫn để cho hiển thị như hiện tại.

Và nếu như dữ liệu tiếp tục được thêm vào Sheet Data, có thể lên đến hàng ngàn dòng, vậy có phải chỉnh sửa lại mã code ko ? nếu phải chỉnh lại thì chỉnh ở vùng nào của code ?. Chắc chắn sau bải toán này, mình sẽ phải tích cực học hỏi nhiều hơn về VB của Excel này.

Vậy, rất mong các bạn giúp đỡ.
 
Lần chỉnh sửa cuối:
(1) Nếu mình chọn biển số xe là tất cả, hoặc 1 xe bất kỳ, thì nó sẽ lọc ra các xe, hoặc 1 xe, nhưng cột mã đối tác và tên đối tác thì sẽ phải hiển thị ra để biết được là xe đó thuộc đối tác nào, vậy nhờ các bạn làm thêm phần này giúp nhé.
(2) Mình vừa chạy lọc lại bài của bạn ChanhTA@ gửi. Có chỗ này bị nhầm 1 chút (đó là cột số xe) . Vì Nếu mình chọn tên mặt hàng là All, hay bất kỳ nào đó, nó đều hiển thị ở cột số xe thay vì phải hiển thị ở cột Mặt hàng.

(3) Thêm 1 điều này nữa: nếu chọn điều kiện tháng, năm chỉ là 1 tháng nào đó chứ ko phải là All, và 1 trong các điều kiện còn lại, mình chọn là All, thì cột Tháng, năm sẽ không cần hiển thị tháng, năm nữa. Còn nếu chọn điều kiện Tháng, năm là All thì vẫn để cho hiển thị như hiện tại.

(4)nếu như dữ liệu tiếp tục được thêm vào Sheet Data, có thể lên đến hàng ngàn dòng, vậy có phải chỉnh sửa lại mã code ko ?

(1), (2) & (4) khỏi lo lắng chi nhiều; riêng (4) bạn có thể dùng đến dưới 65500 dòng

(3) Trễ rồi & fiền lắm nếu sửa theo í bạn! (Vì đó là toạ độ mốc để chép dữ liệu thống kê khác) - Thôi thì bạn format bằng tay đi vậy:= cho cột đó có font trắng trong khi muốn!


Hai macro cần sửa, mình đã sửa đây:

PHP:
Option Explicit
Dim Sh As Worksheet, Rng As Range, Crit As Range
Dim eRw As Long

Private Sub Worksheet_Change(ByVal Target As Range)
 Dim Cls As Range, nRng As Range
 Dim jJ As Byte:                                Dim Nam As String
 
 Set Sh = ThisWorkbook.Worksheets("Data")
 eRw = Sh.[B65500].End(xlUp).Row
 Set Rng = Sh.[B6].Resize(eRw, 10)
 [b1:B99].EntireRow.Hidden = False
     
 If Not Intersect(Target, [e3]) Is Nothing Then
    [b20].CurrentRegion.Offset(3, 1).ClearContents
    If Target.Value <> "All" Then
        With [B99].End(xlUp).Offset(1)
            .Value = "'" & Right("0" & [e3].Value, 2) & "/" & [G3].Value
            Set Crit = Sh.[AA1].Resize(2, 2)
            DoanhSo Crit
        End With
    Else
        Sh.[ac1].Value = "Th"
        For jJ = 1 To 12
            Sh.[ac2].Value = jJ
            With [B99].End(xlUp).Offset(1)
                .Value = "'" & Right("0" & Sh.[ac2].Value, 2) & "/" & [G3].Value
                Set Crit = Sh.[Ab1].Resize(2, 2)
                DoanhSo Crit
            End With
        Next jJ
    End If
    Range([b11].End(xlDown).Offset(2), [B98]).EntireRow.Hidden = True
 
 ElseIf Not Intersect(Target, [e6]) Is Nothing Then
    Set nRng = Sheets("DKien").Range("Biensoxe").Offset(1)
    GopMatHang_BienXe Target, Sh.[c6].Value, nRng
 ElseIf Not Intersect(Target, [e5]) Is Nothing Then
    Set nRng = Sheets("DKien").Range("Mathang").Offset(1)
    GopMatHang_BienXe Target, Sh.[F6].Value, nRng
 ElseIf Not Intersect(Target, [e4]) Is Nothing Then
1    [b20].CurrentRegion.Offset(3, 1).ClearContents
    Sh.[ac1].Value = Sh.[d6].Value
    If Target.Value <> "All" Then
        Sh.[ac2].Value = [G4].Value
        If [e3].Value <> "All" Then
            With [B99].End(xlUp).Offset(1)
                .Value = "'" & Right("0" & [e3].Value, 2) & "/" & [G3].Value
                .Offset(, 2).Value = [G4].Value
                .Offset(, 3).Value = [e4].Value
                Set Crit = Sh.[AA1].Resize(2, 3)
                DoanhSo Crit
            End With
        Else
            Sh.[ad1].Value = "Th"
            For jJ = 1 To 12
                Sh.[ad2].Value = jJ
                Set Crit = Sh.[Ab1].Resize(2, 3)
                With [B99].End(xlUp).Offset(1)
                    .Value = "'" & Right("0" & jJ, 2) & "/" & [G3].Value
                    .Offset(, 2).Value = [G4].Value
                    .Offset(, 3).Value = [e4].Value
                    DoanhSo Crit
                    
                End With
            Next jJ
        End If
    Else
        If [e3].Value <> "All" Then
            Set Crit = Sh.[AA1].Resize(2, 3)
            Nam = Right([C3].Value, 5) & " " & [e3].Value & "/" & [G3].Value
        Else
            Set Crit = Sh.[Ab1].Resize(2, 2)
            Nam = Right([b11].Value, 3) & " " & [G3].Value
        End If
        For Each Cls In Sheets("DKien").Range("MaDT").Offset(1)
            If Cls.Value = "All" Then Exit For
            Sh.[ac2].Value = Cls.Value
            With [B99].End(xlUp).Offset(1)
                .Value = Nam
                .Offset(, 2).Value = Cls.Value
                .Offset(, 3).Value = Sheets("DKien").Range("MaDT"). _
                    Find(Cls.Value, , xlFormulas, xlWhole).Offset(, -1).Value
                DoanhSo Crit
            End With
        Next Cls
    End If
2    Range([b11].End(xlDown).Offset(2), [B98]).EntireRow.Hidden = True
 End If
End Sub

PHP:
Sub GopMatHang_BienXe(Targ As Range, AC1Value As String, VungTen As Range)
 Dim jJ As Byte, Nam As String, Cls As Range, sRg As Range
    
    [b20].CurrentRegion.Offset(3, 1).ClearContents
    Sh.[ac1].Value = AC1Value
    If Targ.Value <> "All" Then
        Sh.[ac2].Value = Targ.Value
        If [e3].Value <> "All" Then
            With [B99].End(xlUp).Offset(1)
                .Value = "'" & Right("0" & [e3].Value, 2) & "/" & [G3].Value
                .Offset(, IIf(Targ.Row = 5, 4, 1)).Value = Targ.Value
                If Targ.Row = 6 Then
                    Set sRg = Sheets("DKien").Range("Biensoxe").Find(Targ.Value).Offset(, 1) '*'
                    .Offset(, 2).Value = sRg.Value
                    .Offset(, 3).Value = Sheets("DKien").Range("MaDT").Find(sRg.Value).Offset(, -1)
                End If
                Set Crit = Sh.[AA1].Resize(2, 3)
                DoanhSo Crit
            End With
        Else
            Sh.[ad1].Value = "Th"
            For jJ = 1 To 12
                Sh.[ad2].Value = jJ
                Set Crit = Sh.[Ab1].Resize(2, 3)
                With [B99].End(xlUp).Offset(1)
                    .Value = "'" & Right("0" & jJ, 2) & "/" & [G3].Value
                    .Offset(, IIf(Targ.Row = 6, 1, 4)).Value = Targ.Value
                    If Targ.Row = 6 Then
                        Set sRg = Sheets("DKien").Range("Biensoxe").Find(Targ.Value).Offset(, 1) '*'
                        .Offset(, 2).Value = sRg.Value
                        .Offset(, 3).Value = Sheets("DKien").Range("MaDT").Find(sRg.Value).Offset(, -1)
                    End If
                    DoanhSo Crit
                End With
            Next jJ
        End If
    Else
        If [e3].Value <> "All" Then
            Set Crit = Sh.[AA1].Resize(2, 3)
            Nam = Right([C3].Value, 5) & " " & [e3].Value & "/" & [G3].Value
        Else
            Set Crit = Sh.[Ab1].Resize(2, 2)
            Nam = Right([b11].Value, 3) & " " & [G3].Value
        End If
        For Each Cls In VungTen
            If Cls.Value = "All" Then Exit For
            Sh.[ac2].Value = Cls.Value
            With [B99].End(xlUp).Offset(1)
                .Value = Nam
                .Offset(, IIf(Targ.Row = 6, 1, 4)).Value = Cls.Value
                If Targ.Row = 6 Then
                    Set sRg = Sheets("DKien").Range("Biensoxe").Find(Cls.Value).Offset(, 1)
                    .Offset(, 2).Value = sRg.Value
                    .Offset(, 3).Value = Sheets("DKien").Range("MaDT").Find(sRg.Value).Offset(, -1)
                End If
                DoanhSo Crit
            End With
        Next Cls
    End If
    Range([b11].End(xlDown).Offset(2), [B98]).EntireRow.Hidden = True
End Sub
 
Mình đã chạy được rồi. Nhưng nếu dữ liệu mà nhiều thì e là nó chạy sẽ bị chậm. Nhưng đối với mình, như thế cũng là tốt lắm rồi, vì kết quả vượt xa những gì mình mong đợi. Một lần nữa, Chân thành cảm ơn các bạn đã giúp đỡ. Nếu các bạn đều đang ở Hà Nội, sẽ rất mong có ngày được hậu tạ.

Trân trọng.
 
Fải nói rằng CSDL của bạn ngay từ đầu chưa chuẩn lắm!

Mình chạy & OK. (1) Nhưng nếu dữ liệu mà nhiều thì e là nó chạy sẽ bị chậm. Nhưng với mình, vậy cũng là OK lắm rồi, vì kết quả vượt xa những gì mình mong đợi.
(2) Nếu các bạn đều đang ở Hà Nội, sẽ rất mong có ngày được hậu tạ.
Trân trọng.

(1) Trong file mình đã bỏ trường [TenDT] đi rồi, vì nó dư thừa trong 1 cấu trúc CSDL & bất cứ lúc nào ta cần, ta có thể tìm ra các [TenDT] này bằng các hàm tìm kiếm của excel hay bằng các cách khác 1 cách trơn tru;
Cũng như vậy, nếu bạn sẽ có bảng tra mã mặt hàng; Lúc đó thay vì TenHang ta sẽ thay bằng MaHang chỉ với độ dài là 2 kí tự thay vì trung bình 5.8 ký tự lúc này;
Bạn có thể biễu môi do tính quá chi li, nhưng vớ CSDL hàng vạn records sẽ là chuyện lớn đó bạn

Thêm cái nữa, mình đã bỏ trang tính 'DKien' đi rồi & chuyển hết danh sách các Names sang trang 'Loc';
Tất nhiên việc này không fải không có ích trong việc cải thiện tốc độ xài CSDL

Bạn thử chạy file đính kèm xem còn gì trục trặt ta sẽ sửa tiếp.

(2) Trước tiên cảm ơn bạn có nhã í; & nhứt định nghĩ ra cách thôi, 1 khi ta đã có tấm lòng!
Thân ái
 

File đính kèm

Lần chỉnh sửa cuối:
Cảm ơn bạn SA_DQ rất nhiều, để mình tải file về chạy thử lại xem thế nào, vì thực tế, trong file của mình còn có thêm 2 Sheet (chi tiết doanh thu, và chi tiết chi phí) nữa, tổng cộng có những sheet sau: Mã điều kiện (Dkien), ChitietDT, ChitietCP, Data, Loc. Chút nữa rảnh, Mình sẽ gửi file đầy đủ lên, lý do mình ko đưa file đầy đủ lên là do, từ trước đến giờ các sheet: ChitietDT, ChitietCP là do 2 bộ phận khác làm, giờ mình là người tổng hợp 2 phần đó để tổng hợp và lọc ra lãi lỗ chi tiết của từng sản phẩm, từng xe, hoặc từng đối tác,... Nên mình bắt buộc phải tách riêng các Sheet này ra với nhau (các sheet này đều bị khóa, và bộ phận nào liên quan đến sheet nào thì chỉ truy cập vào sheet đó để cập nhật dữ liệu, ko thể truy cập vào sheet khác được), nhưng vẫn chung vào 1 file, để cho tất cả các bộ phận đều truy cập vào file này để cập nhật dữ liệu Doanh thu và Chi phí hàng tháng, từ đó nó sẽ tự động cập nhật tổng hợp vào Sheet Data, sau đó sheet Loc sẽ lấy dữ liệu bên sheet Data để in ấn.

Đấy là toàn bộ quy trình xử lý dữ liệu của mình, do các sheet ChitietDT và ChitietCP và Sheet Data (dùng Vlookup để dò tìm bên 2 Sheet ChitetDT và ChitietCP) mình đã dùng các hàm thông dụng của ExCel để xử lý và làm được rồi nên mình ko đưa lên. Để lát nữa mình sẽ tải file đầy đủ lên để các bạn xem, nếu có gì mình chưa làm được, rất mong các bạn tiếp tục chỉ giáo cho mình.

Trân trọng cảm ơn các bạn rất nhiều.
 
Chờ file của bạn lâu thiệt luôn!

Đấy là toàn bộ quy trình xử lý dữ liệu của mình, (2) do các sheet ChitietDT và ChitietCP và Sheet Data (dùng Vlookup để dò tìm bên 2 Sheet ChitetDT và ChitietCP) mình đã dùng các hàm thông dụng của ExCel để xử lý và làm được rồi nên mình ko đưa lên.
(1) Để lát nữa mình sẽ tải file đầy đủ lên để các bạn xem, nếu có gì mình chưa làm được, rất mong các bạn tiếp tục chỉ giáo cho mình.

(1) Trong khi chờ file của bạn, mình đã kịp gộp chung 3 vô 1 macro, thay vì 2 vô 1 như trước đây (trong file đính kèm) & như vậy cũng giảm dung lượng kha khá,. . .

(2) Nếu file của bạn đồ sộ thì hàm VLOOKUP() cũng sẽ là giải fáp chưa thật sự tốt hơn fương cách khác
 

File đính kèm

Cảm ơn bạn SA_DQ rất nhiều, vì lý do bảo mật, và số liệu tương đối lớn, nên mình đang tách và thay đổi số liệu trước khi đưa lên đây, từ giờ đến chiều mình sẽ up, để nhờ các bạn chỉ giáo.

Mình vừa xem lại bản của bạn gửi, và tính thử, mình có chọn hết tất cả các điều kiện là All, nhưng kết quả tổng thì lại ko giống nhau (3 điều kiện là All tháng, năm, All đối tác, All mặt hàng thì đều ra tổng kết quả giống nhau, nhưng khi chọn All số xe thì kết quả tổng lại khác 2 kết quả trên) nên không biết có bị nhầm ở đâu ko, vì lẽ ra 4 điều kiện khi chọn All thì nó phải có tổng DT, CP, và Lãi lỗ bằng nhau. Nên mình đang kiểm tra lại.

Mong bạn giúp đỡ thêm. Cảm ơn bạn rất nhiều.

Chào bạn SA_DQ, mình đã có File dữ liệu đây rồi (Bạn tải file đính kèm nhé).

1. Sau khi chỉnh lại dữ liệu, mình mới phát hiện ra 1 điều là trong Sheet Data, có rất nhiều dòng trống thuộc các cột Doanh thu, Chi phí, Lãi - lỗ. Nên mình sẽ phải dùng code để xóa những dữ liệu trống (bằng 0) đó đi. Nếu bạn có thể thì giúp mình luôn với nhé.

2. Nhờ bạn giải thêm cho mình 1 điều kiện nữa trong Sheet Lọc, đó là điều kiện Nhóm xe (điều kiện này cũng lọc giống như các điều kiện khác ở trên), nếu chọn nhóm xe bất kỳ hoặc All thì sẽ lọc theo 1 nhóm bất kỳ hoặc liệt kê tất cả các nhóm theo Tháng, năm hoặc các điều kiện khác.

3. Do phải bổ sung thêm cột Nhóm xe, nên các điều kiện lọc trong Sheet Lọc, cũng như cột tách tháng, năm trong Sheet Data, đã bị vô hiệu hóa, mà mình thì đang cố gắng tìm hiểu cách viết VBA để tiện cho việc chỉnh sửa sau này, còn hiện tại mình chưa sửa lại được, nên rất mong bạn giải quyết giúp và đánh dấu những chỗ có thể thay đổi trong VBA để sau này mình tiện cho việc nghiên cứu học tập và chỉnh sửa.

Rất mong bạn SA_DQ cũng như các bạn giúp đỡ.

Xin cảm ơn rất nhiều.
 
Chỉnh sửa lần cuối bởi điều hành viên:
Bạn không thể thay đổi cấu trúc 2 trang tính 'Loc' & 'CSDL' tuỳ tiện được nữa!

Bạn lấy file gần đây nhứt của mình; trong đó mình đã bỏ cột 'TenDT' đi rồi; Tất nhiên cả quá trình lao lực cực nhọc mới chỉnh sửa được như vậy & đó mới là kết cấu đúng của 1 CSDL nhiều Records. (Nếu ít records thì ta khỏi cân nhắc chuyện này làm chi!)

Ngay trong bài đó mình có nói là với CSDL lớn thì xài hàm VLOOKUP() cũng đáng cân nhắc; Vậy mà bạn lại xài nó cũng như MONTH(), YEAR() để tìm ra tháng năm. Nhưng hàm về thời gian như MONTH() hay YEAR() luôn làm ẽxcel tính lại 1 cách nặng nề không đáng; Hơn nữa mình đã viết & để sẵn trong 'Loc' macro tự động tính & điền số liệu cần thiết vô 2 cột 'Th' & 'Nam' này 1 khi nó còn trống! Bạn coi công lao động của mình là vỏ hến hay sao vậy?

Mình sẽ giúp tiếp bạn sau khi bạn lấy file đó về, thêm 2 trang tính của bạn vô; Còn việc thêm trường 'Nhom' vô CSDL giờ chỉ có thể thêm sau trường 'Nam' mà thôi. (Nếu không thì bạn tự tiếp tục làm lấy đó nha!)

Giờ bạn tháo file của bạn xuống đi (tiết kiệm tài nguyên của bạn); tải file mình vế & thêm những thứ cần thiết & đưa lên lại; Lúc đó ta mới tiếp tục được.

(òn chuyện tải trọng xe đang lệnh nhau mà bạn nói đó là do: Trong bảng danh sách 'Biensoxe' có trùng lặp lại của 1 xe, mà lý ra fải là danh sách duy nhứt.
 
Không, ko, xin lỗi bạn nhé, vì mình chỉ là tải cái file mình đã làm trước đó để cho bạn xem dữ liệu mà...

Đúng là có phát sinh vấn đề là lọc theo nhóm xe, và có quá nhiều ô bằng 0 nữa, nên sẵn up file thì mình sửa thêm và cho lên luôn, để bạn dễ hình dung, chứ cái file cuối của bạn gửi, mình đã in code ra để nghiên cứu từ từ đây rồi...

Xin lỗi bạn nhé. Mình sẽ gỡ file kia xuống ngay. Xin lỗi bạn.

Bạn cho mình hỏi cách xóa file đã tải lên diễn đàn như thế nào nhỉ ? vì tìm mà ko thấy chỗ nào để gỡ file cả.
 
Lần chỉnh sửa cuối:
Mình sẽ gỡ file kia xuống ngay.
Bạn cho mình hỏi cách xóa file đã tải lên diễn đàn như thế nào nhỉ ? vì tìm mà ko thấy chỗ nào để gỡ file cả.

Bạn tìm trên diễn đàn với từ khoá "cách gỡ bỏ file đính kèm"
 
Web KT

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

Back
Top Bottom