Nhờ giúp đỡ làm thống kê số liệu theo từng tháng (1 người xem)

  • Thread starter Thread starter pinklove
  • Ngày gửi Ngày gửi
Liên hệ QC

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

pinklove

Thành viên thường trực
Tham gia
21/1/08
Bài viết
336
Được thích
42
Mình có một file thống kê số giờ chạy máy nổ của các trạm Viễn Thông theo từng tháng. Bây giờ mình muốn làm hai mẫu báo cáo (theo trạm và theo người quản lý) như trong file. Nhờ giúp đỡ mình code để khi mình chọn các điều kiện tương ứng theo từng báo cáo (tên trạm, tên người quản lý, tháng cần thống kê, loại nhiên liệu) thì sẽ liệt kê được đầy đủ theo tháng đó.
Trong file mình chỉ lấy ví dụ 2 tháng cho nhẹ. File đầy đủ có thêm các sheet của 12 tháng trong năm)
Mong nhận được sự giúp đỡ của các a/c.
 

File đính kèm

Báo cáo theo trạm:
Mã:
Sub Button2_Click()
Dim stArr(), rsArr(), iR As Long, jR As Long
Dim Ws As Worksheet
For Each Ws In ThisWorkbook.Worksheets
    If Ws.Name = "Thang" & Format(Sheet3.Range("D6"), "00") Then
        stArr = Ws.Range("B9:J" & Ws.Range("B65535").End(xlUp).Row)
        ReDim rsArr(LBound(stArr) To UBound(stArr), 1 To 5)
        For iR = LBound(stArr) To UBound(stArr)
            If stArr(iR, 1) = Sheet3.Range("D5") Then
                jR = jR + 1
                rsArr(jR, 1) = jR
                rsArr(jR, 2) = stArr(iR, 2)
                rsArr(jR, 3) = stArr(iR, 3)
                rsArr(jR, 4) = stArr(iR, 4)
                rsArr(jR, 5) = stArr(iR, 5)
            End If
        Next iR
        If jR Then
            Sheet3.Range("A11").Resize(12, 5).ClearContents
            Sheet3.Range("A11").Resize(jR, 5) = rsArr
        End If
        Exit For
    End If
Next Ws
End Sub
Bốn cột còn lại tôi chưa rõ lấy từ đâu.
Cần bao nhiêu dòng mỗi báo cáo?
Từ báo cáo này, sửa code để làm báo cáo 2.
 

File đính kèm

Upvote 0
Báo cáo theo trạm:
Mã:
Sub Button2_Click()
Dim stArr(), rsArr(), iR As Long, jR As Long
Dim Ws As Worksheet
For Each Ws In ThisWorkbook.Worksheets
    If Ws.Name = "Thang" & Format(Sheet3.Range("D6"), "00") Then
        stArr = Ws.Range("B9:J" & Ws.Range("B65535").End(xlUp).Row)
        ReDim rsArr(LBound(stArr) To UBound(stArr), 1 To 5)
        For iR = LBound(stArr) To UBound(stArr)
            If stArr(iR, 1) = Sheet3.Range("D5") Then
                jR = jR + 1
                rsArr(jR, 1) = jR
                rsArr(jR, 2) = stArr(iR, 2)
                rsArr(jR, 3) = stArr(iR, 3)
                rsArr(jR, 4) = stArr(iR, 4)
                rsArr(jR, 5) = stArr(iR, 5)
            End If
        Next iR
        If jR Then
            Sheet3.Range("A11").Resize(12, 5).ClearContents
            Sheet3.Range("A11").Resize(jR, 5) = rsArr
        End If
        Exit For
    End If
Next Ws
End Sub
Bốn cột còn lại tôi chưa rõ lấy từ đâu.
Cần bao nhiêu dòng mỗi báo cáo?
Từ báo cáo này, sửa code để làm báo cáo 2.

