Cách sử dụng Code tính giá FIFO (7 người xem)

  • Thread starter Thread starter Thulib
  • Ngày gửi Ngày gửi
Liên hệ QC

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

Thulib

Thành viên mới
Tham gia
15/10/19
Bài viết
16
Được thích
1
Xin chào mọi người,
Hiện em đang có một đoạn code cách tính giá Xuất theo FIFO. Mong mọi người giúp e giải thích cách chạy của đoạn code, và nếu như dữ liệu tách riêng Giữa nhập và xuất thì đoạn code sẽ thay đổi như thế nào ạ. Em cảm ơn.
Em xin gửi file đính kèm
 

File đính kèm

Xin chào mọi người,
Hiện em đang có một đoạn code cách tính giá Xuất theo FIFO. Mong mọi người giúp e giải thích cách chạy của đoạn code, và nếu như dữ liệu tách riêng Giữa nhập và xuất thì đoạn code sẽ thay đổi như thế nào ạ. Em cảm ơn.
Em xin gửi file đính kèm
Không thành viên nào giải thích code của thành viên khác
Tại sao dữ liệu ngày tháng nhảy lung tung? Đưa file theo đúng chuẩn mực kế toán mình sẽ viết code
 
Em đang làm dữ liệu năm 2019, bên sheet NHAP có dữ liệu năm 2018 là giá trị tồn cuối kì ( làm thành đầu kí năm 2019). Trong tháng 1 có những lô hàng nhập thêm. Sang sheet XUAT ở phần Doanh thu là số liệu xuất bán trong kì với đơn giá bán. Ở phần giá vốn e đang cần tính giá Xuất kho theo phương pháp FIFO ( nhập trước xuất trước).
Bài đã được tự động gộp:

Không dữ liệu xuất năm 2018 làm sao biết hàng nhập nào đã xuất !$@!!
Em đang làm dữ liệu năm 2019, bên sheet NHAP có dữ liệu năm 2018 là giá trị tồn cuối kì ( làm thành đầu kí năm 2019). Trong tháng 1 có những lô hàng nhập thêm. Sang sheet XUAT ở phần Doanh thu là số liệu xuất bán trong kì với đơn giá bán. Ở phần giá vốn e đang cần tính giá Xuất kho theo phương pháp FIFO ( nhập trước xuất trước).
 
Em đang làm dữ liệu năm 2019, bên sheet NHAP có dữ liệu năm 2018 là giá trị tồn cuối kì ( làm thành đầu kí năm 2019). Trong tháng 1 có những lô hàng nhập thêm. Sang sheet XUAT ở phần Doanh thu là số liệu xuất bán trong kì với đơn giá bán. Ở phần giá vốn e đang cần tính giá Xuất kho theo phương pháp FIFO ( nhập trước xuất trước).
Bài đã được tự động gộp:


Em đang làm dữ liệu năm 2019, bên sheet NHAP có dữ liệu năm 2018 là giá trị tồn cuối kì ( làm thành đầu kí năm 2019). Trong tháng 1 có những lô hàng nhập thêm. Sang sheet XUAT ở phần Doanh thu là số liệu xuất bán trong kì với đơn giá bán. Ở phần giá vốn e đang cần tính giá Xuất kho theo phương pháp FIFO ( nhập trước xuất trước).
Tồn cuối 2018 nằm ở chổ nào?
 
Tồn cuối 2018 nằm ở chổ nào?
Trong sheet NHAP số liệu năm 2018 là tồn cuối, cột ngày thể hiện thời gian nhập hàng của mặt hàng đó thôi, đến tại thời điểm năm 2019: ví dụ mặt hàng CAI-02 : Tồn cuối năm 2018 còn 3.823cái với đơn giá nhập 2.300đ của lô hàng nhập ngày 28/11/2018, đến 27/01/2019 nhập thêm 10.000 cái với đơn giá 2.380
1575088770361.png
 
