(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.
Dạ. 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"
(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.
Dạ. 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"
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"
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.
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
Mà vẫn còn 2 vấn đề nhỏ cần dứt điểm nữa: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.
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 đâyKhô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.
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
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
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..
Vậy bạn thêm như thế nào thì viết ra đi(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.
Bạn chép 3 dòng lệnh này vô bộ nhớ trung gian:(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)
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]"
Set sRng = Rng.FindNext(sRng)
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)
Việc này mình sẽ xem lại(3) Mình đã kiểm tra lại khi tháng BC = " " thì mới báo "Không có DL"
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 = "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)
(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é.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
(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é.
[E11].Resize(eRw).Value = Sh.[M4].Resize(eRw).Value
[B][COLOR=Silver][B11].Resize(eRw, 3).Value = Sh.[b4].Resize(eRw, 3).Value[/COLOR][/B]
DIỄN ĐÀN GIẢI PHÁP EXCEL Group 1
DIỄN ĐÀN GIẢI PHÁP EXCEL Group 2