Cách làm của bạn là thống kê toàn bộ file, trong khi mình chỉ muốn thống kê theo từng tháng. Ví dụ chỗ thời gian mình chọn tháng 1 thì nó chỉ thống kê trong tháng 1, các tháng khác cho dù có trạm đó cũng không thống kê. Các cột còn lại thì dữ liệu lấy từ các sheet đã có sẵn đó thôi ạ. Mỗi báo cáo mình cần khoảng 100 dòng. Mình sửa lại file gốc tý để các bạn rõ hơn.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Chào bạn !
Cách thống kê số liệu từng tháng của bạn minh nghĩ bạn nên dùng công cụ PivotTable kết hợp với VBA sẽ tạo ra các báo cáo rất nhanh chóng và hiệu quả. Dữ liệu, thay vì để riêng rẽ từng tháng bạn nên thiết kế lại thành một sheet Tonghop. Từ dó bạn dùng PivotTable để lọc ra các báo cáo.
Chúc bạn thành công !
 
Upvote 0
Chào bạn !
Cách thống kê số liệu từng tháng của bạn minh nghĩ bạn nên dùng công cụ PivotTable kết hợp với VBA sẽ tạo ra các báo cáo rất nhanh chóng và hiệu quả. Dữ liệu, thay vì để riêng rẽ từng tháng bạn nên thiết kế lại thành một sheet Tonghop. Từ dó bạn dùng PivotTable để lọc ra các báo cáo.
Chúc bạn thành công !
Cảm ơn bạn, nhưng vì mình mù tịt về mấy thứ này nên nhờ bạn giúp để công việc được tốt hơn được không ạ.
 
Upvote 0
Thứ 1: Tôi thấy #2 bài của Leo Nguyễn code cho bạn ổn mà, ........hay bạn chưa hiểu??? Bạn đang format tên tháng là Thang01, Thang02,..........Thang12. Thì bài của Leo đang code theo format đó còn gì.
Thứ 2: Tôi thấy file đính kèm #3 của bạn, có sheet thống kê theo Người Quản lý. Trong khi tại các sheet Tháng chẳng có thông tin của người quản lý,.........thế thì thống kê kiểu gì

Bạn cần xem lại cách trình bày file của mình, thì mọi chuyện sẽ đơn giản, vài dòng là có thể ra báo cáo rồi.
Trong sheet QLNL của mình có người quản lý kèm theo tên các trạm rồi. Mình thì không rõ lắm nhưng mình tưởng là có thể lấy từ sheet đó theo tên trạm ở trong các tháng. Vậy bây giờ cần đưa cả những thông tin đó sang sheet tháng hả bạn???

Mình đang xem lại bài bạn Leo Nguyễn. Nhưng sao mình thay tháng khác vào thì lúc click button nó ko mất dữ liệu tháng cũ nhỉ.
 
Upvote 0
Cái file của bạn nó không khó gì cả, vấn đề người trên diễn đàn có rãnh để viết code thông kê cho bạn không, mà cho dù viết được gửi cho bạn xong, đôi khi bạn nhập tên "người quản lý" vào ở dữ liệu nguồn sẽ không chuẩn và khi dò kết quả sẽ không còn chính xác nữa , tốt nhất để giải quyết những file như thế này bạn nên gặp trực tiếp người nào đó rành về cái này để người ta còn hướng dẫn cách bạn dùng file đó như thế nào nữa!
 
Upvote 0
Cái file của bạn nó không khó gì cả, vấn đề người trên diễn đàn có rãnh để viết code thông kê cho bạn không, mà cho dù viết được gửi cho bạn xong, đôi khi bạn nhập tên "người quản lý" vào ở dữ liệu nguồn sẽ không chuẩn và khi dò kết quả sẽ không còn chính xác nữa , tốt nhất để giải quyết những file như thế này bạn nên gặp trực tiếp người nào đó rành về cái này để người ta còn hướng dẫn cách bạn dùng file đó như thế nào nữa!
Tên người quản lý thì ko thể sai được bạn à, vì mình có tạo list bằng data validation cho Người Quản Lý và Loại nhiên liệu rồi. chỉ việc chọn thôi --=0
 
Upvote 0
Bạn nên làm lại file đi, vd trong sh("Báo cáo theo tên quản lý") bạn có yêu cầu dò với điều kiện thời gian , nhưng mà ở sh("QLNL") lại không có bất kì cột nào dành cho ghi thời gian cả vậy lọc nó như thế nào đây?
 
