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

Liên hệ QC
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

  • GPE.rar
    345.8 KB · Đọc: 195
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
 
Web KT
Back
Top Bottom