Xin trợ giúp sửa code cho báo cáo lưu kho.

Liên hệ QC

Congky74

Thành viên mới
Tham gia
25/10/18
Bài viết
43
Được thích
5
Kính gửi: Các Anh chị.
Em có file báo cáo tồn kho đã có code sẵn. nhưng bị sai về thời gian lưu kho. nhờ anh chị sửa giúp em tại Sheet BCCT về code cách tính thời gian lưu kho tại cột F.
( cách tính sửa lại như sau: Căn cứ vào kỳ báo cáo ô E2 của sheet BCCT và so sánh với với cột A của sheet Nhaplieu. Nếu có phát sinh nhập (cột H) thì lấy ô E2 trừ đi ngày phát sinh cuối (cột A) của mã vật liệu đó để tính số ngày lưu kho trong kỳ) rồi mới cộng với thời gian lưu kho tồn đầu kỳ tại cột M của sheet DMVT.
Trong file em ví dụ có 2 mã nguyên vật liệu phát sinh. và mong muốn tính thời gian lưu kho.
Cảm ơn mọi người ạ!
 

File đính kèm

  • tinh trang hang hoa.xlsm
    44.2 KB · Đọc: 11
Kính gửi: Các Anh chị.
Em có file báo cáo tồn kho đã có code sẵn. nhưng bị sai về thời gian lưu kho. nhờ anh chị sửa giúp em tại Sheet BCCT về code cách tính thời gian lưu kho tại cột F.
( cách tính sửa lại như sau: Căn cứ vào kỳ báo cáo ô E2 của sheet BCCT và so sánh với với cột A của sheet Nhaplieu. Nếu có phát sinh nhập (cột H) thì lấy ô E2 trừ đi ngày phát sinh cuối (cột A) của mã vật liệu đó để tính số ngày lưu kho trong kỳ) rồi mới cộng với thời gian lưu kho tồn đầu kỳ tại cột M của sheet DMVT.
Trong file em ví dụ có 2 mã nguyên vật liệu phát sinh. và mong muốn tính thời gian lưu kho.
Cảm ơn mọi người ạ!
Bạn xem file đính kèm. và test thật kỹ, hy vọng đúng ý (vẫn code của bạn tôi sửa lại chút ít thôi mà)
Theo tôi thì từ 1/9/2021 đến 1/12/2021 chỉ được tính là 3 tháng.
 

File đính kèm

  • tinh trang hang hoa.xlsm
    46.2 KB · Đọc: 3
Upvote 0
Bạn xem file đính kèm. và test thật kỹ, hy vọng đúng ý (vẫn code của bạn tôi sửa lại chút ít thôi mà)
Theo tôi thì từ 1/9/2021 đến 1/12/2021 chỉ được tính là 3 tháng.
Cảm ơn bạn đã quan tâm và giúp mình.
bạn có thể điều chỉnh lại giúp mình được không. vì nếu ngày báo cáo E2 nhỏ hơn ngày trong phát sinh nhập thì nó bị âm lưu kho. (vd mình để ngày ngày E2= 01/01/2021 thì nó bị âm)
Mình muốn lấy mốc E2 để báo cáo lùi thì thời gian lưu kho sẽ lấy ngày nhập nhỏ hơn ngày báo cáo ấy.
Mình gửi lại file.
 

File đính kèm

  • tinh trang hang hoa.xlsm
    44.6 KB · Đọc: 5
Upvote 0
Cảm ơn bạn đã quan tâm và giúp mình.
bạn có thể điều chỉnh lại giúp mình được không. vì nếu ngày báo cáo E2 nhỏ hơn ngày trong phát sinh nhập thì nó bị âm lưu kho. (vd mình để ngày ngày E2= 01/01/2021 thì nó bị âm)
Mình muốn lấy mốc E2 để báo cáo lùi thì thời gian lưu kho sẽ lấy ngày nhập nhỏ hơn ngày báo cáo ấy.
Mình gửi lại file.

Code sau sẽ khắc phục được tình trạng Thời gian lưu kho không âm (chỉ đơn giản là xét thời gian nhập của mã hàng được nhập nếu > thời điểm báo cáo thì không tính và = rỗng)
Mã:
Public Sub Up_BCCT()
Dim Dic As Object, eArr(), sArr(), dArr(), Tmp, I As Long, J As Long, K As Long, Tem As String
Dim fDate As Date, eDate As Date, Rws As Long, LuuKho&, LuuKhoT As Long
Dim Sh As Worksheet

Set Sh = Sheets("BCCT")
fDate = [C2].Value: eDate = [E2].Value
LuuKho = DateDiff("m", fDate, eDate)

Set Dic = CreateObject("Scripting.Dictionary")
With Sheets("DMVT")
    eArr = .Range(.[b6], .[b6].End(xlDown)).Resize(, 12).Value