Trong sheet NHAP số liệu năm 2018 là tồn cuối, cột ngày thể hiện thời gian nhập hàng của mặt hàng đó thôi, đến tại thời điểm năm 2019: ví dụ mặt hàng CAI-02 : Tồn cuối năm 2018 còn 3.823cái với đơn giá nhập 2.300đ của lô hàng nhập ngày 28/11/2018, đến 27/01/2019 nhập thêm 10.000 cái với đơn giá 2.380
View attachment 229240
Code không cho phép tồn kho âm, nếu cho phép tồn kho âm thì bỏ dòng lệnh
If aNhap(r, 1) > Ngay Then Exit For 'Ton kho khong "Am"
Một số trường hợp không có hàng tồn kho để xuất nên kết quả tạm thời thêm cột "Số lượng chưa xuất"
Mã:
Sub FIFO()
  Dim aNhap(), aXuat(), Arr(), Res()
  Dim srNhap&, srXuat&, i&, eRow&, Rk&
  Dim Ngay As Date, MaSP$, iTest As Boolean
  With Sheets("NHAP")
    eRow = .Range("A" & Rows.Count).End(xlUp).Row
    Arr = .Range("A4:H" & eRow).Value
    .Range("A4:H" & eRow).Sort .[C4], 1, .[A4], , 1, Header:=xlNo
    aNhap = .Range("A4:H" & eRow).Value
    .Range("A4:H" & eRow).Value = Arr
  End With
  srNhap = UBound(aNhap)
  With Sheets("XUAT")
    eRow = .Range("A" & Rows.Count).End(xlUp).Row
    .Range("I5:K" & eRow).ClearContents
    .Range("L5").Value = 1
    .Range("L5:L" & eRow).DataSeries
    .Range("A5:L" & eRow).Sort .[C5], 1, .[A5], , 1, Header:=xlNo
    aXuat = .Range("A5:F" & eRow).Value
  End With
  srXuat = UBound(aXuat)
  ReDim Res(1 To srXuat, 1 To 3)

  Rk = 1
  For i = 1 To srXuat
    MaSP = aXuat(i, 3)
    Ngay = aXuat(i, 1)
    Res(i, 3) = aXuat(i, 6)
    iTest = False
    For r = Rk To srNhap
      If aNhap(r, 3) = MaSP Then
        If aNhap(r, 1) > Ngay Then Exit For 'Ton kho khong "Am"
        iTest = True
        If aNhap(r, 6) > Res(i, 3) Then
          aNhap(r, 6) = aNhap(r, 6) - Res(i, 3)
          Res(i, 2) = Res(i, 2) + aNhap(r, 7) * Res(i, 3)
          Res(i, 3) = 0
          Exit For
        ElseIf aNhap(r, 6) > 0 Then
          Res(i, 2) = Res(i, 2) + aNhap(r, 6) * aNhap(r, 7)
          Res(i, 3) = Res(i, 3) - aNhap(r, 6)
          aNhap(r, 6) = 0
          Rk = r
          If Res(i, 3) = 0 Then Exit For
        End If
      Else
        If iTest = True Then Exit For
      End If
    Next r
  Next i
  For i = 1 To srXuat
    If Res(i, 2) > 0 Then Res(i, 1) = Round(Res(i, 2) / (aXuat(i, 6) - Res(i, 3)), 2)
    If Res(i, 3) = 0 Then Res(i, 3) = Empty
  Next i
  With Sheets("XUAT")
    .Range("I5").Resize(srXuat, 3) = Res 'Them cot so luong chua xuat duoc
    '.Range("I5").Resize(srXuat, 2) = Res
    .Range("A5:L" & eRow).Sort .[L5], 1, Header:=xlNo
    .Range("L5:L" & eRow).ClearContents
  End With
End Sub
 

File đính kèm