Upvote 0
Bạn nên làm lại file đi, vd trong sh("Báo cáo theo tên quản lý") bạn có yêu cầu dò với điều kiện thời gian , nhưng mà ở sh("QLNL") lại không có bất kì cột nào dành cho ghi thời gian cả vậy lọc nó như thế nào đây?
Thời gian thì dò theo tháng mà bạn. Ví dụ mình muốn thống kê trong tháng 9 thì sẽ chỉ tìm trong sheet tháng 9 mà thôi. Còn nên làm lại file thế nào bạn có thể góp ý và đưa ra giải pháp giùm mình được không. Mình mù tịt nên hãy giúp tận tình nhé .
 
Upvote 0
Cách làm của bạn là thống kê toàn bộ file, trong khi mình chỉ muốn thống kê theo từng tháng. Ví dụ chỗ thời gian mình chọn tháng 1 thì nó chỉ thống kê trong tháng 1, các tháng khác cho dù có trạm đó cũng không thống kê. Các cột còn lại thì dữ liệu lấy từ các sheet đã có sẵn đó thôi ạ. Mỗi báo cáo mình cần khoảng 100 dòng. Mình sửa lại file gốc tý để các bạn rõ hơn.

Dựa vào ý bài #2, bạn xem file này: Thay đổi ô D5 hoặc D6 thì code hoạt động, cho kết quả bảng dưới.
Mới làm 1 sheet thôi, nếu đúng thì tiếp, sai thì "chạy"
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Dựa vào ý bài #2, bạn xem file này: Thay đổi ô D5 hoặc D6 thì code hoạt động, cho kết quả bảng dưới.
Mới làm 1 sheet thôi, nếu đúng thì tiếp, sai thì "chạy"
Đúng rồi anh ạ. Nhờ a làm tiếp hộ em. Nhờ a làm sao khi mà không có dữ liệu thì tất cả các dòng từ 13 đến 35 nó cũng hide luôn ạ.
 
Lần chỉnh sửa cuối:
Upvote 0
Đúng rồi anh ạ. Nhờ a làm tiếp hộ em. Nhờ a làm sao khi mà không có dữ liệu thì tất cả các dòng từ 13 đến 35 nó cũng hide luôn ạ.

Không làm được.
Người quản lý, vận hành, Theo dõi... cái nào là cái nào, tên trong các sheet "mò" chẳng có làm sao làm.
Vinh, Nam, Đông, Hoà trên trời rơi xuống tìm đâu mà viết code?
"Chạy".
 
Upvote 0
Không làm được.
Người quản lý, vận hành, Theo dõi... cái nào là cái nào, tên trong các sheet "mò" chẳng có làm sao làm.
Vinh, Nam, Đông, Hoà trên trời rơi xuống tìm đâu mà viết code?
"Chạy".
Người quản lý thì trong sheet DM em có ghi rõ đó anh, còn trong sheet QLNL thì nó là ở mục "Theo dõi-cấp nhiên liệu". E quên ghi rõ mất. Người vận hành thì lấy theo mục người vận hành ở từng tháng luôn anh ạ. Cái người vận hành đó ko quan trọng anh ạ. A đừng chạy. Ở lại giúp e cho nốt đi.
 
Lần chỉnh sửa cuối:
Upvote 0
Chủ bài viết cần thấy rằng: Rất nhiều người trên diễn đàn góp í với bạn sửa CSDL; Bạn nên nghe & làm theo những lời khuyên chí tình đó;
Bạn hãy từ bỏ CSDL đang có của bạn đi & làm lại; Có vậy sau này bạn vận hành mới trơn tru được.

(1) Tất cả hoạt động của bạn các tháng gôm vô hết trong 1 trang tính;
(2) Ngày hoạt đông nên nhập dạng mm/dd/yyyy (để dễ nhìn do quen mắt, bạn hoàn toàn có thể định dạng lại bỡi Custom
thành dạng dd/MM/yyyy)
(2) Ở trang tính 'DM' bạn cần thiết lập thêm bảng [Trạm - mã trạm]
. . . . .
Tóm lại, bạn cần bỏ nhiều thời gian đầu tư xây dựng 1 CSDL thật 'Chuẩn' để sau này nó fát triển 1 cách hết sức bình thường, bằng ngược lại, nó sẽ là bệnh hoạn! (Lúc đó đừng trách anh chị em trên diễn đàn biết mà không cảnh báo!)
 