End With
ReDim dArr(1 To UBound(eArr, 1), 1 To 25)
For I = 1 To UBound(eArr, 1)
    Tem = eArr(I, 1) & "|" & eArr(I, 4)
    If Not Dic.Exists(Tem) Then
        K = K + 1
        Dic.Add Tem, K
        dArr(K, 1) = K
        For J = 1 To 4
            dArr(K, J + 1) = eArr(I, J)
        Next J
        dArr(K, 6) = eArr(I, 12) + LuuKho
        dArr(K, 7) = eArr(I, 9)
        For J = 5 To 8
            dArr(K, J + 3) = eArr(I, J)
        Next J
        dArr(K, 24) = eArr(I, 10) & "-" & eArr(I, 11)
    End If
Next I

With Sheets("Nhaplieu")
    sArr = .Range(.[A7], .[A7].End(xlDown)).Resize(, 15).Value
End With
For I = 1 To UBound(sArr, 1)
    Tem = sArr(I, 4) & "|" & sArr(I, 13)
    If Dic.Exists(Tem) Then
        Rws = Dic.Item(Tem)
        If sArr(I, 8) <> Empty Then
            efdate = sArr(I, 1)
            If efdate < eDate Then
                LuuKhoT = DateDiff("m", efdate, eDate)
                dArr(Rws, 6) = LuuKhoT + eArr(Dic.Item(Tem), 12)
            Else
                dArr(Rws, 6) = ""
            End If
        End If
        If sArr(I, 1) < fDate Then
            dArr(Rws, 8) = dArr(Rws, 8) + sArr(I, 8) - sArr(I, 9)
            If sArr(I, 14) = "OK" Then
                dArr(Rws, 9) = dArr(Rws, 9) + sArr(I, 8) - sArr(I, 9)
            ElseIf sArr(I, 14) = "NG" Then
                dArr(Rws, 10) = dArr(Rws, 10) + sArr(I, 8) - sArr(I, 9)
            ElseIf sArr(I, 14) = "QA" Then
                dArr(Rws, 11) = dArr(Rws, 11) + sArr(I, 8) - sArr(I, 9)
            End If
        ElseIf sArr(I, 1) <= eDate Then
            dArr(Rws, 12) = dArr(Rws, 12) + sArr(I, 8)
            dArr(Rws, 16) = dArr(Rws, 16) + sArr(I, 9)
            If sArr(I, 14) = "OK" Then
                dArr(Rws, 13) = dArr(Rws, 13) + sArr(I, 8)
                dArr(Rws, 17) = dArr(Rws, 17) + sArr(I, 9)
            ElseIf sArr(I, 14) = "NG" Then
                dArr(Rws, 14) = dArr(Rws, 14) + sArr(I, 8)
                dArr(Rws, 18) = dArr(Rws, 18) + sArr(I, 9)
            ElseIf sArr(I, 14) = "QA" Then
                dArr(Rws, 15) = dArr(Rws, 15) + sArr(I, 8)
                dArr(Rws, 19) = dArr(Rws, 19) + sArr(I, 9)
            End If
        End If
    End If
Next I
For I = 1 To K
    For J = 20 To 23
        dArr(I, J) = dArr(I, J - 12) + dArr(I, J - 8) - dArr(I, J - 4)
    Next J
    If Len(dArr(I, 24)) > 2 Then
        Tmp = Split(dArr(I, 24), "-")
        If dArr(I, 20) < Val(Tmp(0)) Then
            dArr(I, 25) = "Min"
        ElseIf dArr(I, 20) > Val(Tmp(1)) Then
            dArr(I, 25) = "Max"
        End If
    End If
Next I
For I = 1 To K
    If dArr(I, 20) = 0 Then dArr(I, 6) = Empty
Next I
Sh.[A6].Resize(K, 25).ClearContents
Sh.[A6].Resize(K, 25) = dArr
Set Dic = Nothing
End Sub
Nhưng theo tôi thì
Nếu ngày báo cáo nhỏ hơn ngày phát sinh nhập của một loại hàng nào đó có nghĩa là thời điểm báo cáo ấy loại hàng hóa này chưa được nhập vào kho, và cũng chưa có bất cứ hoạt động nào liên quan đến hàng hóa đó.
Do vậy theo tôi thì trong báo cáo chi tiết vật tư (Sh BCCT) không thể hiện sự biến động của loại hàng hóa có thời điểm nhập lớn hơn thời điểm báo cáo.

Do cũng không tìm hiểu xem các trường khác (cột khác ) bạn tính toán thế nào, nên không sửa lại code theo hướng đã nêu trên.
 
Upvote 0
Code sau sẽ khắc phục được tình trạng Thời gian lưu kho không âm (chỉ đơn giản là xét thời gian nhập của mã hàng được nhập nếu > thời điểm báo cáo thì không tính và = rỗng)
Mã:
Public Sub Up_BCCT()
Dim Dic As Object, eArr(), sArr(), dArr(), Tmp, I As Long, J As Long, K As Long, Tem As String
Dim fDate As Date, eDate As Date, Rws As Long, LuuKho&, LuuKhoT As Long
Dim Sh As Worksheet