Code không cho phép tồn kho âm, nếu cho phép tồn kho âm thì bỏ dòng lệnh
If aNhap(r, 1) > Ngay Then Exit For 'Ton kho khong "Am"
Một số trường hợp không có hàng tồn kho để xuất nên kết quả tạm thời thêm cột "Số lượng chưa xuất"
Mã:
Sub FIFO()
  Dim aNhap(), aXuat(), Arr(), Res()
  Dim srNhap&, srXuat&, i&, eRow&, Rk&
  Dim Ngay As Date, MaSP$, iTest As Boolean
  With Sheets("NHAP")
    eRow = .Range("A" & Rows.Count).End(xlUp).Row
    Arr = .Range("A4:H" & eRow).Value
    .Range("A4:H" & eRow).Sort .[C4], 1, .[A4], , 1, Header:=xlNo
    aNhap = .Range("A4:H" & eRow).Value
    .Range("A4:H" & eRow).Value = Arr
  End With
  srNhap = UBound(aNhap)
  With Sheets("XUAT")
    eRow = .Range("A" & Rows.Count).End(xlUp).Row
    .Range("I5:K" & eRow).ClearContents
    .Range("L5").Value = 1
    .Range("L5:L" & eRow).DataSeries
    .Range("A5:L" & eRow).Sort .[C5], 1, .[A5], , 1, Header:=xlNo
    aXuat = .Range("A5:F" & eRow).Value
  End With
  srXuat = UBound(aXuat)
  ReDim Res(1 To srXuat, 1 To 3)

  Rk = 1
  For i = 1 To srXuat
    MaSP = aXuat(i, 3)
    Ngay = aXuat(i, 1)
    Res(i, 3) = aXuat(i, 6)
    iTest = False
    For r = Rk To srNhap
      If aNhap(r, 3) = MaSP Then
        If aNhap(r, 1) > Ngay Then Exit For 'Ton kho khong "Am"
        iTest = True
        If aNhap(r, 6) > Res(i, 3) Then
          aNhap(r, 6) = aNhap(r, 6) - Res(i, 3)
          Res(i, 2) = Res(i, 2) + aNhap(r, 7) * Res(i, 3)
          Res(i, 3) = 0
          Exit For
        ElseIf aNhap(r, 6) > 0 Then
          Res(i, 2) = Res(i, 2) + aNhap(r, 6) * aNhap(r, 7)
          Res(i, 3) = Res(i, 3) - aNhap(r, 6)
          aNhap(r, 6) = 0
          Rk = r
          If Res(i, 3) = 0 Then Exit For
        End If
      Else
        If iTest = True Then Exit For
      End If
    Next r
  Next i
  For i = 1 To srXuat
    If Res(i, 2) > 0 Then Res(i, 1) = Round(Res(i, 2) / (aXuat(i, 6) - Res(i, 3)), 2)
    If Res(i, 3) = 0 Then Res(i, 3) = Empty
  Next i
  With Sheets("XUAT")
    .Range("I5").Resize(srXuat, 3) = Res 'Them cot so luong chua xuat duoc
    '.Range("I5").Resize(srXuat, 2) = Res
    .Range("A5:L" & eRow).Sort .[L5], 1, Header:=xlNo
    .Range("L5:L" & eRow).ClearContents
  End With
End Sub
Em đã đọc đoạn code của anh và thật sự em phải nói cảm ơn anh rất nhiều.
Nhân tiện anh có thể hỗ trợ em cách làm sao để tính được tồn kho cuối kì theo phương pháp FIFO (sau khi đã trừ đi số lượng đã xuất trong kì), ví dụ như mặt hàng CAI-02 tổng SL nhập trong kì là 13.823c (28/11/2018 3823c*2300;27/01/2019: 10000c*2380), tổng SL xuất trong kì là 5270, thì tồn cuối kì còn 8553c giá 2.380đ của ngày 27/01/2019.) theo từng mã và ngày ngày được ko ạ?
 
Em đã đọc đoạn code của anh và thật sự em phải nói cảm ơn anh rất nhiều.
Nhân tiện anh có thể hỗ trợ em cách làm sao để tính được tồn kho cuối kì theo phương pháp FIFO (sau khi đã trừ đi số lượng đã xuất trong kì), ví dụ như mặt hàng CAI-02 tổng SL nhập trong kì là 13.823c (28/11/2018 3823c*2300;27/01/2019: 10000c*2380), tổng SL xuất trong kì là 5270, thì tồn cuối kì còn 8553c giá 2.380đ của ngày 27/01/2019.) theo từng mã và ngày ngày được ko ạ?
Bạn gởi file mẫu kết quả với vài ví dụ
 
Bạn gởi file mẫu kết quả với vài ví dụ
Dạ em gửi anh file mẫu e làm, tính tồn cuối cũng giống như bài toán chia kẹo vậy hết túi này mới chuyển sang túi khác.
Ví dụ mã CAI-03 có tất cả 3 lần nhập với tổng SL là 2.327c, trong kì xuất hết 1620c. Thì ở lần thứ 1 kho còn 307c ở lô ngày 10/12/2018 xuất hết 307c thì phải xuất thêm 1313c; qua lô thứ 2 ngày 8/01/2019 có 2.000c đủ để xuất 1313c. Tồn cuối kì của CAI-03 sẽ còn 687c ở lô 08/01/2019 và 20c ở lô 14/01/19.
 

File đính kèm

  • hinh.png
    hinh.png
    14.7 KB · Đọc: 12
  • FIFO.xlsm
    FIFO.xlsm
    164.7 KB · Đọc: 16
Dạ em gửi anh file mẫu e làm, tính tồn cuối cũng giống như bài toán chia kẹo vậy hết túi này mới chuyển sang túi khác.
Ví dụ mã CAI-03 có tất cả 3 lần nhập với tổng SL là 2.327c, trong kì xuất hết 1620c. Thì ở lần thứ 1 kho còn 307c ở lô ngày 10/12/2018 xuất hết 307c thì phải xuất thêm 1313c; qua lô thứ 2 ngày 8/01/2019 có 2.000c đủ để xuất 1313c. Tồn cuối kì của CAI-03 sẽ còn 687c ở lô 08/01/2019 và 20c ở lô 14/01/19.
1/ Kết quả là những cột nào?
2/ Số dòng nhập và xuất khoảng bao nhiêu?
 
