Cách sử dụng Code tính giá FIFO (2 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
 
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
Anh HiếuCD giúp viết marcro VBA tìm ngày hàng còn trong kho chưa bán Min ko. Nếu được mình cảm ơn trước tại có cả 30 mặt hàng như vậy tìm khá nhiều
 

File đính kèm

Ngày Nhập. Xuất
1/1/2020 30. 0
2/1/2020 0. 10
3/1/2020. 0. 10
Vậy ngày Min hàng tồn kho chưa bán hết là 1/1/2020
Sao kiệm lời vậy, Chỉ đoán mò
Dữ liệu nhập xuất theo thời gian phải chuẩn, không bẩy lỗi xuất âm
Mã:
Sub NgayDauTonKho()
  Dim aNhap(), aXuat(), Res(), SanPham$
  Dim eRow&, sRow&, i&, r&, sRow2&, i2&, iR2&, r2&, k&, tXuat#
  With Sheets("Sheet1") 'Sheet nhap
    eRow = .Range("A" & Rows.Count).End(xlUp).Row
    Res = .Range("A2:D" & eRow).Value 'Gia tri goc
    .Range("A2:D" & eRow).Sort .Range("A2"), 1, .Range("B2"), , 1, Header:=xlNo 'Sort theo San Pham va ngay
    aNhap = .Range("A2:D" & eRow).Value
    .Range("A2:D" & eRow).Value = Res 'Tra ve gia tri goc
  End With
  With Sheets("Sheet2") 'Sheet Xuat
    eRow = .Range("A" & Rows.Count).End(xlUp).Row
    Res = .Range("A2:D" & eRow).Value 'Gia tri goc
    .Range("A2:D" & eRow).Sort .Range("A2"), 1, .Range("B2"), , 1, Header:=xlNo 'Sort theo San Pham va ngay
    aXuat = .Range("A2:D" & eRow + 1).Value
    .Range("A2:D" & eRow).Value = Res 'Tra ve gia tri goc
  End With
  sRow = UBound(aXuat)
  sRow2 = UBound(aNhap)
  ReDim Res(1 To sRow2, 1 To 2)
  iR2 = 1
  For i = 1 To sRow - 1
    If aXuat(i, 1) <> SanPham Then
      SanPham = aXuat(i, 1)
      k = k + 1
      Res(k, 1) = SanPham
      For r = i To sRow
        If aXuat(r, 1) = SanPham Then
          tXuat = tXuat + aXuat(r, 3)
        Else
          For r2 = iR2 To sRow2 'Tim San Pham Nhap
            If aNhap(r2, 1) = SanPham Then
              iR2 = r2
              Exit For
            End If
          Next r2
          If r2 <= sRow2 Then 'Neu co San Pham Nhap cua San Pham Xuat
            For i2 = iR2 To sRow2
              If aNhap(i2, 1) = SanPham Then
                If tXuat > 0 Then
                  If tXuat > aNhap(i2, 3) Then
                    tXuat = tXuat - aNhap(i2, 3)
                  Else
                    Res(k, 2) = aNhap(i2, 2)
                    tXuat = 0
                  End If
                End If
              Else
                If i2 > 1 And Res(k, 2) = Empty Then 'Ton kho khong du Xuat
                  Res(k, 2) = Format(aNhap(i2 - 1, 2), "dd/mm/yyyy") & " Ton Kho Khong Du Xuat"
                End If
                iR2 = i2
                Exit For
              End If
            Next i2
            tXuat = 0:  i = r - 1:       Exit For
          End If
        End If
      Next r
    End If
  Next i
  With Sheet3
    eRow = .Range("A" & Rows.Count).End(xlUp).Row
    If eRow > 1 Then .Range("A2:B" & eRow).ClearContents
    If k Then .Range("A2:B2").Resize(k) = Res
  End With
End Sub
 
Sao kiệm lời vậy, Chỉ đoán mò
Dữ liệu nhập xuất theo thời gian phải chuẩn, không bẩy lỗi xuất âm
Mã:
Sub NgayDauTonKho()
  Dim aNhap(), aXuat(), Res(), SanPham$
  Dim eRow&, sRow&, i&, r&, sRow2&, i2&, iR2&, r2&, k&, tXuat#
  With Sheets("Sheet1") 'Sheet nhap
    eRow = .Range("A" & Rows.Count).End(xlUp).Row
    Res = .Range("A2:D" & eRow).Value 'Gia tri goc
    .Range("A2:D" & eRow).Sort .Range("A2"), 1, .Range("B2"), , 1, Header:=xlNo 'Sort theo San Pham va ngay
    aNhap = .Range("A2:D" & eRow).Value
    .Range("A2:D" & eRow).Value = Res 'Tra ve gia tri goc
  End With
  With Sheets("Sheet2") 'Sheet Xuat
    eRow = .Range("A" & Rows.Count).End(xlUp).Row
    Res = .Range("A2:D" & eRow).Value 'Gia tri goc
    .Range("A2:D" & eRow).Sort .Range("A2"), 1, .Range("B2"), , 1, Header:=xlNo 'Sort theo San Pham va ngay
    aXuat = .Range("A2:D" & eRow + 1).Value
    .Range("A2:D" & eRow).Value = Res 'Tra ve gia tri goc
  End With
  sRow = UBound(aXuat)
  sRow2 = UBound(aNhap)
  ReDim Res(1 To sRow2, 1 To 2)
  iR2 = 1
  For i = 1 To sRow - 1
    If aXuat(i, 1) <> SanPham Then
      SanPham = aXuat(i, 1)
      k = k + 1
      Res(k, 1) = SanPham
      For r = i To sRow
        If aXuat(r, 1) = SanPham Then
          tXuat = tXuat + aXuat(r, 3)
        Else
          For r2 = iR2 To sRow2 'Tim San Pham Nhap
            If aNhap(r2, 1) = SanPham Then
              iR2 = r2
              Exit For
            End If
          Next r2
          If r2 <= sRow2 Then 'Neu co San Pham Nhap cua San Pham Xuat
            For i2 = iR2 To sRow2
              If aNhap(i2, 1) = SanPham Then
                If tXuat > 0 Then
                  If tXuat > aNhap(i2, 3) Then
                    tXuat = tXuat - aNhap(i2, 3)
                  Else
                    Res(k, 2) = aNhap(i2, 2)
                    tXuat = 0
                  End If
                End If
              Else
                If i2 > 1 And Res(k, 2) = Empty Then 'Ton kho khong du Xuat
                  Res(k, 2) = Format(aNhap(i2 - 1, 2), "dd/mm/yyyy") & " Ton Kho Khong Du Xuat"
                End If
                iR2 = i2
                Exit For
              End If
            Next i2
            tXuat = 0:  i = r - 1:       Exit For
          End If
        End If
      Next r
    End If
  Next i
  With Sheet3
    eRow = .Range("A" & Rows.Count).End(xlUp).Row
    If eRow > 1 Then .Range("A2:B" & eRow).ClearContents
    If k Then .Range("A2:B2").Resize(k) = Res
  End With
End Sub
Cảm ơn bác. Công ty mình không có xuất > nhập nên không có xuất âm. Mình chỉ cần list ngày để tiện theo dõi ngày theo từng loại hàng hóa
 
Trời ạ! Làm mình viết code loạn xà ngầu
Mà code ổn mà đúng cái mình cần. Cảm ơn cho tất cả. Mà file đó là file phụ do file excel chính công thức khá nặng. Mình chỉ muốn copy một số cột mình cần từ file chính vào file phụ. Chỉ lấy dữ liệu cho tới dòng cuối cùng và file chính ở chế độ đóng. Giúp đỡ viết code copy cột theo dạng dễ hiểu để mình tự làm thêm cột nếu cần tại mình chưa rành lắm
 

File đính kèm

Lần chỉnh sửa cuối:
Mà code ổn mà đúng cái mình cần. Cảm ơn cho tất cả. Mà file đó là file phụ do file excel chính công thức khá nặng. Mình chỉ muốn copy một số cột mình cần từ file chính vào file phụ. Chỉ lấy dữ liệu cho tới dòng cuối cùng và file chính ở chế độ đóng. Giúp đỡ viết code copy cột theo dạng dễ hiểu để mình tự làm thêm cột nếu cần tại mình chưa rành lắm
Người ta kêu trời mà vẫn không tha.
Phần này chắc không khó, bạn nên tự làm,
Hơn nữa nó là vấn đề khác, nên mở chủ đề mới nếu cần
 
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
Chào ạ! mình có 1 file xuất nhập FIFO nhưng nó bị lỗi ở một chỗ nhưng không biết khắc phục như thế nào
Lỗi: Khi mình xuất kho vượt quá 50% giá trị tồn kho thì thành tiền nó chỉ nhận lượng xuất kho tương ứng với lượng hàng còn tồn lại trong kho.
Không biết nguyên nhân do code lỗi hay sao, rất mong được sự giúp đỡ.
Cảm ơn ạ!
screenshot_1663819397.png
 

File đính kèm

Chào ạ! mình có 1 file xuất nhập FIFO nhưng nó bị lỗi ở một chỗ nhưng không biết khắc phục như thế nào
Lỗi: Khi mình xuất kho vượt quá 50% giá trị tồn kho thì thành tiền nó chỉ nhận lượng xuất kho tương ứng với lượng hàng còn tồn lại trong kho.
Không biết nguyên nhân do code lỗi hay sao, rất mong được sự giúp đỡ.
Cảm ơn ạ!
View attachment 281225
Code tính giá xuất kho FIFO không đúng quy định, bạn nên tính thủ công trên giấy sau đó viết code theo đúng trình tự tính thủ công
 
Làm theo mấy ông kho gà mờ nầy chắc chết. Yêu cầu lung tung, file thì úp úp mở mở, vừa viết đoạn code nầy xong thì lại kêu thêm chuyển thành đoạn code khác. Do data chưa chuẩn, file báo cáo thì mập mờ...haizzzz
Ai mà chạy theo yêu cầu thay đổi xành xạch của mấy ổng nổi.
 

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

Back
Top Bottom