Set Sh = Sheets("BCCT")
fDate = [C2].Value: eDate = [E2].Value
LuuKho = DateDiff("m", fDate, eDate)

Set Dic = CreateObject("Scripting.Dictionary")
With Sheets("DMVT")
    eArr = .Range(.[b6], .[b6].End(xlDown)).Resize(, 12).Value
End With
ReDim dArr(1 To UBound(eArr, 1), 1 To 25)
For I = 1 To UBound(eArr, 1)
    Tem = eArr(I, 1) & "|" & eArr(I, 4)
    If Not Dic.Exists(Tem) Then
        K = K + 1
        Dic.Add Tem, K
        dArr(K, 1) = K
        For J = 1 To 4
            dArr(K, J + 1) = eArr(I, J)
        Next J
        dArr(K, 6) = eArr(I, 12) + LuuKho
        dArr(K, 7) = eArr(I, 9)
        For J = 5 To 8
            dArr(K, J + 3) = eArr(I, J)
        Next J
        dArr(K, 24) = eArr(I, 10) & "-" & eArr(I, 11)
    End If
Next I

With Sheets("Nhaplieu")
    sArr = .Range(.[A7], .[A7].End(xlDown)).Resize(, 15).Value
End With
For I = 1 To UBound(sArr, 1)
    Tem = sArr(I, 4) & "|" & sArr(I, 13)
    If Dic.Exists(Tem) Then
        Rws = Dic.Item(Tem)
        If sArr(I, 8) <> Empty Then
            efdate = sArr(I, 1)
            If efdate < eDate Then
                LuuKhoT = DateDiff("m", efdate, eDate)
                dArr(Rws, 6) = LuuKhoT + eArr(Dic.Item(Tem), 12)
            Else
                dArr(Rws, 6) = ""
            End If
        End If
        If sArr(I, 1) < fDate Then
            dArr(Rws, 8) = dArr(Rws, 8) + sArr(I, 8) - sArr(I, 9)
            If sArr(I, 14) = "OK" Then
                dArr(Rws, 9) = dArr(Rws, 9) + sArr(I, 8) - sArr(I, 9)
            ElseIf sArr(I, 14) = "NG" Then
                dArr(Rws, 10) = dArr(Rws, 10) + sArr(I, 8) - sArr(I, 9)
            ElseIf sArr(I, 14) = "QA" Then
                dArr(Rws, 11) = dArr(Rws, 11) + sArr(I, 8) - sArr(I, 9)
            End If
        ElseIf sArr(I, 1) <= eDate Then
            dArr(Rws, 12) = dArr(Rws, 12) + sArr(I, 8)
            dArr(Rws, 16) = dArr(Rws, 16) + sArr(I, 9)
            If sArr(I, 14) = "OK" Then
                dArr(Rws, 13) = dArr(Rws, 13) + sArr(I, 8)
                dArr(Rws, 17) = dArr(Rws, 17) + sArr(I, 9)
            ElseIf sArr(I, 14) = "NG" Then
                dArr(Rws, 14) = dArr(Rws, 14) + sArr(I, 8)
                dArr(Rws, 18) = dArr(Rws, 18) + sArr(I, 9)
            ElseIf sArr(I, 14) = "QA" Then
                dArr(Rws, 15) = dArr(Rws, 15) + sArr(I, 8)
                dArr(Rws, 19) = dArr(Rws, 19) + sArr(I, 9)
            End If
        End If
    End If
Next I
For I = 1 To K
    For J = 20 To 23
        dArr(I, J) = dArr(I, J - 12) + dArr(I, J - 8) - dArr(I, J - 4)
    Next J
    If Len(dArr(I, 24)) > 2 Then
        Tmp = Split(dArr(I, 24), "-")
        If dArr(I, 20) < Val(Tmp(0)) Then
            dArr(I, 25) = "Min"
        ElseIf dArr(I, 20) > Val(Tmp(1)) Then
            dArr(I, 25) = "Max"
        End If
    End If
Next I
For I = 1 To K
    If dArr(I, 20) = 0 Then dArr(I, 6) = Empty
Next I
Sh.[A6].Resize(K, 25).ClearContents
Sh.[A6].Resize(K, 25) = dArr
Set Dic = Nothing
End Sub
Nhưng theo tôi thì
Nếu ngày báo cáo nhỏ hơn ngày phát sinh nhập của một loại hàng nào đó có nghĩa là thời điểm báo cáo ấy loại hàng hóa này chưa được nhập vào kho, và cũng chưa có bất cứ hoạt động nào liên quan đến hàng hóa đó.
Do vậy theo tôi thì trong báo cáo chi tiết vật tư (Sh BCCT) không thể hiện sự biến động của loại hàng hóa có thời điểm nhập lớn hơn thời điểm báo cáo.

Do cũng không tìm hiểu xem các trường khác (cột khác ) bạn tính toán thế nào, nên không sửa lại code theo hướng đã nêu trên.
Cảm ơn bạn rất nhiều.
 
Upvote 0
Web KT

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

Back
Top Bottom