1/ Kết quả là những cột nào?
2/ Số dòng nhập và xuất khoảng bao nhiêu?
trong sheet NHAP
1/ Kết quả là những cột nào?
2/ Số dòng nhập và xuất khoảng bao nhiêu?
1/ Trong sheet NHAP, cột Tổng xuất và cột Tồn cuối kì là cột e cần tính, theo điều kiện là Tổng SỐ LƯỢNG mỗi lần xuất không được lớn hơn số lượng của phần nhập trong kì, ví dụ VX-01S tổng xuất trong kì là 1374c, lấy theo FIFO lần 1 chỉ xuát được 950c, lần 2chỉ xuất được 125c, qua lần thứ 3 xuất thêm 299c mới đủ 1374c thì dưng lại.
1575211991585.png
2/ Số dòng nhập trong kì cho mỗi mã hàng khoảng >=20; dòng xuất khoảng 300.
 

File đính kèm

trong sheet NHAP

1/ Trong sheet NHAP, cột Tổng xuất và cột Tồn cuối kì là cột e cần tính, theo điều kiện là Tổng SỐ LƯỢNG mỗi lần xuất không được lớn hơn số lượng của phần nhập trong kì, ví dụ VX-01S tổng xuất trong kì là 1374c, lấy theo FIFO lần 1 chỉ xuát được 950c, lần 2chỉ xuất được 125c, qua lần thứ 3 xuất thêm 299c mới đủ 1374c thì dưng lại.
View attachment 229323
2/ Số dòng nhập trong kì cho mỗi mã hàng khoảng >=20; dòng xuất khoảng 300.
Nhắm mắt làm liều, không xét thời gian :cool:
Mã:
Sub Ton_Nhap()
  Dim aNhap(), aXuat(), Arr(), Res(), Dic As Object
  Dim i&, sRow&, nhap As Double, Ton As Double
  Dim MaSP$, iTest As Boolean
  With Sheets("NHAP")
    aNhap = .Range("C4:H" & .Range("A" & Rows.Count).End(xlUp).Row).Value
  End With
  With Sheets("XUAT")
    aXuat = .Range("C5:F" & .Range("A" & Rows.Count).End(xlUp).Row).Value
  End With
  Set Dic = CreateObject("scripting.dictionary")
  sRow = UBound(aXuat)

  For i = 1 To sRow
    MaSP = aXuat(i, 1)
    Dic.Item(MaSP) = Dic.Item(MaSP) + aXuat(i, 4)
  Next i
  sRow = UBound(aNhap)
  ReDim Res(1 To sRow, 1 To 4)
  For i = 1 To sRow
    MaSP = aNhap(i, 1)
    Ton = Dic.Item(MaSP)
    nhap = aNhap(i, 4)
    If nhap <= Ton Then
      Res(i, 1) = nhap
      Res(i, 2) = 0
      Dic.Item(MaSP) = Ton - nhap
    Else
      Res(i, 1) = Ton
      Res(i, 2) = nhap - Ton
      Dic.Item(MaSP) = 0
    End If
    Res(i, 3) = aNhap(i, 5)
    Res(i, 4) = Res(i, 2) * Res(i, 3)
  Next i
  With Sheets("NHAP")
    .Range("K4").Resize(sRow, 4) = Res
  End With
End Sub
 
Nhắm mắt làm liều, không xét thời gian :cool:
Mã:
Sub Ton_Nhap()
  Dim aNhap(), aXuat(), Arr(), Res(), Dic As Object
  Dim i&, sRow&, nhap As Double, Ton As Double
  Dim MaSP$, iTest As Boolean
  With Sheets("NHAP")
    aNhap = .Range("C4:H" & .Range("A" & Rows.Count).End(xlUp).Row).Value
  End With
  With Sheets("XUAT")
    aXuat = .Range("C5:F" & .Range("A" & Rows.Count).End(xlUp).Row).Value
  End With
  Set Dic = CreateObject("scripting.dictionary")
  sRow = UBound(aXuat)

  For i = 1 To sRow
    MaSP = aXuat(i, 1)
    Dic.Item(MaSP) = Dic.Item(MaSP) + aXuat(i, 4)
  Next i
  sRow = UBound(aNhap)
  ReDim Res(1 To sRow, 1 To 4)
  For i = 1 To sRow
    MaSP = aNhap(i, 1)
    Ton = Dic.Item(MaSP)
    nhap = aNhap(i, 4)
    If nhap <= Ton Then
      Res(i, 1) = nhap
      Res(i, 2) = 0
      Dic.Item(MaSP) = Ton - nhap
    Else
      Res(i, 1) = Ton
      Res(i, 2) = nhap - Ton
      Dic.Item(MaSP) = 0
    End If
    Res(i, 3) = aNhap(i, 5)
    Res(i, 4) = Res(i, 2) * Res(i, 3)
  Next i
  With Sheets("NHAP")
    .Range("K4").Resize(sRow, 4) = Res
  End With
