Lọc dữ liệu tổng hộp theo tháng/năm (1 người xem)

Liên hệ QC

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

Thanh1102

Thành viên hoạt động
Tham gia
29/11/08
Bài viết
147
Được thích
46
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:
Hình như bạn phải thêm dữ liệu

Căn cứ vào dữ liệu trong Sheets"NKNX"
1, Trong Sheets"BC chi ttiet" em muốn báo cáo theo từ tháng hoặc 12 tháng "All". Khi chọn tháng báo cáo và năm báo cáo thì dữ liệu tự động lọc theo báo cáo

(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!
 
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
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!
 

File đính kèm

(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!
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
 
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ả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.
 
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.
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 +-+-+-+
 
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:
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 Worksheet, Rng As Range, Clls As Range, sRng As Range
 Dim MyAdd As String, Kho As String
 Dim eRw As Long, Cot As Byte

 Set Sh = Sheets("NKNX"):           eRw = Sh.[B65500].End(xlUp).Row
 Sh.Range("G7:P" & eRw).AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Sh.Range( _
        "V2:V3"), CopyToRange:=Sh.Range("U7:Y7"), Unique:=False
 Sh.Range("V7:V" & eRw).AdvancedFilter Action:=xlFilterCopy, CopyToRange:=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, , xlFormulas, xlWhole)
   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).Value, 1) = "N" Then
            Cot = Switch(Kho = "MU", 4, Kho = "CK", 5, Kho = "TH", 9)
            With Clls.Offset(, Cot)
               .Value = .Value + sRng.Offset(, 3).Value 
            End With
         ElseIf Left(sRng.Offset(, -1).Value, 1) = "X" Then
            Cot = Switch(Kho = "TC", 12, Kho = "CK", 13, Kho = "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?!
 

File đính kèm

Lần chỉnh sửa cuối:
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.!$@!!
 
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.
 
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:
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:
Lọc dữ liệu đã tổng hợp theo tháng/năm

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.
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é.
 
Bạn thử theo file đính kèm, nha! & cho biết kết quả

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é.
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 Worksheet, Rng As Range, sRng As Range, Clls As Range
      Dim MyAdd As String, Kho As String
      Dim eRw As Long, Cot As Byte
      Set Sh = Sheets("DM"):           eRw = Sh.[b65500].End(xlUp).Row + 9
      [B11].Resize(eRw, 26).ClearContents
      [B11].Resize(eRw, 3).Value = Sh.[b4].Resize(eRw, 3).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, , xlFormulas, xlWhole)
         If Not sRng Is Nothing Then
            MyAdd = sRng.Address
            Do
               Kho = Right(sRng.Offset(, -1), 2)
               If Left(sRng.Offset(, -1).Value, 1) = "N" Then
                  Cot = Switch(Kho = "MU", 4, Kho = "CK", 5, Kho = "TH", 9)
                  With Clls.Offset(, Cot)
                     .Value = .Value + sRng.Offset(, 3).Value
                  End With
               ElseIf Left(sRng.Offset(, -1).Value, 1) = "X" Then
                  Cot = Switch(Kho = "TC", 12, Kho = "CK", 13, Kho = "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:
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:
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 (1).
- 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"
(2)
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

(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.)
 
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(eRw, 26).ClearContents
      [B11].Resize(eRw, 3).Value = Sh.[b4].Resize(eRw, 3).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:=xlFilterCopy, CriteriaRange:=Sh.Range( _
         "V2:V3"), CopyToRange:=Sh.Range("U7:Z7")
      Sh.Range("V7:V" & eRw).AdvancedFilter Action:=xlFilterCopy, CopyToRange:=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 Range, Clls As Range
 Dim Sht As Worksheet, Rng0 As Range, sRng0 As Range
 Dim MyAdd As String, Kho As String, Cot As Byte
 
      For Each Clls In Range([B11], [B11].End(xlDown))
         Set sRng = Rng.Find(Clls.Value, , xlFormulas, xlWhole)
         If Not sRng Is Nothing Then
            MyAdd = sRng.Address
            Do
               Kho = Right(sRng.Offset(, -1), 2)
               If Left(sRng.Offset(, -1).Value, 1) = "N" Then
                  Cot = Switch(Kho = "MU", 4, Kho = "CK", 5, Kho = "TH", 9, Kho = "KH", 10)
               ElseIf Left(sRng.Offset(, -1).Value, 1) = "X" Then
                  Cot = Switch(Kho = "TC", 12, Kho = "CK", 13, Kho = "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
 

File đính kèm

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:
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:
Dữ liệu không chuyển kho vào các kho chi tiet ạ(2).
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é (1).

(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.
 
Mã kho là trường "Kho NX" như XBN, CRO,BID..
N-MUA (trường loại CT) chuyển vào kho MUA (trường kho NX).
N-CK và X-CK chuyển vào các kho theo mã "kho NX"

Vậy một số dòng tại trường [Kho XN] còn trống mà bên trường [Loai CT] là có mã kho, như N-TH thì nhập số lượng vô trường TH?
Thường thì CSDL không nên có ô nào trống dữ liệu cả.

(Nếu bạn chưa nhập kịp, thì mình sẽ viết macro nhập dùm bạn tử [Loai CT] cho bạn, Bạn có đồng í không?

Chờ tin bạn! --=0 :-= --=0
 
Oh.Vậy thì tốt quá. Mình để trống vì nó chính là ký hiệu tên "kho NX" VD: "239" nếu là kho sử dụng. Vì mình có nhiều kho (mỗi công trình là 1 kho). Cảm ơn bạn trước nha.
 
Macro của bạn đây, xin mời

Oh.Vậy thì tốt quá. Mình để trống vì nó chính là ký hiệu tên "kho NX" VD: "239" nếu là kho sử dụng. Vì mình có nhiều kho (mỗi công trình là 1 kho). Cảm ơn bạn trước nha.
PHP:
Option Explicit
Sub Nhap_MaKho_Tu_LoaiCT()
 Dim Rng As Range, sRng As Range, MyAdd As String
  
 Sheets("NKNX").Select
 Set Rng = Range([O7], [O65500].End(xlUp))
 Set sRng = Rng.Find("", , xlFormulas, xlWhole)
 If Not sRng Is Nothing Then
   MyAdd = sRng.Address
   Do
      With Cells(sRng.Row, "G")
         .Interior.ColorIndex = 38 'To Màu Tím Nhat De Phan Biet'
         sRng.Value = Right(.Value, 2)
      End With
      Set sRng = Rng.FindNext(sRng)
   Loop While Not sRng Is Nothing And sRng.Address <> MyAdd
 End If
End Sub
 
Lọc DL đã tổng hợp theo tháng/ chuyển CT sang VBA

Cảm ơn bạn!Nhưng vấn đề chính của mình vẫn chưa có kết quả. Các bạn giúp giùm nha.
 
Mình dám thách đố mọi người làm được macro, nếu không đủ dữ liệu của trường [Kho NX]!

Cảm ơn bạn! Nhưng vấn đề chính của mình vẫn chưa có kết quả. Các bạn giúp giùm nha.
Mà vẫn còn 2 vấn đề nhỏ cần dứt điểm nữa:

(1): khối lượng của các dòng mà [Kho XN] = "CRO" cho vô cột nào trong bảng 'Báo cáo' đây?

(2) Tương tự 'KHA' có phải cho vô cột 'KH' tương ứng với xuất hay nhập chăng?
Mà tại sao không là KH mà lại là 'KHA' để cả công thức & VBA đều sẽ lặt lè vậy Trời?

(Bạn biết rồi đó: Với VBA là sai 1 li, đi > một dậm luôn!)
 
Lọc DL đã tổng hợp theo tháng/chuyển CT-VBA

(1): khối lượng của các dòng mà [Kho XN] = "CRO" cho vô cột nào trong bảng 'Báo cáo' đây?
Không biết mình hiểu thế này có đúng không. Trước đây mình để kho XN trống - nay đã đưa DL kho vào rồi. Vì kho CRO đây là kho thực hiện, khi nhập xuất cho các kho khác thì lấy theo 3 điều kiện( tháng cần báo cáo, mã hàng PS nhập xuất tồn trong tháng và kho NX) là đương nhiên (Có hiện thị trong BC các trường kho khác mà không có trường tên kho bản thân nó. Do nó được mặc định và nghiệp vụ phát sinh là trong nội bộ của kho CRO (VD: N-TH,N-KH, X-TC,X-TA,X-NB,X-KH) nghĩa là vẫn đáp ứng 3ĐK nhưng ĐK mã kho là mặc định.
(2) Tương tự 'KHA' có phải cho vô cột 'KH' tương ứng với xuất hay nhập chăng?
Mà tại sao không là KH mà lại là 'KHA' để cả công thức & VBA đều sẽ lặt lè vậy Trời?
Đúng rồi. Vì mình để Mã kho = 3ký tự nên để vậy thôii.Chứ có thể thay đổi thành KH cũng không có vần đề gì.
 
Không biết mình hiểu thế này có đúng không. Trước đây mình để kho XN trống - nay đã đưa DL kho vào rồi. Vì kho CRO đây là kho thực hiện, khi nhập xuất cho các kho khác thì lấy theo 3 điều kiện( tháng cần báo cáo, mã hàng PS nhập xuất tồn trong tháng và kho NX) là đương nhiên (Có hiện thị trong BC các trường kho khác mà không có trường tên kho bản thân nó. Do nó được mặc định và nghiệp vụ phát sinh là trong nội bộ của kho CRO (VD: N-TH,N-KH, X-TC,X-TA,X-NB,X-KH) nghĩa là vẫn đáp ứng 3ĐK nhưng ĐK mã kho là mặc định.
Sau khi lấy dữ liệu mới nhất của bạn, sửa lại macro & cho chạy để tổng hợp XNT tháng 05 (là tháng có nhiều records nhất.) thì sau công đoạn lọc dữ liệu tháng 05 & xếp theo chiều tăng của mã hàng & [Kho XN] thì kết quả tại trang 'NKNX' được mình trích ra như kết quả dưới đây

|W|X|Y|Z|AA|AB|
7 | LoaiCT | MaHang | Ten HH | DVT | SoLg | Kho NX |
||||..|||
53 |N-MU|DC0013|Clê tròng 17|cái|1.0|TH|
54 |N-CK|DC0013|Clê tròng 17|cái|1.0|CRO|
||||..|||
79 |X-TC|DC0060|Thước thép 3 m|cái|1.0|TC|
80 |X-CK|DC0063|Dao bay xây|cái|1.0|CRO|
||||..|||
Vậy bạn nói rõ xem số lượng hàng tại các dòng 54 & 80 sẽ nhập vô cột nào trong bảng 'BC ChiTiet'
 
Lọc DL đã tổng hợp theo tháng/chuyển CT-VBA

Thành thật xin lỗi bạn. Mình có chút hiểu lầm ở đây.
Dữ liệu đúng, đủ theo file đính kèm.
Mình giải thích thêm (theo DL gửi): VD:Kho CRO- màu vàng trong "NKNX" là kho thực hiện. Nó chỉ được phép thực hiện các nghiệp vụ nhập - xuất kho như sau:
Nhập: N-MUA nhập mua mặc định là từ kho MUA, N-CK chỉ từ các kho khác như 239, BID..(có tên trường trong BC).
Kho thực hiện (CRO) không được N-CK cho chính nó, chỉ được N-TH (nhập thu hồi) từ bản thân nó là kho CRO (màu vàng).
Xuất: X-TC, X-TA, X-NB mặc định xuất cho bản thân nó là kho (CRO - kho thực hiện), X-CK chỉ đến các kho khác - không xuất X-CK cho chính nó.
Vì các nghiệp vụ này liên quan đến tính tiền vật tư thi công và thu hồi vật tư sử dụng. Do đó mình phân chia ri6ng biệt như vậy. Bạn thông cảm và giúp giùm mình nhé. Mong tin bạn
 
Lần chỉnh sửa cuối:
Thật là mệt với bạn quá đi thôi

PHP:
Option Explicit:                                   Dim Rng As Range
Private Sub Worksheet_Change(ByVal Target As Range)
 Dim Sh As Worksheet
 Dim Thang As Boolean:                             Dim eRw As Long
 
 Sheets("BC Chi Tiet").Select:                     Application.ScreenUpdating = False
 If Not Intersect(Target, [V1]) Is Nothing Then
   If Target.Value = "All" Then
      Set Sh = Sheets("DM"):                       eRw = Sh.[B65500].End(xlUp).Row + 9
      [B11].Resize(eRw, 26).ClearContents
      [B11].Resize(eRw, 3).Value = Sh.[b4].Resize(eRw, 3).Value
      Set Sh = Sheets("NKNX")
      Set Rng = Sh.Range(Sh.[H7], Sh.[H65500].End(xlUp))       '*'
   Else
      Set Sh = Sheets("NKNX"):                     eRw = Sh.[B65500].End(xlUp).Row
      Sh.Range("G7:R" & eRw).AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Sh.Range( _
         "W2:W3"), CopyToRange:=Sh.Range("W7:AB7")
         
      If Sh.[W65500].End(xlUp).Row = 7 Then
         MsgBox "Thang Nay Chua Có Du Lieu":    Exit Sub
      End If
      Sh.Range("X7:X" & eRw).AdvancedFilter Action:=2, CopyToRange:=Sh.[AD7], Unique:=True
      Range("B11:X" & eRw).ClearContents
      Sh.Range(Sh.[AD8], Sh.[AD65500].End(xlUp)).Copy Destination:=[B11]
      
      Set Rng = Sh.Range(Sh.[X7], Sh.[X7].End(xlDown))         '*'
      Thang = True
   End If
   GPE_COM Thang
 End If
End Sub

PHP:
Sub GPE_COM(Thang As Boolean)
 On Error Resume Next
 Dim sRng As Range, Clls As Range
 Dim Sht As Worksheet, Rng0 As Range, sRng0 As Range
 Dim MyAdd As String, Kho As String, Cot As Byte
 
 For Each Clls In Range([B11], [B11].End(xlDown))
   Set sRng = Rng.Find(Clls.Value, , xlFormulas, xlWhole)
   If Not sRng Is Nothing Then
      MyAdd = sRng.Address
      Do
         Kho = sRng.Offset(, IIf(Thang, 4, 7)).Value
         If Left(sRng.Offset(, -1).Value, 1) = "N" Then
            Cot = Switch(Kho = "MUA", 4, Kho = "XBN", 5, Kho = "BID", 6, Kho = "239", 7, _
               Kho = "VP", 8, Kho = "TH", 9, Kho = "KHA", 10)
         ElseIf Left(sRng.Offset(, -1).Value, 1) = "X" Then
            Cot = Switch(Kho = "TC", 12, Kho = "XBN", 13, Kho = "BID", 14, _
               Kho = "239", 15, Kho = "VP", 16, Kho = "TA", 17, Kho = "KHA", 18)
         End If
         With Clls.Offset(, Cot)
            .Value = .Value + sRng.Offset(, 3).Value
         End With
         If Thang Then
            If Clls.Offset(, 1).Value = "" Then _
               Clls.Offset(, 1).Resize(, 2).Value = sRng.Offset(, 1).Resize(, 2).Value
            
            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 + [V1].Value).Value
               sRng0.Offset(, 11 + [V1].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
 

File đính kèm

Lọc DL đã tổng hợp theo tháng

DL chạy thử cho các kho theo đúng mong muốn. Nhưng còn vài vấn đề Bạn hoàn thiện giúp mình nhé.
(1) Như vậy phải đặt mã kho khác nhau cho kho CRO để DL chuyển vào các trường N-TH, X-TC, X-NB, X-TA mặc dù nó là nghiệp vụ NX nội bộ trong 1 kho (CRO).
(2) Lựa chọn tháng BC = All thì DL không cộng tất cả nhập - xuất của các tháng với nhau mặc dù cùng mã hàng-tên hàng.
(3) Lựa chọn tháng BC = tháng chưa có DL thì không báo "DL chưa có" mà lại lấy DL từ tháng gấn nhất (theo VD là tháng 5).
(4) Mình muốn copy Code sang 1 file khác hoàn thiện hơn để áp dụng thì nó lại không hoạt động. hic..
 
DL chạy thử cho các kho theo đúng mong muốn. Nhưng còn vài vấn đề Bạn hoàn thiện giúp mình nhé.
(1) Như vậy phải đặt mã kho khác nhau cho kho CRO để DL chuyển vào các trường N-TH, X-TC, X-NB, X-TA mặc dù nó là nghiệp vụ NX nội bộ trong 1 kho (CRO).
(2) Lựa chọn tháng BC = All thì DL không cộng tất cả nhập - xuất của các tháng với nhau mặc dù cùng mã hàng-tên hàng.
(3) Lựa chọn tháng BC = tháng chưa có DL thì không báo "DL chưa có" mà lại lấy DL từ tháng gấn nhất (theo VD là tháng 5).
(4) Mình muốn copy Code sang 1 file khác hoàn thiện hơn để áp dụng thì nó lại không hoạt động. hic..

(1) Bạn muốn sẽ như thế nào, phân biệt mã kho NTN?

(2) Bạn thử sức trước xem sao!

(3) Bạn lấy file đính kèm thử, sẽ báo khi không có dữ liệu;

(4) Bạn cần biết rằng trong VBA cũng như trong trang tính, phương thức Advanced Filter có yêu cầu nghiêm ngặt về tiêu đề trường chút đỉnh (Như tiêu đề trường không có chấp nhận các ô trộn & nói thêm cho bạn biết: Trong VBA CSDL lá CSDL không cần những trang trí diêm dúa lằng nhằng; Nhưng cái này thực thi bên trang báo cáo);
Bạn xem thêm trong trang tính 'NKNX' kỹ lưỡng sẽ thấy 1 số ô mà macro sử dụng Hay bạn phải đọc được hết nội dung các dòng lệnh thì mới mong chép sang file khác để ứng dụng & phát triển.
Thân ái!
 
Lọc dữ liệu đã tổng hợp theo tháng

(1) Bạn muốn sẽ như thế nào, phân biệt mã kho NTN?
Vấn đề này mình xử lý thủ công thôi. Các hình thức NX đó cho vào các kho khác nhau như CR1, CR2, CR3.. là OK thôi, chỉnh sửa trong VBA một chút là được.
(2) Lựa chọn thnág BC=ALL thì cộng tất cả số liệu NX các tháng của 1 mã vật tư.
Mình không biết làm VBA, nhưng = công thức thì xử lý OK.(sumif)
(3) Bạn lấy file đính kèm thử, sẽ báo khi không có dữ liệu;
Mình đã kiểm tra lại khi tháng BC = " " thì mới báo "Không có DL"
 
(1) Bạn muốn sẽ như thế nào, phân biệt mã kho NTN?
Vấn đề này mình xử lý thủ công thôi. Các hình thức NX đó cho vào các kho khác nhau như CR1, CR2, CR3.. là OK thôi, chỉnh sửa trong VBA một chút là được.
Vậy bạn thêm như thế nào thì viết ra đi
(2) Lựa chọn thnág BC=ALL thì cộng tất cả số liệu NX các tháng của 1 mã vật tư.
Mình không biết làm VBA, nhưng = công thức thì xử lý OK.(sumif)
Bạn chép 3 dòng lệnh này vô bộ nhớ trung gian:
PHP:
            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]"
& đem chép xuống dưới, tại vị trí trước dòng lệnh

Mã:
Set sRng = Rng.FindNext(sRng)
& sửa lại như sau:

PHP:
            Cells(Clls.Row, "M").FormulaR1C1 = "=SUM(RC[-7]:RC[-1])"
            Cells(Clls.Row, "V").FormulaR1C1 = "=SUM(RC[-8]:RC[-1])"
            Cells(Clls.Row, "W").FormulaR1C1 = "=RC[-18]+RC[-10]-RC[-1]"
         
         Set sRng = Rng.FindNext(sRng)
(Lí do phải sửa vì: Bạn mới thêm trường 'NB' vô cột 'S' nên phải sửa lại tọa độ tính tổng & hiệu - Xem thêm trong trang tính này)
Sau đó vô hiệu hóa 3 dòng lệnh cũ đi (Bằng cách thêm dấu nháy đơn vô đầu dòng lệnh
(3) Mình đã kiểm tra lại khi tháng BC = " " thì mới báo "Không có DL"
Việc này mình sẽ xem lại
 
Lọc DL tổng hợp theo tháng

(1)Các DL trong "NKNX" tương ứng với mỗi loại CT đều có kho NX riêng nên DL chạy đúng vào các kho trên báo cáo như:
- Nhập: N-MU vào kho MUA, N-CK vào kho XBN, kho 239, kho BID, N-KH vào kho KHA. Riêng N-TH là của chính kho thực hiện là CRO nên lấy luôn N-TH vào kho CO.
- Xuất: X-CK vào các kho cụ thể 239, XBN, BID, X-KH vào kho KHA. Riêng các trường hợp X-TA, X-TC, X-NB là xuất trong kho thực hiện và DL đang chuyển vào kho CRO. Khi chạy Code các DL chuyển hết vào mọt trường. Vậy ta phải chỉnh lại DL như sau. Tự ngầm định cho các loại CT xuất cho kho CRO = X-TC vào kho CR1, X-NB vào kho CR2, kho X-TA vào kho CR3 (hiểu như là kho con của kho thực hiện "CRO"). Thì Dl sẽ chạy đúng theo yêu cầu.
Code cũ:
If Left(sRng.Offset(, -1).Value, 1) = "N" Then
Cot = Switch(Kho = "MUA", 4, Kho = "XBN", 5, Kho = "BID", 6, Kho = "239", 7, _
Kho = "VP", 8, Kho = "TH", 9, Kho = "KHA", 10)
ElseIf Left(sRng.Offset(, -1).Value, 1) = "X" Then
Cot = Switch(Kho = "TC", 12, Kho = "XBN", 13, Kho = "BID", 14, _
Kho = "239", 15, Kho = "VP", 16, Kho = "NB", 17, Kho = "TA", 18, Kho = "KHA", 19)
Code mới:
If Left(sRng.Offset(, -1).Value, 1) = "N" Then
Cot = Switch(Kho = "MUA", 4, Kho = "XBN", 5, Kho = "BID", 6, Kho = "239", 7, _
Kho = "VP", 8, Kho = "CRO", 9, Kho = "KHA", 10)
ElseIf Left(sRng.Offset(, -1).Value, 1) = "X" Then
Cot = Switch(Kho = "CR1", 12, Kho = "XBN", 13, Kho = "BID", 14, _
Kho = "239", 15, Kho = "VP", 16, Kho = "CR2", 17, Kho = "CR3", 18, Kho = "KHA", 19)
End If
(2) Hơn nữa mình muốn thêm bên "DM" ở tồn cuối các tháng một cột DL nhập tay số lượng tồn kho đầu tiên. Khi chọn tháng BC=ALL thì copy số liệu tồn ở cột mới này vào trường Dư đầu kỳ của BC. Bạn xem giùm luôn nhé.
 
Chỉnh sửa lần cuối bởi điều hành viên:
(3) Bạn lấy file đính kèm thử, sẽ báo khi không có dữ liệu;
Mình đã kiểm tra lại khi tháng BC = " " thì mới báo "Không có DL"

(2) Hơn nữa mình muốn thêm bên "DM" ở tồn cuối các tháng một cột DL nhập tay số lượng tồn kho đầu tiên. Khi chọn tháng BC=ALL thì copy số liệu tồn ở cột mới này vào trường Dư đầu kỳ của BC. Bạn xem giùm luôn nhé.

(3) Đúng là do còn thiếu sót ở khâu sửa thiết kế:

Cách khắc phục như sau:
Bạn đến trang 'NKNX', bỏ trộn các ô 'R6:R7'; Sau đó chép nội dung 'R6' đến 'R7' là được như í.

(2) Bạn chép lưu tồn cả năm tại cột 'M' của 'DM' & thêm dòng lệnh ni :
PHP:
[E11].Resize(eRw).Value = Sh.[M4].Resize(eRw).Value
Vô sau dòng lệnh:
Mã:
[B][COLOR=Silver][B11].Resize(eRw, 3).Value = Sh.[b4].Resize(eRw, 3).Value[/COLOR][/B]
trong macro Worksheet_Change nha.

(Có thể thử bằng cách nhập từ M3:M99 chuỗi số tăng dần & cho chạy macro sau khi đã bổ sung dòng lệnh

(*) Việc chép lưu tồn cả năm cũng có thể tự động hóa sau khi dữ liệu đã có đến hết năm (đủ 12 tháng)
Chuyện này chúng ta bàn sau

Xin hỏi bạn vấn đề (1) bạn tự làm được rồi, chưa? Xin chúc mừng sự thành công trên bước đường chinh phục VBA của bạn; Thân ái!
 
Bài này mình đưa thêm giải pháp dùng hàm không đến nỗi chậm, các bác cho ý kiến!
có gì không tốt để em gỡ file cho đỡ tốn tài nguyên.
 
Lần chỉnh sửa cuối:
hic, đệ tải về máy khôn lọc được, đệ sử dụng office 2007
 

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

Back
Top Bottom