Đăng ký học Excel và VBA cùng GPE tháng 11 - TPHCM

Đăng ký học Excel và phân tích số liệu cùng GPE tháng 12 - TPHCM

Mua sách "VBA trong Excel - Cải thiện và tăng tốc" tái bản

Lọc dữ liệu tổng hộp theo tháng/năm

Thảo luận trong 'Làm việc với ngày tháng và thời gian' bắt đầu bởi Thanh1102, 14 Tháng mười 2009.

  1. Thanh1102

    Thanh1102 Thành viên hoạt động

    Kính mong các bác giúp đỡ em vấn đề này.
    Em có sheet báo cáo tổng hợp số liệu NXT trong nhiều tháng. Nhưng em muốn xem báo cáo NXT theo từng tháng. Khi lựa chọn tháng báo cáo và năm báo cáo trong bảng NXT.
    Chân thành cảm ơn các bác trước
     
    Lần chỉnh sửa cuối: 15 Tháng mười 2009
  2. ChanhTQ@

    ChanhTQ@ Thành viên già cỗi.

    Hình như bạn phải thêm dữ liệu

    (1) Để lập báo cáo các tháng khác nhau, bạn phải có, chí ít số liệu nhập xuất của 2 tháng tại 'NKNX'. (Hiện của bạn mới có 1 tháng thì không thể làm được:
    + Không có tồn tháng đầu kỳ;
    + Xuất chỉ có 1 dòng . . . .

    (2) Nếu dữ liệu của bạn nhiều vô kể thì dùng công thức là không phải không được nhưng sẽ lặc lè đó! Hãy theo hướng tổng hợp bằng VBA, bạn nghĩ sao?

    Chờ tin bạn!
     
  3. DOSNET

    DOSNET Thành viên danh dự

    Trong khi chờ đợi lọc bằng VBA, Dosnet gửi bạn bài lọc tùy biến theo tháng năm bằng công thức. Bạn thêm dữ liệu và test hộ nhé, Chúc vui!
     

    Các file đính kèm:

  4. Thanh1102

    Thanh1102 Thành viên hoạt động

    Cảm ơn bác đã quan tâm đến bài của em. Em sẽ cập nhật dữ liệu và gửi lên. Tổng hợp băng VBA thì em gà lắm. Bác có thể cho em xin đ/c mail để gửi lại hoặc hỏi thêm. Nếu bác có bài nào sử dụng VBA có thể cho em tham khảo được không.
    Mail: Thanh1102@gmai.com
     
  5. Thanh1102

    Thanh1102 Thành viên hoạt động

    Cảm ơn Bác DONETS. Em muốn lựa chọn tháng /năm trong sheets"BC chi tiet" cơ. Bác xem lại giùm em nhé. Cảm ơn Bác trước.
     
  6. DOSNET

    DOSNET Thành viên danh dự

    Sorry vì chưa đọc kỹ, bạn đưa đầy đủ dữ liệu lên đi. Nghiệp vụ kế toán tớ không được chắc +-+-+-+
     
  7. Thanh1102

    Thanh1102 Thành viên hoạt động

    Lọc dữ liệu tổng hợp theo tháng/năm

    Cảm ơn bác đã quan tâm đến bài của em. Em đã cập nhật dữ liệu và gửi lên. Tổng hợp bằng VBA thì em gà lắm. Dữ liệu của em rất nhiều. Nếu xử lý bằng VBA thi làm như thế nào?. Các Bác giúp em nhé.
     
    Lần chỉnh sửa cuối: 16 Tháng mười 2009
  8. ChanhTQ@

    ChanhTQ@ Thành viên già cỗi.

    Bạn kiểm tra lại theo file đính kèm xem sao

    Mã:
    Private Sub Worksheet_Change(ByVal Target As Range)
     If Not Intersect(Target, [u1]) Is Nothing Then
       If Target.Value <> "All" Then
          TongHop
       Else
       
       End If
     End If
    End Sub
    PHP:
    Option Explicit

    Sub TongHop
    ()
     
    On Error Resume Next
     Dim Sh 
    As WorksheetRng As RangeClls As RangesRng As Range
     Dim MyAdd 
    As StringKho As String
     Dim eRw 
    As LongCot As Byte

     Set Sh 
    Sheets("NKNX"):           eRw Sh.[B65500].End(xlUp).Row
     Sh
    .Range("G7:P" eRw).AdvancedFilter Action:=xlFilterCopyCriteriaRange:=Sh.Range_
            
    "V2:V3"), CopyToRange:=Sh.Range("U7:Y7"), Unique:=False
     Sh
    .Range("V7:V" eRw).AdvancedFilter Action:=xlFilterCopyCopyToRange:=Sh.[AA7], Unique:=True
     Range
    ("B11:X" eRw).ClearContents
     Sh
    .Range(Sh.[AA8], Sh.[aa65500].End(xlUp)).Copy Destination:=[b11]
     
    Set Rng Sh.Range(Sh.[v7], Sh.[v7].End(xlDown))
     For 
    Each Clls In Range([b11], [b11].End(xlDown))
       
    Set sRng Rng.Find(Clls.Value, , xlFormulasxlWhole)
       If 
    Not sRng Is Nothing Then
          MyAdd 
    sRng.Address
          With Clls
    .Offset(, 1)
             .
    Value sRng.Offset(, 1).Value
             
    .Offset(, 1).Value sRng.Offset(, 2).Value
          End With
          
    Do
             
    Kho Right(sRng.Offset(, -1), 2)
             If 
    Left(sRng.Offset(, -1).Value1) = "N" Then
                Cot 
    = Switch(Kho "MU"4Kho "CK"5Kho "TH"9)
                
    With Clls.Offset(, Cot)
                   .
    Value = .Value sRng.Offset(, 3).Value 
                End With
             
    ElseIf Left(sRng.Offset(, -1).Value1) = "X" Then
                Cot 
    = Switch(Kho "TC"12Kho "CK"13Kho "KH"17)
                
    With Clls.Offset(, Cot)
                   .
    Value = .Value sRng.Offset(, 3).Value 
                End With
             End 
    If
             
    Set sRng Rng.FindNext(sRng)
          
    Loop While Not sRng Is Nothing And sRng.Address <> MyAdd
       End 
    If
     
    Next Clls
    End Sub
    Chú ý:

    (*) Chỉ mới tổng hợp cho từng tháng (Chưa 'All')

    (*) Chưa biết cách lấy số lượng tồn từ đâu?!
     

    Các file đính kèm:

    • GPE.rar
      Kích thước:
      343.5 KB
      Đọc:
      369
    Lần chỉnh sửa cuối: 16 Tháng mười 2009
  9. Thanh1102

    Thanh1102 Thành viên hoạt động

    Lọc dữ liệu tổng hợp theo tháng

    Cảm ơn Bác ChanhTQ. Em đã chạy thử nhưng kết quả không như ý muốn. Trong Sheet"BC chi tiet" là DL tổng hợp N-X-T kho được lập bởi các công thức rút trích số liệu và tổng hợp các tháng trong Sheet "NKNX". Do vậy mình không thể biết trong tháng nào nhập bao nhiêu trong bảng "BC chitiet" (VD: mặt hàng A - tháng 5 nhập 10, tháng 6 nhập 15... mà chỉ biết tổng số nhập-xuất-tồn kho). Vậy em muốn trong bảng "BC chi tiet" đó khi chọn tháng báo cáo/năm báo cáo thì DL sẽ lọc tất cả những mặt hàng và số lượgn N-X-T của tháng đó. Mong bác xem xét giúp đỡ em.!$@!!
     
  10. ChanhTQ@

    ChanhTQ@ Thành viên già cỗi.

    Mình đã thay file khác rồi, đúng là cái cũ chưa như ý của bạn!

    Bạn chọn các tháng từ 5 - 7 thôi nha; Các tháng khác chưa có dữ liệu nhập vô;
    'All' vẫn chưa làm được, hãy đợi thêm.
     
  11. Thanh1102

    Thanh1102 Thành viên hoạt động

    Lọc dự liệu tổng hợp theo tháng/năm(2)

    Các Bác à. Em đã làm được rồi kể cả "ALL" (File đính kèm) nhưng chỉ bằng công thức. Mà dữ liệu thì nhiều quá. Nó chạy rùa lắm. Các Bác xem có thể làm cách khác được không. Giúp em với. Chứ chạy kiểu này chắc chết. !$@!!
     
    Lần chỉnh sửa cuối: 17 Tháng mười 2009
  12. Thanh1102

    Thanh1102 Thành viên hoạt động

    Lọc dữ liệu tổng hợp theo tháng/năm

    Các Bác xem giùm em nhé. Em đã lọc được rồi, kể cả ALL nhưng chỉ bằng công thức. Mà dữ liệu trong file nhiều nên nó chạy rùa quá. Các bác giúp em với.
     
    Lần chỉnh sửa cuối: 17 Tháng mười 2009
  13. Thanh1102

    Thanh1102 Thành viên hoạt động

    Lọc dữ liệu đã tổng hợp theo tháng/năm

    Em đã làm được rồi kể cả "All" nhưng bằng Công thức và nó chạy như rùa. Bác xem giùm em có thể làm cách nào khác không nhé.
     
  14. ChanhTQ@

    ChanhTQ@ Thành viên già cỗi.

    Bạn thử theo file đính kèm, nha! & cho biết kết quả

    PHP:
    Option Explicit
    Private Sub Worksheet_Change(ByVal Target As Range)
     If 
    Not Intersect(Target, [u1]) Is Nothing Then
       
    If Target.Value "All" Then
          Dim Sh 
    As WorksheetRng As RangesRng As RangeClls As Range
          Dim MyAdd 
    As StringKho As String
          Dim eRw 
    As LongCot As Byte
          Set Sh 
    Sheets("DM"):           eRw Sh.[b65500].End(xlUp).Row 9
          
    [B11].Resize(eRw26).ClearContents
          
    [B11].Resize(eRw3).Value Sh.[b4].Resize(eRw3).Value
          Set Sh 
    Sheets("NKNX")
          
    Set Rng Sh.Range(Sh.[H7], Sh.[H65500].End(xlUp))
          
    On Error Resume Next
          
    For Each Clls In Range([B11], [B11].End(xlDown))
             
    Set sRng Rng.Find(Clls.Value, , xlFormulasxlWhole)
             If 
    Not sRng Is Nothing Then
                MyAdd 
    sRng.Address
                
    Do
                   
    Kho Right(sRng.Offset(, -1), 2)
                   If 
    Left(sRng.Offset(, -1).Value1) = "N" Then
                      Cot 
    = Switch(Kho "MU"4Kho "CK"5Kho "TH"9)
                      
    With Clls.Offset(, Cot)
                         .
    Value = .Value sRng.Offset(, 3).Value
                      End With
                   
    ElseIf Left(sRng.Offset(, -1).Value1) = "X" Then
                      Cot 
    = Switch(Kho "TC"12Kho "CK"13Kho "KH"17)
                      
    With Clls.Offset(, Cot)
                         .
    Value = .Value sRng.Offset(, 3).Value
                      End With
                   End 
    If
                   
    Set sRng Rng.FindNext(sRng)
                
    Loop While Not sRng Is Nothing And sRng.Address <> MyAdd
             End 
    If
          
    Next Clls
       
    Else
          
    TongHop
       End 
    If
     
    End If
    End Sub
    Chú ý:

    (*) Trong dữ liệu của bạn còn có chỗ sai trong tên kho ( không phải là "MU", "CK" hay "TH" nên báo lỗi; Vì vấn đề này mình sẽ tìm sau nên dùng dòng lệnh cho qua lỗi đó; Sau này sẽ tìm sau.)

    (*) Chỉ thử trên file của mình & cho biết kết quả; Tốc độ thì không khác bao nhiêu giữa tổng hợp 1 tháng & 'All', phải không?

    (*) Sẽ hoàn thiện bằng cách gộp chung 2 macro, một khi bạn đã kiểm tra đạt kết quả.

    Chờ tin bạn!
     
    Lần chỉnh sửa cuối: 17 Tháng mười 2009
  15. Thanh1102

    Thanh1102 Thành viên hoạt động

    Lọc dữ liệu đã tổng hợp theo tháng

    - Bác xem lại giùm em. Đây là dữ liệu chuẩn (file đính kèm)
    Ghi chú: Đây là kho của 1 công trình CRO - kho CRO
    - Em đã chạy thử phần Bác gửi nhưng khi vào tháng khác (tháng không có dữ liệu)thì treo luôn.
    - Dữ liệu "N-MU", "X-TC" thì vào đúng cột của nó nhưng "X-CK" và "N-CK" thì lại không vào đúng cột kho nhập xuất.
    VD: "N-MU" dữ liệu vào kho "MUA" số liệu hiện ở cột Mua
    Vật tư được chuyển kho từ "XBN" đến kho CRO thì làm thủ tục "N-CK" và kho NX là "X-BN"
    Xuất (X-TC, X-TA, N-TH, X-NB) là thủ tục NX tại kho CRO nên tên kho NX bỏ trắng.
    Mặt khác công thức thực hiện chính xác số liệu nhưng chạy quá chậm.
    Bác xử lý giúp em nhé. Mong tin Bác...Thanks
     
    Lần chỉnh sửa cuối: 19 Tháng mười 2009
  16. HYen17

    HYen17 Thành viên cằn cỗi.

    (1): Chưa có quần áo thì không thể chãi tóc hay mang giày!

    (2) Mã N-CK & X-CK thì chỉ có bạn mới biết nó phải vào NB tương ứng chứ người ngoại đạo làm sao biết được; Bạn chưa bao giờ trước đây nói về điều này mà. (Xin nhắc bạn, những gì bạn tiếp xúc & xử lí hàng ngày lại là những thứ mới toanh với người khác & Phải viết những gì để người khác hiểu, chứ không phải viết những gì mình hiểu)

    (3) Chúng ta không cần xử lí số liệu thật của bạn; Mà macro phải xử lý mọi số liệu sẽ phát sinh sau này;
    Bạn đưa lên quá nhiều số liệu nhưng lại chưa đại diện cho tất cả các trường hợp sẽ diễn ra; Nếu cứ vậy, sau này bạn sẽ không biết các vận hành macro khi phát sinh những mã khác & bảo trì macro trong tương lai

    Bạn cũng không cần đưa lên quá nhiều những trang tính chưa sử dụng giải quyết vấn đề trong topic. Như vậy là sự lãng phí không cần thiết (hay thậm chí có thể hiểu khác. . . )

    (4) Còn vấn đề nữa là tồn đầu kỳ, chúng ta sẽ giải quyết ra sao đây?

    Theo mình số liệu bạn nhiều như vậy thì giành ra 13 cột tại 'DM' để lưu tồn cuối kỳ được không?

    (Có thể toàn là những lời khó nghe, . . . Cũng chỉ mong chúng ta cùng khá lên.)
     
  17. ChanhTQ@

    ChanhTQ@ Thành viên già cỗi.

    Thêm tồn đầu kỳ & dư cuối kỳ đây, xin mời

    PHP:
    Option Explicit:                                   Dim Rng As Range
     
    Private Sub Worksheet_Change(ByVal Target As Range)
     
    Dim Sh As Worksheet:                              Dim eRw As Long
     Dim Thang 
    As Boolean
     
     
    If Not Intersect(Target, [U1]) Is Nothing Then
       
    If Target.Value "All" Then
          Set Sh 
    Sheets("DM"):           eRw Sh.[B65500].End(xlUp).Row 9
          
    [B11].Resize(eRw26).ClearContents
          
    [B11].Resize(eRw3).Value Sh.[b4].Resize(eRw3).Value
          Set Sh 
    Sheets("NKNX")
          
    Set Rng Sh.Range(Sh.[H7], Sh.[H65500].End(xlUp))
       Else
          
    Set Sh Sheets("NKNX"):                     Sheets("BC Chi Tiet").Select
          eRw 
    Sh.[B65500].End(xlUp).Row:             Application.ScreenUpdating False
          Sh
    .Range("G7:P" eRw).AdvancedFilter Action:=xlFilterCopyCriteriaRange:=Sh.Range_
             
    "V2:V3"), CopyToRange:=Sh.Range("U7:Z7")
          
    Sh.Range("V7:V" eRw).AdvancedFilter Action:=xlFilterCopyCopyToRange:=Sh.[AA7], Unique:=True
          Range
    ("B11:X" eRw).ClearContents
          Sh
    .Range(Sh.[AA8], Sh.[AA65500].End(xlUp)).Copy Destination:=[B11]
          
    Set Rng Sh.Range(Sh.[v7], Sh.[v7].End(xlDown))
          
    Thang True
       End 
    If
       
    GPE_COM Thang
       
     End 
    If
    End Sub
    PHP:
    Sub GPE_COM(Optional Thang As Boolean False)
     
    On Error Resume Next
     Dim sRng 
    As RangeClls As Range
     Dim Sht 
    As WorksheetRng0 As RangesRng0 As Range
     Dim MyAdd 
    As StringKho As StringCot As Byte
     
          
    For Each Clls In Range([B11], [B11].End(xlDown))
             
    Set sRng Rng.Find(Clls.Value, , xlFormulasxlWhole)
             If 
    Not sRng Is Nothing Then
                MyAdd 
    sRng.Address
                
    Do
                   
    Kho Right(sRng.Offset(, -1), 2)
                   If 
    Left(sRng.Offset(, -1).Value1) = "N" Then
                      Cot 
    = Switch(Kho "MU"4Kho "CK"5Kho "TH"9Kho "KH"10)
                   ElseIf 
    Left(sRng.Offset(, -1).Value1) = "X" Then
                      Cot 
    = Switch(Kho "TC"12Kho "CK"13Kho "KH"17)
                   
    End If
                      
    With Clls.Offset(, Cot)
                         .
    Value = .Value sRng.Offset(, 3).Value
                      End With
                   
    If Thang Then
                      Cells
    (Clls.Row"M").FormulaR1C1 "=SUM(RC[-7]:RC[-1])"
                      
    Cells(Clls.Row"U").FormulaR1C1 "=SUM(RC[-7]:RC[-1])"
                      
    Cells(Clls.Row"V").FormulaR1C1 "=RC[-17]+RC[-9]-RC[-1]"
    'Chép Ton Cuoi Tháng:'
                      
    Set Sht Sheets("DM")
                      
    Set Rng0 Sht.Range(Sht.[B3], Sht.[B65500].End(xlUp))
                      
    Set sRng0 Rng0.Find(Clls.Value)
                      If 
    Not sRng0 Is Nothing Then
                         Cells
    (Clls.Row"E").Value sRng0.Offset(, 10 + [U1].Value).Value
                         sRng0
    .Offset(, 11 + [U1].Value).Value Cells(Clls.Row"V").Value
                      End 
    If
                   
    End If
                   
    Set sRng Rng.FindNext(sRng)
                
    Loop While Not sRng Is Nothing And sRng.Address <> MyAdd
             End 
    If
          
    Next Clls
    End Sub
     

    Các file đính kèm:

    • GPE.rar
      Kích thước:
      158.3 KB
      Đọc:
      108
  18. Thanh1102

    Thanh1102 Thành viên hoạt động

    Lọc dữ liệu đã tổng hợp theo tháng/chuyển công thức sang VBA

    Cảm ơn các Bác đã chỉ giáo. Nhưng hình như bác hiểu chưa đúng về ý kiến và đề nghị của em. Mỗi đơn vị có những cách quản lý nhập xuất kho khác nhau nhưng cũng đều trên nguyên tắc đưa ra được "Báo cáo N-X-T kho trong kỳ" Bài này cũng không ngoại lệ.
    (1): Chưa có quần áo thì không thể chãi tóc hay mang giày!
    Đúng. Nhưng có thể để số liệu bằng 0 - chứ treo luôn thì....
    (2) Mã N-CK & X-CK thì chỉ có bạn mới biết nó phải vào NB tương ứng chứ người ngoại đạo làm sao biết được; Bạn chưa bao giờ trước đây nói về điều này mà. (Xin nhắc bạn, những gì bạn tiếp xúc & xử lí hàng ngày lại là những thứ mới toanh với người khác & Phải viết những gì để người khác hiểu, chứ không phải viết những gì mình hiểu).
    Thực chất mã loại CT "N-MU", "X-CK"... chỉ là ký hiệu do người sử dụng tự đặt. Nhưng vẫn trên một nguyên lý cũ rích là: Nhập kho cái gì thì cũng phải biết nó được "mua" hay ""chuyển từ đâu tới".. và xuất kho thì cũng phải biết là "xuất đi đâu", cho ai...
    (3) Bạn cũng không cần đưa lên quá nhiều những trang tính chưa sử dụng giải quyết vấn đề trong topic. Như vậy là sự lãng phí không cần thiết (hay thậm chí có thể hiểu khác.. )
    Sorry. Đây là phần em đang làm và cũng dựa trên sự phát triển từ dữ liệu gốc. Trên topic có thể nhiều người cũng muốn xem và tham khảo cùng nên em để nguyên như vây thôi chứ không có ý gì khác.
    (4) Còn vấn đề nữa là tồn đầu kỳ, chúng ta sẽ giải quyết ra sao đây?
    Theo mình số liệu bạn nhiều như vậy thì giành ra 13 cột tại 'DM' để lưu tồn cuối kỳ được không?
    Vấn đề này quá hay. Thanks
    (Có thể toàn là những lời khó nghe, . . . Cũng chỉ mong chúng ta cùng khá lên.)[/QUOTE]
     
    Lần chỉnh sửa cuối: 18 Tháng mười 2009
  19. Thanh1102

    Thanh1102 Thành viên hoạt động

    Bác ChanhTQ ơi! Dữ liệu không chuyển kho vào các kho chi tiet ạ.
    Bác lấy và sử dụng trên file dữ liệu "Vattu(moi)" em đã chỉnh sửa lại.Bác xem giùm nhé.
     
    Lần chỉnh sửa cuối: 18 Tháng mười 2009
  20. ChanhTQ@

    ChanhTQ@ Thành viên già cỗi.

    (1) Vậy bạn đã xem lại tại sao nó không chuyển vào kho các chi tiết chưa.

    Nhất là loại xuất kho;

    Mã X-CK, bên trường [Diễn giải nội dung] có các nội dung vầy thì chuyển đi đâu:

    Hệ thống điện cônng trình;
    Làm láng trại;
    Làm nhà kho;
    Cho mượn;
    Lắp Module;
    Tử số . . .
    Hay M- CRO thì vô đâu;

    Đó là chưa kể trong VBA tìm từ tiếng Việt là không dễ là cái chắc, nếu không muốn nói là chưa thể. . . Nếu không các cách mã hóa chúng thì thua.
     

Chia sẻ trang này