End Sub
Em cảm ơn anh rất nhiều. ^^
 
Nhắm mắt làm liều, không xét thời gian :cool:
Mã:
Sub Ton_Nhap()
  Dim aNhap(), aXuat(), Arr(), Res(), Dic As Object
  Dim i&, sRow&, nhap As Double, Ton As Double
  Dim MaSP$, iTest As Boolean
  With Sheets("NHAP")
    aNhap = .Range("C4:H" & .Range("A" & Rows.Count).End(xlUp).Row).Value
  End With
  With Sheets("XUAT")
    aXuat = .Range("C5:F" & .Range("A" & Rows.Count).End(xlUp).Row).Value
  End With
  Set Dic = CreateObject("scripting.dictionary")
  sRow = UBound(aXuat)

  For i = 1 To sRow
    MaSP = aXuat(i, 1)
    Dic.Item(MaSP) = Dic.Item(MaSP) + aXuat(i, 4)
  Next i
  sRow = UBound(aNhap)
  ReDim Res(1 To sRow, 1 To 4)
  For i = 1 To sRow
    MaSP = aNhap(i, 1)
    Ton = Dic.Item(MaSP)
    nhap = aNhap(i, 4)
    If nhap <= Ton Then
      Res(i, 1) = nhap
      Res(i, 2) = 0
      Dic.Item(MaSP) = Ton - nhap
    Else
      Res(i, 1) = Ton
      Res(i, 2) = nhap - Ton
      Dic.Item(MaSP) = 0
    End If
    Res(i, 3) = aNhap(i, 5)
    Res(i, 4) = Res(i, 2) * Res(i, 3)
  Next i
  With Sheets("NHAP")
    .Range("K4").Resize(sRow, 4) = Res
  End With
End Sub

Dạ, Thầy @HieuCD xem giup em ạ. Sheet NXT: ô M91 khác kết quả thành tiền vơi N393 bên sheet Nhập ạ. Và ô J21 bên Sheet Xuat, e nghĩ giá sẽ là: 4.561.760. Vì báo cáo e đang vướng là NXT nên dữ liệu sẽ lấy theo sheet Nhạp và sheet Xuat và theo thời gian nên sheet Xuat: đơn giá và thành tiền đang vướng nên NXT e chưa ra đúng ạ. Dạ, Data là sheet Nhap và Xuat ạ, Kết quả ở Sheet NXT từ ô A8:M220 ạ, theo thời gian ạ. E gửi fie đính kèm bên dưới ạ. E cảm ơn Thầy @HieuCD ạ.
 

File đính kèm

Dạ, Thầy @HieuCD xem giup em ạ. Sheet NXT: ô M91 khác kết quả thành tiền vơi N393 bên sheet Nhập ạ. Và ô J21 bên Sheet Xuat, e nghĩ giá sẽ là: 4.561.760. Vì báo cáo e đang vướng là NXT nên dữ liệu sẽ lấy theo sheet Nhạp và sheet Xuat và theo thời gian nên sheet Xuat: đơn giá và thành tiền đang vướng nên NXT e chưa ra đúng ạ. Dạ, Data là sheet Nhap và Xuat ạ, Kết quả ở Sheet NXT từ ô A8:M220 ạ, theo thời gian ạ. E gửi fie đính kèm bên dưới ạ. E cảm ơn Thầy @HieuCD ạ.
Ý bạn muốn kết quả như thế nào? Của sheet nào?
 
Dạ, e muốn kết quả của sheet NXT, lập báo cáo nhập xuất tồn đơn giá fifo theo số lượng và thành tiền của từng mã hàng ạ (theo thời gian ạ)
Vậy là viết lại code Nhập xuất tồn
Thời gian nhập xuất không phù hợp (Xuất nhưng chưa nhập kho) giải quyết như thế nào
 
Web KT

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

Back
Top Bottom