Trao đổi về cấu trúc CSDL

Liên hệ QC

SA_DQ

/(hông là gì!
Thành viên danh dự
Tham gia
8/6/06
Bài viết
14,326
Được thích
22,370
Nghề nghiệp
Nuôi ba ba & trùn quế
Trước tiên mình có vài í kiến mong bạn cho biết í kiến:

Có 1 số xe trong cả tháng không có chi fí vậy số này có doanh thu hay không?
Mà nếu không có chi fí & doanh số thì ta đâu cần chép từ 2 trang 'ChiTiet ' sang 'Data' phải không?
Như bài trước bạn có nói: 2 trang 'ChiTiet ' này do các đơn vị khác bô3 sung, họ bổ sung hàng ngày hay theo đợt cách quảng?
& liên hệ với chuyện này, thì báo cáo cần thực hiện hàng ngày hay theo đợt tuần hoàn?
Chẳng qua mình thấy không có trị ngày trong dữ liệu mà chỉ có tháng & năm nên hỏi rõ thêm.

(http://www.giaiphapexcel.com/forum/showthread.php?48816-L%E1%BB%8Dc-d%E1%BB%AF-li%E1%BB%87u-tr%C3%AAn-4-%C4%91i%E1%BB%81u-ki%E1%BB%87n./page4FirefoxHTML\Shell\Open\Command)

Thấy rằng cần giúp bạn xây dựng trang 'Data' chuẩn mới mong cùng nhau đi tiếp được;

Những việc cần khắc fục trong 'Data' là:
Không dòng dữ liệu nào được chứa số liệu rỗng hay bằng không ở 3 cột từ doanh thu trở đi; Càng không thể chứa ô lỗi công thức trong cả record.

Nếu cần, mình sẽ viết macro để từ 2 trang chi tiết chép sang 'Data' những số liệu chuẩn cho bạn.

Chờ tin từ bạn!
 
Chỉnh sửa lần cuối bởi điều hành viên:
Trước tiên, mình rất cảm ơn bạn, vì đã quyết tâm giúp đỡ mình đến cùng. Mình xin trả lời bạn như sau:

1. Có 1 số xe trong cả tháng không có chi fí vậy số này có doanh thu hay không? ---> Xe nào cũng có doanh thu trong tháng, doanh thu là ngày bất kỳ được ghi trên hóa đơn khi khách hàng chuyển sang cho Cty mình. Khi cập nhật doanh thu thì đều cập nhật theo ngày trên hóa đơn vào ChitietDT. Do mình chỉ làm công tác thống kê nên Mình chỉ lấy trị theo tháng chứ ko lấy theo ngày. Trên bảng Data, bạn lọc ra tháng, năm như vậy là chính xác rồi, vì cho dù mình nhập ngày vào thì cũng chỉ lấy ra tháng thôi.

2. Nếu không có chi fí & doanh số thì ta đâu cần chép từ 2 trang 'ChiTiet ' sang 'Data' phải không? --> Một xe, trong tháng có rất nhiều hóa đơn doanh thu cho các mặt hàng khác nhau (và có nhiều ngày ghi hóa đơn khác nhau), nhưng chi phí thì lại chỉ thanh toán 1 tháng 1 lần. Không có xe nào mà ko có doanh thu hoặc ko có chi phí cả. Như vậy, để tính chi phí cho 1 xe thì phải cộng tất cả các hóa đơn doanh thu đấy lại và trừ đi tổng chi phí lái xe thanh toán trong tháng. Thỉnh thoảng có hàng lẻ thì mới tính doanh thu và chi phí theo chuyến hoặc theo mặt hàng thôi. Nhưng việc đó đã được tính ở các bảng bên ngoài rồi, nên trong file này chỉ là cập nhật tổng hợp các doanh thu và chi phí đó để thống kê thôi. Vì vậy, nếu ko chép hết sang Sheet Data thì chỉ có cách lọc trực tiếp vào Sheet Lọc thôi, việc này bạn có thể tùy biến, nếu thấy cách nào hợp lý theo cách sắp xếp của bạn thì bạn cứ làm giúp mình.

3. Như bài trước bạn có nói: 2 trang 'ChiTiet ' này do các đơn vị khác bô3 sung, họ bổ sung hàng ngày hay theo đợt cách quảng? --> Bổ sung khi có hóa đơn của khách hàng chuyển sang, không theo lịch cố định. Mỗi 1 xe, trong 1 tháng, chạy nhiều chuyến và chạy nhiều mặt hàng khác nhau, và như vậy sẽ có hóa đơn doanh thu từng chuyến hoặc từng mặt hàng khác nhau, việc này đã được các bộ phận nhập vào 1 bảng riêng hàng ngày, sau đó mới tổng cộng doanh thu của xe đó theo từng mặt hàng, rồi từ đó mới tổng hợp lên sheet ChitietDT này, Sheet ChitietCP cũng vậy.

4. & liên hệ với chuyện này, thì báo cáo cần thực hiện hàng ngày hay theo đợt tuần hoàn? --> Báo cáo theo từng tháng, năm. Mới đầu mình cũng định chọn báo cáo theo từng tháng, hoặc từ ngày.... đến ngày.... nhưng như hiện giờ bạn đang làm là ổn rồi, nên ko phải sửa nữa.

Vậy, nếu bạn có phải làm lại từ đầu thì cũng rất mong bạn thông cảm và giúp đỡ cho mình. Chỗ nào bạn chưa hiểu, bạn cứ hỏi lại mình, còn chỗ nào bạn thấy theo ý bạn phải như vậy mới hợp lý thì bạn cứ thế làm thôi.

Sau 1 thời gian ngâm cứu về các trang chi tiết & 'Data'. Thấy rằng cần giúp bạn xây dựng trang 'Data' chuẩn mới mong cùng nhau đi tiếp được;

Những việc cần khắc fục trong 'Data' là:
Không dòng dữ liệu nào được chứa số liệu rỗng hay bằng không ở 3 cột từ doanh thu trở đi; Càng không thể chứa ô lỗi công thức trong cả record.

Nếu cần, mình sẽ viết macro để từ 2 trang chi tiết chép sang 'Data' những số liệu chuẩn cho bạn.


Do trình độ Excel của mình có hạn về VBA nên mình chỉ dùng các công thức sẵn có của Excel để làm ra Sheet Data như vậy, nên nếu bạn sửa được theo ý của bạn thì mình vô cùng biết ơn với bạn.

Mong tin bạn và cảm ơn bạn rất nhiều.
 
Lần chỉnh sửa cuối:
Đây là cách macro chuyển số liệu tháng hay năm sang CSDL từ 2 trang chi tiết

Bạn chọn tháng hay năm trong 'Loc';
/(ết quả hiện ở 'CSDL

Bạn cho chạy các tháng có số liệu & kiểm xem còn vấn đề gì không?!
 
Lần chỉnh sửa cuối:
Cảm ơn bạn rất nhiều. Quá ổn bạn ạ. Bạn tiếp tục giúp mình nhé, cảm ơn bạn rất nhiều.
 
Quá ổn bạn ạ. Bạn tiếp tục giúp mình nhé,
Bạn chọn 'All' ở nút 'Loc![E4]' chưa vậy? Máy bạn tốn bao nhiêu gy? (Số liệu ghi ở cột 'S' đó.)

Khi chọn 1 tháng nào đó hay 'All' thì trên trang tính 'Loc' này bạn muốn xuât hiện số liệu báo cáo sẽ như thế nào vậy?

Mà trường tháng/Năm trong 'CSDL' nên tách ngay làm 2, nhỉ: để tiện khi xài DSUM() í mà!

Chờ tin bạn!
 
Chỉnh sửa lần cuối bởi điều hành viên:
1. Nếu chọn All thì máy mình mất 15,48 giây, còn nếu chọn 1 tháng bất kỳ thì mất từ 6 - 6,5 giây. nếu chọn tháng nào ít (ví dụ tháng 5 thì chỉ mất 1,46 giây thôi. À, mấy lần chạy đầu tiên sau khi tải file về và mở lên để chạy lọc thì các tháng lẻ đều mất hơn 30 giây, từ 34,09 đến 40,76 giây)

2. Khi chọn 1 tháng nào đó hay 'All' thì trên trang tính 'Loc' này bạn muốn xuât hiện số liệu báo cáo sẽ như thế nào vậy? --> Nếu chỉ chọn tháng, năm thôi, thì dữ liệu xuất hiện trên báo cáo như thế này là đúng và đầy đủ rồi bạn ạ.

Cảm ơn bạn rất nhiều.
 
Lần chỉnh sửa cuối:
Trong topic của bạn trước đây

(|) Nếu chọn 1 tháng cụ thể nào đó thì sẽ xuất hiện 1 dòng tổng doanh thu cũng như chi fí & lời lỗ của tháng đó & nếu chọn 'All' thì tương ứng 12 dòng xuất hiện
Vậy mà giờ bê nguyên xi kết quả vừa xong đưa vô báo cáo thì e không 'đủ' chỗ đó bạn.
Chờ bạn khẳng định việc này!
 
(|) Nếu chọn 1 tháng cụ thể nào đó thì sẽ xuất hiện 1 dòng tổng doanh thu cũng như chi fí & lời lỗ của tháng đó & nếu chọn 'All' thì tương ứng 12 dòng xuất hiện ---> À, đúng rồi bạn. Nếu chọn 1 tháng cụ thể mà ko chọn thêm các điều kiện khác như tên đối tác, tên mặt hàng,... thì chỉ xuất hiện 1 dòng tổng doanh thu, chi phí, lời - lãi của tất cả các đối tác, các mặt hàng, các xe trong tháng đó thôi, nếu chọn là All thì tương ứng 12 dòng xuất hiện, từ tháng 1 đến tháng 12 (giống như lúc đầu mình yêu cầu). Lúc chiều bạn hỏi mình chưa hiểu ý của bạn, nên lại nghĩ là hiển thị về kết quả của dữ liệu có đúng hay chưa?.

Có gì chưa rõ bạn hỏi lại mình nhé. Cảm ơn bạn rất nhiều.
 
Lần chỉnh sửa cuối:
Bạn xem trong file đính kèm nha

Xem cả cấu trúc mới của 'CSDL'; còn 'Loc' đã được đổi thành tên BCao cho hao hao với người ta

Nếu bạn OK mình sẽ tháo file trước xuống để đỡ hào tài nguyên.
 
Lần chỉnh sửa cuối:
Cảm ơn bạn rất nhiều, cấu trúc dữ liệu như thế là ổn rồi đấy bạn ạ. Nhưng khi mình chọn All hoặc chọn tháng = 1, hoặc = 2, thì cột chi phí lại =0, trong khi 2 tháng này đều có chi phí là 5000. vậy bạn xem lại giúp mình nhé.

Trân trọng.
 
Nhưng khi mình chọn All hoặc chọn tháng = 1, hoặc = 2, thì cột chi phí lại =0, trong khi 2 tháng này đều có chi phí là 5000. vậy bạn xem lại giúp mình nhé.

Mình tìm ra nguyên nhân rồi: là do 2 ngày/tháng/năm của 2 số xe đó lệch nhau;
Khi mình sửa lại là cùng 2/21/2011 thì OK! (Nguồn gốc lỗi này là do lúc mình giả lập thêm 3 records của 3 tháng từ 12/2010 chưa nhứt quán giữa 2 trang tính ChiTiet;

Dưới đây là hoàn chỉnh với 2 nút [E4:E5] rồi đó; Bạn thao tác thử;

Nếu có vấn đề gì chưa suông thì ghi lên, mình sửa tiếp;
Nếu không thì bạn trình bày iêu cầu nút tiếp theo.
 

File đính kèm

  • gpeGiaiThuat.rar
    49 KB · Đọc: 25
Cảm ơn bạn rất nhiều. Sau khi thao tác thử, mình thấy các vấn đề sau:

1. Về tổng cộng số liệu doanh thu, chi phí, lãi - lỗ : Nếu mình chọn tháng, năm = All, rồi chọn tên đối tác là All thì số liệu tổng cộng ở dòng doanh thu đang bị lệch. Nghĩa là tháng, năm = All, thì có tổng DT năm 2011 (từ tháng 1 đến tháng 5) = 7.560.000, nhưng nếu chọn tên đối tác = All, thì lại có tổng DT = 8.193.000, lệch 630.000. Lẽ ra 7.560.000 mới là đúng. Vì vậy mà các chi phí và lãi - lỗ cũng bị hiển thị sai theo.

2. Về hiển thị số liệu trên bảng báo cáo: Cách hiển thị lần này khác với hiển thị số liệu ở các lần đầu làm ở các file cũ trước đây, và cách này cũng rất đúng với ý mình, vì nó rất chi tiết ra từng tháng, cty nào có doanh thu bao nhiêu... có điều là nếu muốn biết được tất cả các cty làm từ tháng 1 đến tháng hiện tại được DT bao nhiêu để nhìn vào đó so sánh với nhau thì ta lại phải cộng tay lại. Nên mình đang phân vân giữa cách hiển thị lần này và cách hiển thị số liệu trước đây có dạng như sau:

[FONT=&quot]BẢNG DOANH THU - CHI PHÍ VẬN TẢI[/FONT]
[FONT=&quot] Đơn vị tính: VND [/FONT]
[FONT=&quot]Stt-------Tháng,năm-------Số xe-----Mã đối tác-------Tên đối tác---------Tên mặt hàng---------Doanh thu-------Chi phí----------------Lãi - Lỗ[/FONT]
[FONT=&quot]01[/FONT][FONT=&quot]-------năm 2011[/FONT][FONT=&quot]---------------------------DL------------Công ty DL------------------------------------237.233.000-----195.419.600------------41.813.400
02[/FONT]
----[FONT=&quot]năm 2011---------------------------[/FONT][FONT=&quot]TH------------[/FONT][FONT=&quot]Công ty TH-----------------------------------[/FONT][FONT=&quot]328.951.000------[/FONT][FONT=&quot]282.286.000------------[/FONT][FONT=&quot]46.665.000[/FONT][FONT=&quot]
03-------[/FONT]
[FONT=&quot]năm 2011--------------------------[/FONT][FONT=&quot]NM-----------[/FONT][FONT=&quot]Công ty NM-----------------------------------[/FONT][FONT=&quot]42.881.000--------[/FONT][FONT=&quot]531.322.337------------[/FONT][FONT=&quot]111.558.663
[/FONT]
[FONT=&quot]04-------[/FONT][FONT=&quot]năm 2011--------------------------[/FONT][FONT=&quot]TD------------[/FONT][FONT=&quot]Công ty TD------------------------------------[/FONT][FONT=&quot]574.772.000------[/FONT][FONT=&quot]459.437.000------------[/FONT][FONT=&quot]115.335.000[/FONT][FONT=&quot]
05-------[/FONT]
[FONT=&quot]năm 2011--------------------------[/FONT][FONT=&quot]HH-----------[/FONT][FONT=&quot]Công ty HH------------------------------------[/FONT][FONT=&quot]215.978.000-------[/FONT][FONT=&quot]171.552.400-----------[/FONT][FONT=&quot]44.425.600
[/FONT]
[FONT=&quot]06-------[/FONT][FONT=&quot]năm 2011--------------------------[/FONT][FONT=&quot]TP------------[/FONT][FONT=&quot]Công ty TP------------------------------------[/FONT][FONT=&quot]41.818.600---------[/FONT][FONT=&quot]27.979.300-------------[/FONT][FONT=&quot]13.839.300[/FONT][FONT=&quot]
07-------[/FONT]
[FONT=&quot]năm 2011---------------------------[/FONT][FONT=&quot]HTP---------[/FONT][FONT=&quot]Công ty HTP---------------------------------[/FONT][FONT=&quot]275.213.000--------[/FONT][FONT=&quot]242.824.800------------[/FONT][FONT=&quot]32.388.200[/FONT]
[FONT=&quot]Tổng:[/FONT]------------------------------------------------------------[FONT=&quot]2.683.024.600-----[/FONT][FONT=&quot]2.234.372.437------[/FONT][FONT=&quot]448.652.163
[/FONT]
[FONT=&quot]
Cách hiển thị theo bảng trên (trước đây đã làm) thì lại cho biết tổng cộng DT, CP, LL của từng tên cty 1 từ đầu năm cho đến thời điểm hiện tại thống kê, và cuối cùng là tổng cộng của cả giai đoạn cho tất cả các đối tác. Như vậy, cách hiển thị này cũng rất hay, và không phải mất công cộng lại nhiều lần.

Nên nếu có thể, thì xin bạn làm thêm 1 chỗ này nữa, nghĩa là sẽ có 1 điều kiện phụ ở ô F5, nếu ô này được gõ vào chữ X thì số liệu sẽ được hiển thị theo dạng bảng trên, còn nếu ko có chữ X thì vẫn hiễn thị theo như file hiện tại bạn gửi. Bạn thấy thế nào ?

Bạn xem xét lại giúp mình nhé. Cảm ơn bạn rất nhiều.
[/FONT]
 
1.Nếu mình chọn tháng, năm = All, rồi chọn tên đối tác là All thì số liệu tổng cộng ở dòng doanh thu đang bị lệch.
Nhưng nếu chọn tên đối tác = All, thì lại có tổng DT = 8.193.000, lệch 630.000. Lẽ ra 7.560.000 mới là đúng. Vì vậy mà các chi phí và lãi - lỗ cũng bị hiển thị sai theo.
Trong trang CSDL tháng 5 không có đối tác TD vận chuyển, mà chỉ có TDE vận chuyển, nhưng hàm DSUM() trong trường hợp này nó tính gấp đôi;

Trên 1 ô trang tính mình thử hàm =DSUM(B1:I217,G1,AA1:AB2) với trị trong [AB2] là TD cũng như TDE đều ra kết gủa giống nhau & = 630.000; Chắc chổ này có liên quan đến kí tự đại diện;
Hay bạn đổi mã TDE thành TED thử xem sao, trong các trang ChiTiet í! & trên trang 'CSDL nữa;
Mình làm cũng được nhưng để bạn làm & tự rút ra kết luận thì hay hơn.

Chúc vui!
 
Đúng rồi bạn ạ, mình đã đổi lại chỗ mã đối tác thành TED (Cty TDE - tên cty thì ko thay đổi) rồi, và kết quả ra chính xác rồi. Cảm ơn bạn rất nhiều.
 
Muốn là được, nhưng bạn cùng tham gia nha

2. Về hiển thị số liệu trên bảng báo cáo: Cách hiển thị lần này khác với hiển thị số liệu ở các lần đầu làm ở các file cũ trước đây, và cách này cũng rất đúng với ý mình, vì nó rất chi tiết ra từng tháng, cty nào có doanh thu bao nhiêu...
có điều là nếu muốn biết được tất cả các cty làm từ tháng 1 đến tháng hiện tại được DT bao nhiêu để nhìn vào đó so sánh với nhau thì ta lại phải cộng tay lại. Nên mình đang phân vân giữa cách hiển thị lần này và cách hiển thị số liệu trước đây

[FONT=&quot] Nên nếu có thể, thì xin bạn làm thêm 1 chỗ này nữa, nghĩa là sẽ có 1 điều kiện phụ ở ô F5, nếu ô này được gõ vào chữ X thì số liệu sẽ được hiển thị theo dạng bảng trên, còn nếu ko có chữ X thì vẫn hiễn thị theo như file hiện tại bạn gửi. Bạn thấy thế nào ?

[/FONT]
Tại [F5] của 'BCao' bạn áp đặt Validation gồm 2 lựa chọn
'CTi' (Để thống kê theo công ti)
'Tháng' ( Theo Tháng)

Sau đó là copy toàn bộ cái ni chép đè hoàn toàn lên cái cũ là OK tấp lự

(húc thành công!

PHP:
Option Explicit
Dim Timer_ As Double
Private Sub Worksheet_Change(ByVal Target As Range)
 Dim WF, CF As Worksheet, DT As Worksheet, Cls As Range, Rng As Range, sRng As Range
 Dim cRg As Range, Clls As Range, mRg As Range, Crit As Range
 Dim MyAdd As String:                                               Dim Col As Byte
 Dim ChFi As Double, tDT As Double, tCF As Double, tLL As Double

 Set WF = Application.WorksheetFunction:                            Timer_ = Timer
 If Not Intersect(Target, [e4]) Is Nothing Then
    Set DT = ThisWorkbook.Worksheets("ChiTietDT")
    Set CF = ThisWorkbook.Worksheets("ChiTietCP")
    
    Set Rng = DT.Range(DT.[f9], DT.[f65500].End(xlUp))
    Col = DT.[iu8].End(xlToLeft).Column
    Sheets("CSDL").[b1].CurrentRegion.Offset(1, 1).ClearContents
    For Each Cls In Rng
        If ([e4].Value = "All" And Year(Cls.Offset(, -2)) = [G4].Value) Or _
            ([e4].Value <> "All" And Month(Cls.Offset(, -2)) = [e4].Value _
                And Year(Cls.Offset(, -2)) = [G4].Value) Then   '*'
            If WF.Sum(Cls.Offset(, 1).Resize(, Col)) > 0 Then
                Set cRg = CF.Range(CF.[d8], CF.[d65500].End(xlUp))
                Set sRng = cRg.Find(Cls.Value, , xlFormulas, xlWhole)
                If Not sRng Is Nothing Then
                    MyAdd = sRng.Address
                    Do
                        If sRng.Offset(, -2).Value = Cls.Offset(, -2).Value Then
                            ChFi = CF.Cells(sRng.Row, "S"):         Exit Do
                        End If
                        Set sRng = cRg.FindNext(sRng)
                    Loop While Not sRng Is Nothing And sRng.Address <> MyAdd
                End If
                Set mRg = Cls.Offset(, 1).Resize(, Col).SpecialCells(xlCellTypeConstants, 1)
                For Each Clls In mRg
                    If Clls.Value > 0 Then
                        With Sheets("CSDL").[B65500].End(xlUp).Offset(1)
                            .Value = Month(Cls.Offset(, -2).Value)
'                            .Offset(, 1) = Year(Cls.Offset(, -2).Value)'
                            .Offset(, 1) = Cls.Value
                            .Offset(, 2) = Cls.Offset(, -1).Value
                            .Offset(, 3) = Sheets("CSDL").Range("SoXe").Find(Cls.Value).Offset(, 1)
                            .Offset(, 4) = DT.Cells(8, Clls.Column).Value
                            .Offset(, 5) = Clls.Value
                            .Offset(, 7) = Clls.Value - ChFi
                            If ChFi > 0 Then
                                .Offset(, 6) = ChFi:         ChFi = 0
                            End If
                        End With
                    End If
                Next Clls
            End If
        End If
    Next Cls
    Set CF = ThisWorkbook.Sheets("CSDL")
    [b13].CurrentRegion.EntireRow.Hidden = False
    [b13].CurrentRegion.Offset(1, 1).ClearContents
    ChFi = CF.[B65500].End(xlUp).Row
    
    If [e4].Value <> "All" Then
        With [B200].End(xlUp).Offset(1)
            .Value = "'" & Right("0" & [e4].Value, 2) & "/" & [G4].Value
            .Offset(, 6).Value = WF.Sum(CF.[g1].Resize(ChFi))
            .Offset(, 7).Value = WF.Sum(CF.[h1].Resize(ChFi))
            .Offset(, 8).Value = WF.Sum(CF.[i1].Resize(ChFi))
        End With
    Else
        For Col = 1 To 12
            tDT = WF.SumIf(CF.[b1].Resize(ChFi), Col, CF.[g1])
            tCF = WF.SumIf(CF.[b1].Resize(ChFi), Col, CF.[h1])
            tLL = WF.SumIf(CF.[b1].Resize(ChFi), Col, CF.[i1])
            If tDT > 0 Or tCF > 0 Or tLL > 0 Then
                With [B99].End(xlUp).Offset(1)
                    .Value = "'" & Right("0" & Col, 2) & "/" & [G4].Value
                    .Offset(, 6).Value = tDT
                    .Offset(, 7).Value = tCF
                    .Offset(, 8).Value = tLL
                End With
            End If
        Next Col
    End If
    Range([b13].End(xlDown).Offset(2), [B200]).EntireRow.Hidden = True
 ElseIf Not Intersect(Target, [e5]) Is Nothing Then
    Set CF = ThisWorkbook.Sheets("CSDL")
    [b13].CurrentRegion.EntireRow.Hidden = False
    [b13].CurrentRegion.Offset(1, 1).ClearContents
    ChFi = CF.[B65500].End(xlUp).Row
    If [e5].Value <> "All" Then
        If [e4].Value <> "All" Then     'One Month'
            With [B200].End(xlUp).Offset(1)
                .Value = "'" & Right("0" & [e4].Value, 2) & "/" & [G4].Value
                .Offset(, 3).Value = [g5].Value
                .Offset(, 4).Value = [e5].Value
                .Offset(, 6).Value = WF.SumIf(CF.[E1].Resize(ChFi), [g5], CF.[g1])
                .Offset(, 7).Value = WF.SumIf(CF.[E1].Resize(ChFi), [g5], CF.[h1])
                .Offset(, 8).Value = WF.SumIf(CF.[E1].Resize(ChFi), [g5], CF.[i1])
            End With
        Else                            'All Month'
            CF.[aB1].Value = CF.[E1].Value
            CF.[Ab2].Value = [g5].Value:                    CF.[aa1] = CF.[b1]
            Set Rng = CF.[b2].CurrentRegion
            Set Crit = CF.[aa1].Resize(2, 2)
            
            For Col = 1 To 12
                CF.[AA2].Value = Col
                tDT = WF.DSum(Rng, CF.[g1], Crit)
                tCF = WF.DSum(Rng, CF.[h1], Crit)
                tLL = WF.DSum(Rng, CF.[i1], Crit)
                If tDT > 0 Or tCF > 0 Or tLL > 0 Then
                    With [B200].End(xlUp).Offset(1)
                        .Value = "'" & Right("0" & Col, 2) & "/" & [G4].Value
                        .Offset(, 3).Value = [g5].Value
                        .Offset(, 4).Value = [e5].Value
                        .Offset(, 6).Value = tDT
                        .Offset(, 7).Value = tCF
                        .Offset(, 8).Value = tLL
                    End With
                End If
            Next Col
        End If
    Else
        CF.[aB1].Value = CF.[E1].Value:                    CF.[aa1] = CF.[b1]
        Set Rng = CF.[b2].CurrentRegion
        If Left([F5], 1) = "T" Then
            Set Crit = CF.[aa1].Resize(2, 2)
            For Col = 1 To 12
                CF.[AA2].Value = Col
                For Each Cls In CF.Range("MaDT")
                    If Cls.Value = "All" Then Exit For
                    CF.[Ab2].Value = Cls
                    tDT = WF.DSum(Rng, CF.[g1], Crit)
                    tCF = WF.DSum(Rng, CF.[h1], Crit)
                    tLL = WF.DSum(Rng, CF.[i1], Crit)
                    If tDT > 0 Or tCF > 0 Or tLL > 0 Then
                        With [B200].End(xlUp).Offset(1)
                            .Value = "'" & Right("0" & Col, 2) & "/" & [G4].Value
                            .Offset(, 3).Value = Cls.Value
                            .Offset(, 4).Value = CF.Range("MaDT").Find(Cls.Value).Offset(, -1).Value
                            .Offset(, 6).Value = tDT
                            .Offset(, 7).Value = tCF
                            .Offset(, 8).Value = tLL
                        End With
                    End If
                Next Cls
            Next Col
        ElseIf Left([F5], 1) = "C" Then
            Set Crit = CF.[ab1:AB2]
            For Each Cls In CF.Range("MaDT")
                If Cls.Value = "All" Then Exit For
                CF.[Ab2].Value = Cls
                tDT = WF.DSum(Rng, CF.[g1], Crit)
                tCF = WF.DSum(Rng, CF.[h1], Crit)
                tLL = WF.DSum(Rng, CF.[i1], Crit)
                If tDT > 0 Or tCF > 0 Or tLL > 0 Then
                    With [B200].End(xlUp).Offset(1)
                        .Value = "N" & Right([b13], 2) & " " & [G4].Value
                        .Offset(, 3).Value = Cls.Value
                        .Offset(, 4).Value = CF.Range("MaDT").Find(Cls.Value).Offset(, -1).Value
                        .Offset(, 6).Value = tDT
                        .Offset(, 7).Value = tCF
                        .Offset(, 8).Value = tLL
                    End With
                End If
            
            Next Cls
        End If
    End If
    
    Range([b13].End(xlDown).Offset(2), [B200]).EntireRow.Hidden = True
    
 End If
End Sub
 
Cảm ơn bạn rất nhiều, mình đã làm được rồi. Tốc độ lọc rất nhanh, kết quả chính xác.

Như vậy, đối với tên mặt hàng, mình có thể cũng làm như vậy (giống tên đối tác) được ko ? Cũng gán là 'mặt hàng' và 'tháng', mình vừa có xem qua Code, chỗ Cti và Tháng được viết là left F5 = C hoặc bằng T,... nên mình nghĩ là chắc cũng có thể copy và thay cho F6 = M hoặc bằng T là sẽ được giống như tên đối tác. Có điều là ô E6 chưa được viết code, nên ko biết thế nào, Nhưng Mình cũng sẽ thử đoạn này xem thế nào, có gì nhờ các bạn giúp đỡ thêm.

Chúc các bạn có ngày nghỉ ngơi cuối tuần vui vẻ và hạnh phúc.
 
Lần chỉnh sửa cuối:
Tốc độ có thể cải thiện thêm tẹo do chuyển sang xài SUMIF() thay vì DSUM()

Bạn thử thay đoạn mã này lên fần cuối của macro trên 1 cách tương ứng:

PHP:
        ElseIf Left([F5], 1) = "C" Then
            For Each Cls In CF.Range("MaDT")
                If Cls.Value = "All" Then Exit For
                tDT = WF.SumIf(CF.[E1].Resize(ChFi), Cls, CF.[g1])
                tCF = WF.SumIf(CF.[E1].Resize(ChFi), Cls, CF.[h1])
                tLL = WF.SumIf(CF.[E1].Resize(ChFi), Cls, CF.[i1])
                If tDT > 0 Or tCF > 0 Or tLL > 0 Then
                    With [B200].End(xlUp).Offset(1)
                        .Value = "N" & Right([b13], 2) & " " & [G4].Value
                        .Offset(, 3).Value = Cls.Value
                        .Offset(, 4).Value = CF.Range("MaDT").Find(Cls.Value).Offset(, -1).Value
                        .Offset(, 6).Value = tDT
                        .Offset(, 7).Value = tCF
                        .Offset(, 8).Value = tLL
                    End With
                End If
            
            Next Cls
        End If
    End If
7    On Error Resume Next
    Range([b13].End(xlDown).Offset(2), [B200]).EntireRow.Hidden = True

(húc cuối tuần vui vẻ!
 
Đúng là có nhanh hơn 1 chút so với Dsum (chắc nhanh hơn khoảng 1,2 lần). Như vậy, nếu đổi hết sang Sumif thì sẽ cải thiện đáng kể về tốc độ khi dữ liệu nhiều (phần này mình sẽ tự nghiên cứu để chuyển hết sang Sumif xem thế nào).

Cảm ơn bạn rất nhiều, mong sớm gặp lại các bạn.
 
Đúng là có nhanh hơn 1 chút so với Dsum (chắc nhanh hơn khoảng 1,2 lần). Như vậy, nếu đổi hết sang Sumif thì sẽ cải thiện đáng kể về tốc độ khi dữ liệu nhiều (phần này mình sẽ tự nghiên cứu để chuyển hết sang Sumif xem thế nào).
Cảm ơn bạn rất nhiều, mong sớm gặp lại các bạn.

Bạn lại lạm dụng rồi; Nếu bạn xài E2007 trở lên & xài SUMIFs() thì may ra chứ E2003 thì chỉ 1 vài chổ xài được SUMIF() thì mình đã xài rồi!
(SUMIF() có xài được 2 điều kiện đâu? Muốn xài SUMIF() trong ~ trường hợp như vậy ta fải lọc trước & như vậy là huề cả làng!)

Thân ái & mình đi làm nghĩa vụ công dân đây!
 
Đúng là ko được các bạn ạ, hay là mình làm sai cấu trúc công thức, nên toàn báo lỗi sai code thôi, nên đành nhờ các bạn tiếp tục giúp mình vậy...

Chân thành cảm ơn.
 
Web KT
Back
Top Bottom