Upvote 0
Không làm được.
Người quản lý, vận hành, Theo dõi... cái nào là cái nào, tên trong các sheet "mò" chẳng có làm sao làm.
Vinh, Nam, Đông, Hoà trên trời rơi xuống tìm đâu mà viết code?
"Chạy".
Theo góp ý của các anh chị trên diễn đàn em đã sửa lại data một chút. Không biết thế này đã được chưa. Anh xem giúp và hỗ trợ em với. Em vẫn để các tháng là các sheet riêng biệt. Nếu anh thấy nên gộp lại hơn thì anh cứ làm theo hướng đó. Em chỉ việc đưa tất cả vào 1 sheet là được. Em cảm ơn.
 

File đính kèm

Upvote 0
Ở trong 2 code này có cái dòng With sheet 3 và with sheet 4 khi mình chèn thêm các tháng khác vào phía trước thì code có bị ảnh hưởng không ban?
 
Upvote 0
Đưa sheet các tháng vào 1 sheet, hay để riêng từng sheet tháng là do nhu cầu của bạn. Nếu cảm thấy tách ra từng tháng (cùng lắm 1 năm là 12 sheet chứ nhiêu) nó rạch ròi, dễ cho bạn nhập liệu hơn thì cứ để như cũ. Đơn giản là vậy, còn muốn gộp lại thì cũng đơn giản thôi,.... (Nhưng theo quan điểm của tôi thì cái gì quen thuộc, đơn giản,........thì xài vậy, như cách cũ của bạn tách ra từng tháng cho nó rành mạch thì cũng ô kê).

