Lọc dữ liệu trên 4 điều kiện. (1 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"
 
Chào bạn ChanhTQ@, Cảm ơn bạn, mình đã gỡ được file đó xuống rồi..

Chào bạn SA_DQ, Mình đã thêm 2 sheet ChitietDT, và ChitietCP vào file của bạn rồi (bạn xem file đính kèm nhé), nhưng nếu như bạn nói, ko dùng Vlookup và Hlookup + Offset vào để chuyển dữ liệu từ ngang sang dọc (từ hàng thành cột), để nó tự động cập nhật vào Sheet Data, sau đó mới dùng sheet Lọc thì mình cũng ko biết phải làm thế nào nữa, vì mình đã thay đổi số liệu ở 2 sheet ChitietDT và ChitietCP khác với các dữ liệu trước đây được đưa lên (để tăng thêm nhiều dữ liệu hơn). Nên nếu bạn có số Điện thoại hoặc Nick Chat thì mình sẽ xin được hỏi bạn trực tiếp thì sẽ dễ hơn. Rất mong bạn tiếp tục chỉ giáo.

Cảm ơn bạn rất nhiều.
 

File đính kèm

Lần chỉnh sửa cuối:
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.
(/ề nhóm xe mình đã thấy trong file đầu tiên, liệt kê lên đây xem bạn còn thấy thiếu đủ gì không:
MĐT | Xe thuộc nhóm
DL|29Y 0898, 30X 4050 - 30X 4053
HH|30T 1020 & 1021
HTP|30T 1053 & 54
MH|30T 7253, 30U 4133, 54T 7253-54, 54X 4133, 54X 8090
NM|30U 2030-32
TD|29U 6070-72
TH|30U 1020, 30U 2030, 54U 2030-31
TP|30T 1050-52
MT|?
MDL|?
MK|?
. . .| ?
Nếu danh sách này sai ít, bạn cập nhựt giúp nha; Nếu cứ fải căn cứ trong 2 trang tính mới đưa lên thì mình sẽ có cách giúp bạn; Mà hình như không cần đưa vô trang Data đâu thì fải,. . . hạ hồi fân giải

(+) Mệnh đề in đậm đó nghĩa là gì vậy; nên tỏ luôn để dễ định hướng bạn à & thân ái!
 
Cảm ơn bạn, như file mình vừa đưa lên là đủ. Nghĩa là bây giờ mình chỉ cần thêm vào Nhóm xe giống như bạn làm ở trên, sau đó dựa vào 2 Sheet ChitietDT và ChitietCP để chuyển đổi giá trị của các mặt hàng đang từ dòng thành cột, tương ứng với các xe trong Sheet ChitietDT này, sau đó tất cả các dữ liệu từ 2 sheet đó sẽ được cập nhật lên Sheet Data, ở Sheet Data này sẽ phải viết Code để xóa hết các ô có giá trị doanh thu hoặc chi phí hoặc lãi lỗ =0, trước khi được hiển thị ở Sheet Lọc.

Trong Sheet Lọc, sẽ tạo thêm 1 điều kiện lọc nữa là Theo Nhóm xe, và dưới bảng tổng hợp sẽ tạo làm thêm 1 cột Nhóm xe nữa, để lọc và tổng hợp theo nhóm xe, giống như các điều kiện tên đối tác hoặc tên mặt hàng.

Rất mong được các bạn hướng dẫn và giải quyết dùm mình. Cảm ơn các bạn rất nhiều.
 
Chắc chúng ta cần thảo luận sâu hơn để hiểu đúng vấn đề cái đã.

Hiện tại, nếu ta chọn tại [e3] là số 3 thì trên báo cáo hiễn thị dòng doanh thu 1,744 tỉ (số tròn)
Tiếp sau đó ta chọn [e4] là cti DL thì cũng hiện 1 dòng có doanh thu là 227 triệu;
Tại [e6] ta chọn 'All' thì sẽ hiễn thị 5 dòng thuộc nhóm DL, mà tổng doanh thu 5 dòng này là 277 triệu (số tròn)
Như vậy thiết tưởng chúng ta chỉ cần sắp sếp theo cột [MaDTac' này thì cũng có báo cáo số liệu của nhóm xe này rồi; (Tuy chưa cọng riêng từng nhóm)
Như vậy khi chọn nhóm là 'DL' thì bạn muốn trên báo cáo hiễn thị những gì:
1 dòng duy nhứt hay 5 dòng với các biển số xe & số liệu tương ứng của chúng;

& khi [E3]:= 'All' & Nhóm cũng chọn trị 'All' thì trên báo cáo sẽ là những dòng như thế nào!
Bạn thử mô tả xem sao; nếu không bạn đưa trang tính báo cáo này lên thì càng tốt.

Mong rằng bạn sẽ hiểu mình muốn gì qua bài viết này & chúc bạn vui!
 
Chào bạn SA_DQ. Trước tiên, mình cảm ơn bạn rất nhiều vì những gì bạn làm cho mình. Sau mình xin giải thích với bạn như sau:

1. Nếu chọn E3 = All, E4 = Cty DL, nếu chọn tiếp E5 = All, hay bất kỳ thì cũng ổn. Nhưng khi chọn E6 = All thì nó lại hiển thị tất cả các xe của các nhóm, thay vì lẽ ra chỉ hiển thị tất cả các xe của Cty DL thôi. Nghĩa là ở đây, điều kiện bắt buộc đầu tiên là phải chọn tháng, năm (E3), sau đó sẽ chọn tên đối tác (E4). Sau khi đã chọn được tên đối tác rồi, thì mặc nhiên 2 điều kiện còn lại là E5 và E6 sẽ phải thực hiện theo các điều kiện của E3 và E4 để hiển thị trên bảng doanh thu.

2. Như vậy, khi chọn nhóm là 'DL' thì bạn muốn trên báo cáo hiễn thị những gì: 1 dòng duy nhứt hay 5 dòng với các biển số xe & số liệu tương ứng của chúng --> Như hiện tại là được, nhưng có điều mới phát sinh là do mỗi đối tác hoặc Công ty mình lại có nhiều đội xe khác nhau (xe du lịch, xe container, mỗi đội chỉ có 1, 2 con xe), nên trong báo cáo cũng phải báo cáo riêng từng nhóm xe rồi sau đó mới tổng cộng thành 1 công ty. Vì vậy, sau khi có thêm điều kiện chọn nhóm xe nữa thì bảng báo cáo sẽ thực thi theo số 3 dưới đây.

3. Mục đích của việc chọn điều kiện nhóm xe ở đây là: Tên nhóm xe chính là các đội xe thuộc (của) tên đối tác. Ví dụ, đối tác là Cty DL, họ có 4 đội xe là xe du lịch, xe container,… vì vậy, sau khi chọn E3, và chọn E4, thì E5, E6, E7 (E7 là tên nhóm xe, chưa được khởi tạo) bắt buộc phải thực hiện theo 2 điều kiện của E3 và E4 nếu 1 trong các E5, E6, E7 hoặc cả 3 E này đều được chọn là bất kỳ hay All.

Vậy bạn tiếp tục xem lại giúp mình nhé. Cảm ơn bạn rất nhiều.
 
Như iêu cầu 3 của bạn thì fải viết lại hoàn toàn rồi!

Lúc đầu bạn iêu cầu là có thể chọn 1 trong 3 ([E4]-[E6]) khi [E3] không đổi
Giờ thì [E3] & [E4] cố định & chọn 1 trong ([E5]-[E7])
Vậy thì chờ đi bạn nha;
& trong khi chờ bạn xem tạm file này:
 

File đính kèm

Chào bạn HYen17. Như file của bạn thì cũng gần đúng ý mình rồi, chỉ có điều nhóm xe là 1, 2, 3, 4 chẳng hạn, chứ ko trùng tên với tên Cty.

Ý của mình là thế này. Ví dụ: Cty DL có 10 xe, chia ra làm 4 đội xe (1, 2, 3, 4), hoặc Cty TH có 5 xe, chia ra làm 2 đội (6,7), các cty kia cũng vậy (đội xe chính là nhóm xe do những xe này cùng chở 1 loại hàng, hoặc cùng tải trọng với nhau, nên được xếp vào 1 đội hoặc nhóm).

Vì vậy, khi chọn E3 là 3, chọn E4 là Cty DL thì ô E7 chỉ hiển thị các đội xe của Cty này để lựa chọn thôi (nghĩa là chỉ hiển thị 1, 2, 3, 4, All) chứ ko hiển thị cả (6,7) của Cty TH kia nữa. Như vậy, nếu chọn E7 là 1, hoặc 2, hoặc All thì bảng báo cáo sẽ hiển thị theo các yêu cầu tương ứng của ô E7, nếu chọn 1, thì hiển thị 1 nhóm, nếu chọn All thì hiển thị hết 1,2,3,4. ở cột nhóm xe (cột này chưa được khởi tạo).

Mong các bạn giúp đỡ. Trân trọng cảm ơn.
 
chỉ có điều nhóm xe là 1, 2, 3, 4 chẳng hạn, chứ ko trùng tên với tên Cty.

Bạn đã cho ai biết xe nào thuộc nhóm nào ở bài nào từ đầu đến giờ hay chưa vậy! Thật tốn thời gian với bạn quá đi mất! Cái đáng nói thì không nói ngay fức đi; Cứ vòng vo không đâu.

Bạn fải biết rằng " Viết cho người khác hiểu, chứ không fải viết những gì mình hiểu"
 
Thế mình mới nói là sau khi làm xong hết rồi, mình rất hài lòng với những gì các bạn làm rồi, và mình đã tiến hành nhập dữ liệu vào khá nhiều rồi thì nó mới phát sinh thêm điều kiện nhóm xe, chứ có phải ngay từ đầu mình đã được biết là phải báo cáo cả nhóm xe nữa đâu ? nếu mình biết phải như vậy thì mình đã đưa lên 1 thể rồi, chứ đâu phải ghi ra là phát sinh thêm nữa ?

Mong bạn cùng mọi người bỏ qua mà giúp cho mình nhé.
 
Thế là sau khi làm xong hết rồi & mình đã tiến hành nhập dữ liệu vào khá nhiều rồi thì nó mới phát sinh thêm điều kiện nhóm xe, chứ có phải ngay từ đầu mình đã được biết là phải báo cáo cả nhóm xe nữa đâu ? nếu mình biết phải như vậy thì mình đã đưa lên 1 thể rồi,

Vậy bạn mô tả chi li sự fát sinh này đi, đó là cái mà chúng tôi cần biết mà bạn chưa cho biết đó;
Như với đối tác DL có 5 xe thì xe nào của đối tác này thuộc nhóm I hay II, III hoặc IV

/-)ó là cái cần mô tả đó bạn & sự kiên nhẫn chỉ đến đây mà thôi!
 
Đây là file mà hôm qua mình đã gửi lên và đã gỡ xuống do thay đổi dữ liệu trong file, giờ mình tải lên lại, và có ghi ra một số nhóm xe đại diện (thực tế thì nó nhiều hơn, cả về xe lẫn nhóm xe) để các bạn xem qua cho dễ hình dung.

Mong các bạn giúp đỡ. Chân thành cảm ơn rất nhiều.
 

File đính kèm

Lần chỉnh sửa cuối:
Chắc chắn một điều rằng chúng ta fải quay về vạch xuất fát rồi đó!

Chúng ta sẽ có 3 trang tính 'ChiTietCF', 'ChiTietDT' & 'Data'; còn trang 'DKien' nên chuyển sang 'Data' hay 'Loc'

Bạn nêu nguồn gốc hình thành của ba trang tính này xem sao.

Từ đó mới khẳng định cấu trúc của 'Data'; hiện tại nó đang lôi thôi đến nổi là không ai có thể đủ khả năng giúp bạn thêm nữa, sau những gì mà bạn đã nhận được mấy ngày qua.

Hay là bạn tạo topic mới đi; topic này như là kỹ niệm đẹp của dĩ vãng vậy & STOP HERE!
 
Có vẻ vấn đề đã rất hóc búa. Nói thật là nếu chỉ như ban đầu mình đưa ra, thì đến bài chưa phát sinh lọc nhóm là mình đã rất hài lòng rồi, nhưng khi có phát sinh lọc nhóm thì mình ko nghĩ là nó lại rắc rối và khó khăn đến như vậy. Mình sẽ nêu lại quy trình để ra báo cáo này như sau:

1. Sheet điều kiện (Dkien): Như các bạn đã làm, và bây giờ các bạn đã chuyển nó sang Sheet Lọc --> nói chung là ko ảnh hưởng gì vì kết quả như thế là ổn. Nhưng sau khi phát sinh điều kiện lọc thêm nhóm xe, thì mình chỉ là gán thêm 1 cột nữa (cột nhóm xe) vào danh mục xe thôi để từ đó các sheet khác cũng có thêm cột nhóm xe này để phục vụ cho Sheet Lọc. Nên xét cho cùng thì các điều kiện đã được chuyển hết sang sheet Loc rồi, thì có thêm 1 cột này nữa thì cũng không ảnh hưởng gì.

2. Sheet ChitietCP: Là nơi cập nhật tất cả cách khoản chi phí cho 1 xe trong 1 tháng.

3. Sheet ChitietDT: Là nơi cập nhật tất cả các khoản doanh thu của 1 xe trong một tháng (vì 1 tháng có nhiều các mặt hàng khác nhau nên phải sắp xếp biển số xe theo cột, và các mặt hàng theo dòng).

4. Sheet Data : Là sheet tổng hợp (gộp 2 sheet 2, 3 ở trên lại), coi đây là 1 sheet trung gian trước khi phục vụ cho Sheet Lọc. Do sau khi tổng hợp, có rất nhiều ô doanh thu và chi phí, lãi lỗ = 0, nên phải viết lệnh để xóa các ô bằng 0 đó đi cho nhẹ dữ liệu. Nếu các bạn có thể lọc được mà ko cần Sheet data này thì càng tốt.

5. Sheet Lọc: Là trang in ra các loại báo cáo cuối cùng. Dữ liệu được lấy từ sheet Data.

Có thể lúc đầu, mình ko lường trước được sự phức tạp này, nên đã ko nêu ra được hết các vấn đề, nên các bạn khó hình dung và phải mất rất nhiều công sức để giúp mình. Bây giờ, mình sẽ làm lại 1 file mới (vui lòng tải file đính kèm) để các bạn xem lại và làm giúp mình cho đỡ rối mắt.

Nói chung, nếu vẫn làm trên file cuối cùng của bạn SA_DQ được là tốt nhất, vì chỉ còn 2 vấn đề:

1. Nếu chọn E6 (theo số xe) thì bảng báo cáo chỉ hiện thị xe của Tên đối tác (đã được chọn ở E4).

2. Thêm vào đó 1 điều kiện theo nhóm (vì dụ : nếu E4 được chọn là Cty DL thì E7 chỉ còn các nhóm xe của Cty DL và All) nữa là xong.

Rất mong nhận được sự giúp đỡ của các bạn. Chân thành cảm ơn
 

File đính kèm

Lần chỉnh sửa cuối:

File đính kèm

Chỉnh sửa lần cuối bởi điều hành viên:
Cảm ơn bạn SA_DQ rất nhiều, cột doanh thu đúng là rất chuẩn bạn ạ. Nhưng có 1 điều mình chưa hiểu là tại sao sau khi mình đổi số liệu ở sheet ChitietCP (cột S, tổng cộng chi phí), hiện tại của bạn đang bắt đầu từ 9.100 giảm xuống đến 5.500, thì mình thay đổi lại cho tất cả các xe đều có tổng chi phí (cột S) là 10.000 (Tổng chi phí cho 37 xe này = 370.000 - tính cả 1 xe của tháng 12/2010). Sau đó chọn sheet Bcao để lọc lại, nhưng nó vẫn chỉ hiểu và lọc số của bạn đã nhập (9.100 --> 5.500) chứ ko lấy ra số của mình mới cập nhật). Mình cũng vừa kiểm tra lại Sheet ChitietDT, thay đổi lại các số liệu, nhưng vẫn ko thấy được cập nhật sang sheet CSDL và Bcao.

Vậy bạn xem lại 1 chút xem thế nào dùm mình nhé. Cảm ơn bạn rất nhiều.

--> À, đã được rồi bạn ạ. Sau khi cập nhật lại số liệu xong, thì phải chạy ô E4 trước mới được, nếu ko chạy ô này mà đã chạy các ô khác thì nó sẽ ko cập nhật số liệu mới.

XIN CHÂN THÀNH CẢM ƠN CÁC BẠN ĐÃ NHIỆT TÌNH GIÚP ĐỠ TRONG SUỐT THỜI GIAN QUA. HY VỌNG SẼ SỚM CÓ CƠ HỘI ĐỂ ĐƯỢC ĐỀN ĐÁP CÔNG ƠN CỦA CÁC BẠN. QUA ĐÂY, RẤT MONG CÁC BẠN CHO MÌNH XIN ĐỊA CHỈ (nếu ko tiện gửi ở đây, các bạn gửi vào tin nhắn cho mình) ĐỂ MÌNH SỚM CÓ CƠ HỘI HẬU TẠ CÁC BẠN.

MỘT LẦN NỮA, XIN CẢM ƠN CÁC BẠN RẤT NHIỀU. CẢM ƠN GIAIPHAPEXCEL.COM.

 
Lần chỉnh sửa cuối:

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

Back
Top Bottom