Tôi có làm cho bạn theo như cũ của bạn, không cần phải gộp sheet tháng lại .(Miễn sao tên sheet theo format là "Thang01, Thang02,...., Thang12" là được.... (chỉ sheet BC theo quản lý nha, sheet theo trạm hình như là Anh BaTê đã làm cho bạn rồi.)

1. Bạn chèn thêm dòng vào sheet Báo cáo theo tên quản lý, và đưa dòng tổng cộng xuống dòng thứ 101 (mục đích để dư ra và hide đi khi chạy code.
2. Paste code sau vào module
Mã:
Sub NgQly()
Dim Ws As Worksheet, sArr(), tArr(), dArr, I As Long, J As Long, K As Long
Dim Nqly As String, Nlieu As String, Rws As Long
Nqly = Range("E5").Value
Nlieu = Range("E7").Value
dArr = Array(1, 2, 3, 4, 5, 6, 10, 11, 14)
For Each Ws In ThisWorkbook.Worksheets
    If Ws.Name = "Thang" & Format(Sheet4.Range("E6"), "00") Then
        sArr = Ws.Range("B8:Q" & Ws.Range("B65536").End(xlUp).Row)
        ReDim tArr(1 To UBound(sArr, 1), 1 To 10)
        For I = 1 To UBound(sArr, 1)
            If sArr(I, 16) = Nqly And sArr(I, 15) = Nlieu Then
                K = K + 1
                For J = 0 To UBound(dArr)
                    tArr(K, 1) = K
                    tArr(K, J + 2) = sArr(I, dArr(J))
                Next J
            End If
        Next I
        Exit For
    End If
Next Ws
With Sheet4
        .Cells.EntireRow.Hidden = False
        .Range("A11:J100").ClearContents
        If K Then
            .Range("A11").Resize(K, 10) = tArr
            Rws = .[B65536].End(xlUp).Row + 1
            .Rows(Rws & ":100").Hidden = True
        Else
            MsgBox "Khong co du lieu", , "BC MAY NO"
        End If
End With
End Sub
3. Paste code sau vào Sheet4(Báo cáo theo tên QL)
Mã:
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("E5:E7")) Is Nothing Then NgQly
End Sub
Nhờ bạn xem lại giúp ở cột Chi tiết vận hành máy nổ chưa đúng kết quả. Ngoài ra nhờ bạn sửa chút sao cho khi không có dữ liệu thì hide từ dòng thứ 13 đến dòng 100 luôn.
 
Upvote 0
À, mình sửa được cái chi tiết vận hành rồi. Bạn lấy nhầm từ cột 7 thành cột 6. Nhờ bạn giúp cái hiden kia nhé
 
Upvote 0
Xin lỗi đã lại làm phiền các anh với chủ đề này. Nhưng trong quá trình sử dụng báo cáo em có phát sinh một vấn đề, đó là nhiều lúc phải thống kê từ ngày của tháng trước sang ngày của tháng sau mà không phải chỉ thống kê trong tháng như trước đây em đã nhờ giúp đỡ. Em có chỉnh sửa lại hai mẫu báo cáo trong file gửi kèm ( ở các sheet "BC_TEN_QL (2)" và "BC_TRAM (2)" ). Nhờ các anh giúp đỡ sửa lại code để em có thể thống kê số liệu từ ngày ... đến ngày.... . Em xin cảm ơn.

File gửi kèm
 
Upvote 0
Hình như em hỏi nhiều quá nên giờ chẳng ai buồn giúp nữa rùi **~****~****~**
 
Upvote 0
Nhưng trong quá trình sử dụng báo cáo em có phát sinh một vấn đề, đó là nhiều lúc phải thống kê từ ngày của tháng trước sang ngày của tháng sau mà không phải chỉ thống kê trong tháng như trước đây em đã nhờ giúp đỡ. Em có chỉnh sửa lại hai mẫu báo cáo trong file gửi kèm ( ở các sheet "BC_TEN_QL (2)" và "BC_TRAM (2)" ). Nhờ các anh giúp đỡ sửa lại code để em có thể thống kê số liệu từ ngày ... đến ngày....
File gửi kèm

Nhiều người làm theo hướng "gộp" dữ liệu các tháng; bạn đã làm chưa vậy?
Nếu đã 'gộp chung thành 1 CSDL trên 1 trang tính thì chuyện tồng hợp từ giữa tháng nọ đến cuối tháng kia cũng như đầu đến cuối tháng mà thôi.

Những người khuyên bạn để i xì 12 tháng sẽ không dễ trong việc tổng hợp theo iêu cầu của bạn mới fát sinh này.
(& mình khẳng định 1 điều là bạn đưa số liệu 12 trang tính riêng rẽ của 12 tháng hoạt động thì mình nói thẳng: "Mình sẽ không rờ tới, vì thật ra giúp bạn ngay giờ nhưng sẽ là hại bạn lâu dài đó thôi!"

Chúc ngủ ngon!
 
Upvote 0
Nhiều người làm theo hướng "gộp" dữ liệu các tháng; bạn đã làm chưa vậy?
Nếu đã 'gộp chung thành 1 CSDL trên 1 trang tính thì chuyện tồng hợp từ giữa tháng nọ đến cuối tháng kia cũng như đầu đến cuối tháng mà thôi.

Những người khuyên bạn để i xì 12 tháng sẽ không dễ trong việc tổng hợp theo iêu cầu của bạn mới fát sinh này.
(& mình khẳng định 1 điều là bạn đưa số liệu 12 trang tính riêng rẽ của 12 tháng hoạt động thì mình nói thẳng: "Mình sẽ không rờ tới, vì thật ra giúp bạn ngay giờ nhưng sẽ là hại bạn lâu dài đó thôi!"

Chúc ngủ ngon!
Mình cũng đã nghĩ đến vấn đề gộp dữ liệu lại trên 1 sheet. Như vậy cũng được bạn ạ. Mình chia ra 12 tháng ở 12 trang tính vì muốn nó rõ ràng thôi. Nhưng thực tế thì chỉ chú ý vào báo cáo là quan trọng nhất. Nhờ bạn giúp mình theo hướng này nhé. Như vậy càng nhẹ file hơn cũng là tốt hơn.

Ngoài ra, nếu có thể nhờ bạn làm cho mình luôn trường hợp 12 tháng. Chỉ là để mình học hỏi thêm thôi. Dựa vào các code được giúp ở file này mà mình đã làm được nhiều file số liệu khác trong công việc của mình rất tiện. Vì vậy mình muốn biết thêm một trường hợp thế để mình áp dụng trong một số trường hợp không thể gộp dữ liệu.

Xin cảm ơn nhiều!!
 
Upvote 0
Mình cũng đã nghĩ đến vấn đề gộp dữ liệu lại trên 1 sheet. Như vậy cũng được bạn ạ. Mình chia ra 12 tháng ở 12 trang tính vì muốn nó rõ ràng thôi. Nhưng thực tế thì chỉ chú ý vào báo cáo là quan trọng nhất. Nhờ bạn giúp mình theo hướng này nhé. Như vậy càng nhẹ file hơn cũng là tốt hơn.

Ngoài ra, nếu có thể nhờ bạn làm cho mình luôn trường hợp 12 tháng. Chỉ là để mình học hỏi thêm thôi. Dựa vào các code được giúp ở file này mà mình đã làm được nhiều file số liệu khác trong công việc của mình rất tiện. Vì vậy mình muốn biết thêm một trường hợp thế để mình áp dụng trong một số trường hợp không thể gộp dữ liệu.

Xin cảm ơn nhiều!!

Theo tôi thì thiết kế lại tiêu đề cột và theo dõi chỉ 1 sheet:

- Muốn tổng hợp cái gì thì PivoTable (muốn tháng nào thì chọn tháng đó cũng được)..

- Muốn có 12 sheet của 12 tháng thì cho nó 1 nút tách sheet là xong (khỏi suy nghĩ nhiều cho nó phức tạp ra).
 
Upvote 0
Mình cũng đã nghĩ đến vấn đề gộp dữ liệu lại trên 1 sheet. Như vậy cũng được bạn ạ. Mình chia ra 12 tháng ở 12 trang tính vì muốn nó rõ ràng thôi. Nhưng thực tế thì chỉ chú ý vào báo cáo là quan trọng nhất. Nhờ bạn giúp mình theo hướng này nhé. Như vậy càng nhẹ file hơn cũng là tốt hơn.

Ngoài ra, nếu có thể nhờ bạn làm cho mình luôn trường hợp 12 tháng. Chỉ là để mình học hỏi thêm thôi. Dựa vào các code được giúp ở file này mà mình đã làm được nhiều file số liệu khác trong công việc của mình rất tiện. Vì vậy mình muốn biết thêm một trường hợp thế để mình áp dụng trong một số trường hợp không thể gộp dữ liệu.

Xin cảm ơn nhiều!!

Dồn các sheet Thang vào sheet DATA, làm cho bạn 1 sheet BC_TEN_QL2.
Các chuyện khác bạn tự "chế biến" nhé.
 

File đính kèm

Upvote 0
Dồn các sheet Thang vào sheet DATA, làm cho bạn 1 sheet BC_TEN_QL2.
Các chuyện khác bạn tự "chế biến" nhé.
Anh xem giúp em vì sao khi em thay dòng này của anh
PHP:
.[A11:K500].ClearContents
.[A11].Resize(K, 11) = dArr

Thành
PHP:
.Cells.EntireRow.Hidden = False        
.Range("A11:K500").ClearContents        
If K Then            
.Range("A11").Resize(K, 11) = dArr            
.Range("A" & 11 + K - 1 & ":A500").EntireRow.Hidden = True    
Else            
.Rows("13:500").Hidden = True            
MsgBox "Khong co du lieu", , "BÁO CÁO"        
End If
Nó báo lỗi ở dòng này
PHP:
dArr(K, 11) = dArr(K, 7) / 60 * dArr(K, 10)
 
Lần chỉnh sửa cuối:
Upvote 0
Nó báo lỗi dòng ấy thì liên quan gì tới mấy dòng bạn vừa mới thêm chứ...

Bạn xem lại dữ liệu thật của bạn có merger hay gì không???
Còn không thì đính kèm file thật lên đây. nói vậy khó đoán bệnh lắm.... ai biết bệnh gì trong file thật mà đoán.
File của anh Ba Tê gửi cho mình ở bài trên đó bạn. Mình chỉ sửa đoạn đó để nó hide dòng ở báo cáo thôi mà. Nhờ bạn xem giúp
 
Upvote 0
Code theo file của anh Ba Tê #29

Mã:
Option Explicit
Public Tg As String
Sub GPE()
Dim Dic As Object
Dim I As Long, J As Long, K As Long
Dim Tmp As String
Dim Arr, dArr, MON As String
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Arr = Range(Sheets("DATA").[D8], Sheets("DATA").[D65000].End(3))
ReDim dArr(1 To UBound(Arr, 1), 1 To UBound(Arr, 2))
Set Dic = CreateObject("Scripting.Dictionary")
With Dic
    For I = 1 To UBound(Arr, 1)
    Tmp = Month(Arr(I, 1))
        If Not .Exists(Tmp) Then
            K = K + 1
            .Add Tmp, K
            For J = 1 To UBound(Arr, 2)
                dArr(K, J) = Month(Arr(I, J))
            Next J
        End If
    Next I
End With
    Sheets("DATA").Range("S8").Resize(K, UBound(Arr, 2)) = dArr
    Sheets("DATA").Range("R8:R" & Sheets("DATA").[D65000].End(3).Row).FormulaR1C1 = "=MONTH(RC[-14])"
    Sheets("DATA").Range("S8:S" & Sheets("DATA").[S65000].End(3).Row).Name = "MON"


On Error Resume Next
    For I = 1 To Range("MON").Count
        Tg = Range("MON").Cells(I, 1)
        Sheets.Add After:=Sheets(Sheets.Count)
        Sheets(Sheets.Count).Name = Tg
        Sheets("DATA").Range("A7:R" & Sheets("DATA").[D65000].End(3).Row).AutoFilter 18, Tg
        Sheets("DATA").Range("A6:Q" & Sheets("DATA").[D65000].End(3).Row).SpecialCells(12).Copy Sheets(Tg).[A6]
        Application.CutCopyMode = False
    Next I
        Sheets("DATA").AutoFilterMode = False
        Sheets("DATA").Range("R8:S100").ClearContents
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub
Làm sao để có thể chạy được code này vậy bạn hiền???
 
Upvote 0
Bạn thêm một Sheet mới & đặt tên là "LOC". Xong tại Cell E2 bạn làm cái Data Validation từ 1->12 để chọn tháng khi chạy code. Sau đó copy & paste code sau vào Sheet LOC mới vừa thêm.
Thay đổi giá trị tại Cell E2 thì code sẽ chạy

Mã:
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Arr, dArr, I As Long, J As Long, K As Long
Dim Tg, lr As Long
Application.ScreenUpdating = False
Application.DisplayAlerts = False
If Target.Address = "$E$2" Then
Tg = [E2].Value
With Sheets("DATA")
    .Range("A6:Q7").Copy Sheets("LOC").[A6]
    .Range("R8:R" & .Range("B65000").End(3).Row).FormulaR1C1 = "=MONTH(RC[-14])"
    Arr = .Range(.[B8], .Range("B65000").End(3)).Resize(, 17)
End With
    ReDim dArr(1 To UBound(Arr, 1), 1 To 17)
        For I = 1 To UBound(Arr, 1)
            If Arr(I, 17) = Tg Then
                K = K + 1
                    dArr(K, 1) = K
                For J = 1 To UBound(Arr, 2) - 1
                    dArr(K, J + 1) = Arr(I, J)
                Next J
            End If
        Next I
With Sheets("LOC")
            .Range("A8:Q65000").ClearContents
            .Range("A8:Q65000").Borders.LineStyle = xlNone
        If K Then .Range("A8").Resize(K, 17) = dArr
            lr = .Range("B65000").End(3).Row
        If lr >= 8 Then
            .Range("A8:Q" & lr).Borders.LineStyle = xlContinuous
            .Range("A8:Q" & lr).Borders(xlInsideHorizontal).Weight = xlHairline
        End If
End With
        Sheets("DATA").Range("R8:R65000").ClearContents
End If
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub

Được Bà Trưng rồi giờ đòi thêm Bà Triệu nữa. Đó là trường hợp mình sử dụng chung DATA cho nhiều năm, nhưng code này chỉ tách tháng trong năm thôi. Nhờ bạn sửa code để có thể lựa chọn tháng, năm nào nữa.
 
Upvote 0
Được Bà Trưng rồi giờ đòi thêm Bà Triệu nữa. Đó là trường hợp mình sử dụng chung DATA cho nhiều năm, nhưng code này chỉ tách tháng trong năm thôi. Nhờ bạn sửa code để có thể lựa chọn tháng, năm nào nữa.

Có khi nào từ năm 40 đến năm 2015 hông ta?
 
Upvote 0

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

Back
Top Bottom