Giúp Theo dõi Xuất nhập hàng theo phương pháp FIFO

Liên hệ QC
Ngày nhập và ngày xuất kho là ngày trên giấy tờ có thể không khớp với ngày nhập và xuất kho thực tế
Thủ kho muốn xuất thì trong kho phải có hàng, thời gian nhập kho thực tế chắc chắn trước thời gian xuất, tuy nhiên trên giấy tờ có thể vì lý do nào đó hàng đã nhập kho nhưng chưa làm phiếu nhập kho, sau đó mới bổ xung phiếu nhập kho sau và ngày nhập ghi theo thời gian lập phiếu nhập kho, do đó mình bỏ qua yếu tố thời gian
Nếu muốn chỉnh lại theo thời gian thì dùng code
Mã:
Sub GPE2()
  Dim nhapArr(), xuatArr(), Res()
  Dim i As Long, n As Long, sRow As Long
  Dim sNhap As Double, sXuat As Double, dXuat As Date
  Dim Ma As String, tmp As String
  With Sheets("Sheet1")
    i = .Range("A" & Rows.Count).End(xlUp).Row
    If i < 3 Then MsgBox ("Khong co du lieu"): Exit Sub
    nhapArr = .Range("A3:D" & i).Value
    i = .Range("F" & Rows.Count).End(xlUp).Row
    If i < 3 Then MsgBox ("Khong co du lieu"): Exit Sub
    xuatArr = .Range("F3:H" & i).Value
    sRow = UBound(xuatArr)
    ReDim Res(1 To sRow, 1 To 1)
  End With
  For i = 1 To sRow
    dXuat = xuatArr(i, 1): Ma = xuatArr(i, 2): sXuat = xuatArr(i, 3)
    tmp = ""
    If Len(Ma) > 0 And sXuat > 0 Then
      For n = 1 To UBound(nhapArr)
        If nhapArr(n, 1) > dXuat Then Exit For
        If nhapArr(n, 2) = Ma Then
          sNhap = nhapArr(n, 3)
          If sNhap > 0 Then
            If sNhap >= sXuat Then
              Res(i, 1) = tmp & nhapArr(n, 4)
              If Len(tmp) > 0 Then Res(i, 1) = Res(i, 1) & "(" & sXuat & ")"
              nhapArr(n, 3) = sNhap - sXuat
              sXuat = 0
              Exit For
            Else
              tmp = tmp & nhapArr(n, 4) & "(" & sNhap & "); "
              nhapArr(n, 3) = 0
              sXuat = sXuat - sNhap
            End If
          End If
        End If
      Next n
      If sXuat > 0 Then Res(i, 1) = tmp & "Thieu(" & sXuat & ")"
    End If
  Next i
  Sheets("Sheet1").Range("I3").Resize(sRow) = Res
End Sub
Quá chuẩn , Thanks bác nhiệt tình
 
xin chào các anh chị,

em muốn hỏi cũng như chủ top về PP FIFO nhưng em muốn tìm lượng hàng còn lại trong kho là ở những ngày nhập nào bằng VBA
Nhờ các anh chị giúp ạ
 
Gấp gấp gấp
các anh chị ơi, giúp em với ạ
Em có file đầu tiên là tổng số lượng cần xuất
File thứ 2 là FIle tồn của PO, cột AZ là số lượng còn lại của các PO cần xuất
Ví dụ ngày 28 tháng 2 em cần xuất số lượng tổng ở file 1, thì em làm sao để có thể tự động lấy số lượng ở file 1 để bỏ vào cột ngày 28 và kiểm tra theo số tồn của PO. Note: PO nào có Due date , cột G tới trước thì xuất trước ạ.
Anh chị nào viết dc macro thì giúp em với ạ
Em cảm ơn rất nhiều
 
Chào các bạn,

Tôi thấy code của bạn rất hay, tôi muốn hỏi bạn có thể gíup nếu thêm vào 1 số điều kiện như sau:

1. Mã hàng : thêm mã phụ
2. Bảng tồn kho của mình có phần gọi là LOT ,có thể là
Ngày nhận hàng (YYYYMMDD)
Cụ thể không phải là ngày ( HCM, HN, DN, ...)
và cũng có thể không có
3. Số lô : thêm Kho (Kho1, Kho2 ...) rồi muốn tới số lô
Mặc định là Kho1, nhưng có thể tuỳ chọn Kho2,...

Mục đích là tạo ra phiếu xuất kho nhanh và gọn cho mình đi lấy hàng.

Cám ơn
 

File đính kèm

Chào các bạn,

Tôi thấy code của bạn rất hay, tôi muốn hỏi bạn có thể gíup nếu thêm vào 1 số điều kiện như sau:

1. Mã hàng : thêm mã phụ
2. Bảng tồn kho của mình có phần gọi là LOT ,có thể là
Ngày nhận hàng (YYYYMMDD)
Cụ thể không phải là ngày ( HCM, HN, DN, ...)
và cũng có thể không có
3. Số lô : thêm Kho (Kho1, Kho2 ...) rồi muốn tới số lô
Mặc định là Kho1, nhưng có thể tuỳ chọn Kho2,...

Mục đích là tạo ra phiếu xuất kho nhanh và gọn cho mình đi lấy hàng.

Cám ơn
FCode theo dữ liệu trong file
Mã:
Sub PhieuXuat()
  Dim aTon(), aDDH(), Res()
  Dim i&, r&, r2&, k&, sRow&
  Dim sNhap#, sXuat#
  Dim Ma$, MaP$, Lot, Kho$, Ke&
  With Sheets("FIFO2")
    i = .Range("T" & Rows.Count).End(xlUp).Row
    If i > 4 Then Range("T5:Z" & i).ClearContents 'Xóa du lieu
    
    i = .Range("L" & Rows.Count).End(xlUp).Row
    If i < 5 Then MsgBox ("Khong co du lieu"): Exit Sub
    aDDH = .Range("L5:P" & i).Value 'Don dat hang
    
    i = .Range("C" & Rows.Count).End(xlUp).Row
    If i < 5 Then MsgBox ("Khong co du lieu"): Exit Sub
    Res = .Range("C5:H" & i).Value
    .Range("C5:H" & i).Sort .[C5], 1, .[H5], , 1, Header:=xlNo
    aTon = .Range("C5:H" & i).Value 'Hàng ton kho
    .Range("C5:H" & i).Value = Res
  End With
  ReDim Res(1 To 50, 1 To 6)
  sRow = UBound(aDDH)
  For i = 1 To sRow
    Ma = aDDH(i, 1): MaP = aDDH(i, 2): Lot = aDDH(i, 3)
    Kho = aDDH(i, 4): sXuat = aDDH(i, 5)
    tmp = ""
    If Ma <> Empty Then
      For r = 1 To UBound(aTon)
        If aTon(r, 1) = Ma Then
          For r2 = r To UBound(aTon)
            If aTon(r2, 1) <> Ma Then Exit For '***
            sNhap = aTon(r2, 6)
            If sNhap > 0 Then
              If aTon(r2, 2) = MaP Or MaP = Empty Then
                If aTon(r2, 3) = Lot Or Lot = Empty Then
                  If aTon(r2, 4) = Kho Or Kho = Empty Then
                    k = k + 1
                    Res(k, 1) = Ma: Res(k, 2) = MaP: Res(k, 3) = aTon(r2, 3)
                    Res(k, 4) = Kho: Res(k, 5) = aTon(r2, 5)
                    If sNhap >= sXuat Then
                      Res(k, 6) = sXuat
                      sXuat = 0
                      Exit For '***
                    Else
                      Res(k, 6) = sNhap
                      sXuat = sXuat - sNhap
                    End If
                  End If
                End If
              End If
            End If
          Next r2
          If sXuat > 0 Then
            k = k + 1
            Res(k, 1) = Ma: Res(k, 2) = MaP: Res(k, 3) = Lot: Res(k, 4) = Kho
            Res(k, 6) = "Thieu " & sXuat
          End If
          Exit For '***
        End If
      Next r
    End If
  Next i
  Sheets("FIFO2").Range("T5").Resize(k, 6) = Res
End Sub

Sub XuatKho()
  Dim aTon(), aXuat(), Dic As Object, Ke$
  Dim i&, ik&, sRow&
  With Sheets("FIFO2")
    i = .Range("T" & Rows.Count).End(xlUp).Row
    If i < 5 Then MsgBox ("Khong co du lieu"): Exit Sub
    aXuat = .Range("T5:Y" & i).Value 'Phieu Xuat

    i = .Range("C" & Rows.Count).End(xlUp).Row
    If i < 5 Then MsgBox ("Khong co du lieu"): Exit Sub
    aTon = .Range("C5:H" & i).Value 'Hàng ton kho
    '.Range("T5:Y" & i).PrintPreview 'Xem trang in
    .Range("T5:Y" & i).PrintOut 'In Phieu xuat
    Range("T5:Z" & i).ClearContents 'Xóa du lieu
  End With
 
  'Giam hang ton kho
  Set Dic = CreateObject("scripting.dictionary")
  sRow = UBound(aTon)
  For i = 1 To sRow
    If aTon(i, 5) <> Empty Then Dic.Item(aTon(i, 5)) = i
  Next i
  sRow = UBound(aXuat)
  For i = 1 To sRow
    ik = Dic.Item(aXuat(i, 5))
    If ik > 0 Then
      aTon(ik, 6) = aTon(ik, 6) - aXuat(i, 6)
    End If
  Next i
  Sheets("FIFO2").Range("C5").Resize(UBound(aTon), 6) = aTon 'Giam hang ton kho
End Sub
 

File đính kèm

File chạy tốt, cám ơn bạn.
Bạn có thể gíup thêm
1. Tại bảng hàng tồn kho : xoá dòng có số lượng bằng không.
2. Khi bấm nút xuất hàng thêm 1 động tác là lưu trữ dự liệu sang sheet Data có ngày (timestamp) để thêm dõi hàng xuất kho hàng ngày
Cám ơn bạn nhiều,
 
FCode theo dữ liệu trong file
Mã:
Sub PhieuXuat()
  Dim aTon(), aDDH(), Res()
  Dim i&, r&, r2&, k&, sRow&
  Dim sNhap#, sXuat#
  Dim Ma$, MaP$, Lot, Kho$, Ke&
  With Sheets("FIFO2")
    i = .Range("T" & Rows.Count).End(xlUp).Row
    If i > 4 Then Range("T5:Z" & i).ClearContents 'Xóa du lieu
   
    i = .Range("L" & Rows.Count).End(xlUp).Row
    If i < 5 Then MsgBox ("Khong co du lieu"): Exit Sub
    aDDH = .Range("L5:P" & i).Value 'Don dat hang
   
    i = .Range("C" & Rows.Count).End(xlUp).Row
    If i < 5 Then MsgBox ("Khong co du lieu"): Exit Sub
    Res = .Range("C5:H" & i).Value
    .Range("C5:H" & i).Sort .[C5], 1, .[H5], , 1, Header:=xlNo
    aTon = .Range("C5:H" & i).Value 'Hàng ton kho
    .Range("C5:H" & i).Value = Res
  End With
  ReDim Res(1 To 50, 1 To 6)
  sRow = UBound(aDDH)
  For i = 1 To sRow
    Ma = aDDH(i, 1): MaP = aDDH(i, 2): Lot = aDDH(i, 3)
    Kho = aDDH(i, 4): sXuat = aDDH(i, 5)
    tmp = ""
    If Ma <> Empty Then
      For r = 1 To UBound(aTon)
        If aTon(r, 1) = Ma Then
          For r2 = r To UBound(aTon)
            If aTon(r2, 1) <> Ma Then Exit For '***
            sNhap = aTon(r2, 6)
            If sNhap > 0 Then
              If aTon(r2, 2) = MaP Or MaP = Empty Then
                If aTon(r2, 3) = Lot Or Lot = Empty Then
                  If aTon(r2, 4) = Kho Or Kho = Empty Then
                    k = k + 1
                    Res(k, 1) = Ma: Res(k, 2) = MaP: Res(k, 3) = aTon(r2, 3)
                    Res(k, 4) = Kho: Res(k, 5) = aTon(r2, 5)
                    If sNhap >= sXuat Then
                      Res(k, 6) = sXuat
                      sXuat = 0
                      Exit For '***
                    Else
                      Res(k, 6) = sNhap
                      sXuat = sXuat - sNhap
                    End If
                  End If
                End If
              End If
            End If
          Next r2
          If sXuat > 0 Then
            k = k + 1
            Res(k, 1) = Ma: Res(k, 2) = MaP: Res(k, 3) = Lot: Res(k, 4) = Kho
            Res(k, 6) = "Thieu " & sXuat
          End If
          Exit For '***
        End If
      Next r
    End If
  Next i
  Sheets("FIFO2").Range("T5").Resize(k, 6) = Res
End Sub

Sub XuatKho()
  Dim aTon(), aXuat(), Dic As Object, Ke$
  Dim i&, ik&, sRow&
  With Sheets("FIFO2")
    i = .Range("T" & Rows.Count).End(xlUp).Row
    If i < 5 Then MsgBox ("Khong co du lieu"): Exit Sub
    aXuat = .Range("T5:Y" & i).Value 'Phieu Xuat

    i = .Range("C" & Rows.Count).End(xlUp).Row
    If i < 5 Then MsgBox ("Khong co du lieu"): Exit Sub
    aTon = .Range("C5:H" & i).Value 'Hàng ton kho
    '.Range("T5:Y" & i).PrintPreview 'Xem trang in
    .Range("T5:Y" & i).PrintOut 'In Phieu xuat
    Range("T5:Z" & i).ClearContents 'Xóa du lieu
  End With

  'Giam hang ton kho
  Set Dic = CreateObject("scripting.dictionary")
  sRow = UBound(aTon)
  For i = 1 To sRow
    If aTon(i, 5) <> Empty Then Dic.Item(aTon(i, 5)) = i
  Next i
  sRow = UBound(aXuat)
  For i = 1 To sRow
    ik = Dic.Item(aXuat(i, 5))
    If ik > 0 Then
      aTon(ik, 6) = aTon(ik, 6) - aXuat(i, 6)
    End If
  Next i
  Sheets("FIFO2").Range("C5").Resize(UBound(aTon), 6) = aTon 'Giam hang ton kho
End Sub

Chào anh,
Em thấy code a viết tốt quá, tuy nhiên có thể thay đổi lại điều kiện này thì xử lý ntn ạ?
1595571338028.png
 

File đính kèm

  • 1595571324561.png
    1595571324561.png
    372.8 KB · Đọc: 17
FCode theo dữ liệu trong file
Mã:
Sub PhieuXuat()
  Dim aTon(), aDDH(), Res()
  Dim i&, r&, r2&, k&, sRow&
  Dim sNhap#, sXuat#
  Dim Ma$, MaP$, Lot, Kho$, Ke&
  With Sheets("FIFO2")
    i = .Range("T" & Rows.Count).End(xlUp).Row
    If i > 4 Then Range("T5:Z" & i).ClearContents 'Xóa du lieu
 
    i = .Range("L" & Rows.Count).End(xlUp).Row
    If i < 5 Then MsgBox ("Khong co du lieu"): Exit Sub
    aDDH = .Range("L5:P" & i).Value 'Don dat hang
 
    i = .Range("C" & Rows.Count).End(xlUp).Row
    If i < 5 Then MsgBox ("Khong co du lieu"): Exit Sub
    Res = .Range("C5:H" & i).Value
    .Range("C5:H" & i).Sort .[C5], 1, .[H5], , 1, Header:=xlNo
    aTon = .Range("C5:H" & i).Value 'Hàng ton kho
    .Range("C5:H" & i).Value = Res
  End With
  ReDim Res(1 To 50, 1 To 6)
  sRow = UBound(aDDH)
  For i = 1 To sRow
    Ma = aDDH(i, 1): MaP = aDDH(i, 2): Lot = aDDH(i, 3)
    Kho = aDDH(i, 4): sXuat = aDDH(i, 5)
    tmp = ""
    If Ma <> Empty Then
      For r = 1 To UBound(aTon)
        If aTon(r, 1) = Ma Then
          For r2 = r To UBound(aTon)
            If aTon(r2, 1) <> Ma Then Exit For '***
            sNhap = aTon(r2, 6)
            If sNhap > 0 Then
              If aTon(r2, 2) = MaP Or MaP = Empty Then
                If aTon(r2, 3) = Lot Or Lot = Empty Then
                  If aTon(r2, 4) = Kho Or Kho = Empty Then
                    k = k + 1
                    Res(k, 1) = Ma: Res(k, 2) = MaP: Res(k, 3) = aTon(r2, 3)
                    Res(k, 4) = Kho: Res(k, 5) = aTon(r2, 5)
                    If sNhap >= sXuat Then
                      Res(k, 6) = sXuat
                      sXuat = 0
                      Exit For '***
                    Else
                      Res(k, 6) = sNhap
                      sXuat = sXuat - sNhap
                    End If
                  End If
                End If
              End If
            End If
          Next r2
          If sXuat > 0 Then
            k = k + 1
            Res(k, 1) = Ma: Res(k, 2) = MaP: Res(k, 3) = Lot: Res(k, 4) = Kho
            Res(k, 6) = "Thieu " & sXuat
          End If
          Exit For '***
        End If
      Next r
    End If
  Next i
  Sheets("FIFO2").Range("T5").Resize(k, 6) = Res
End Sub

Sub XuatKho()
  Dim aTon(), aXuat(), Dic As Object, Ke$
  Dim i&, ik&, sRow&
  With Sheets("FIFO2")
    i = .Range("T" & Rows.Count).End(xlUp).Row
    If i < 5 Then MsgBox ("Khong co du lieu"): Exit Sub
    aXuat = .Range("T5:Y" & i).Value 'Phieu Xuat

    i = .Range("C" & Rows.Count).End(xlUp).Row
    If i < 5 Then MsgBox ("Khong co du lieu"): Exit Sub
    aTon = .Range("C5:H" & i).Value 'Hàng ton kho
    '.Range("T5:Y" & i).PrintPreview 'Xem trang in
    .Range("T5:Y" & i).PrintOut 'In Phieu xuat
    Range("T5:Z" & i).ClearContents 'Xóa du lieu
  End With
 
  'Giam hang ton kho
  Set Dic = CreateObject("scripting.dictionary")
  sRow = UBound(aTon)
  For i = 1 To sRow
    If aTon(i, 5) <> Empty Then Dic.Item(aTon(i, 5)) = i
  Next i
  sRow = UBound(aXuat)
  For i = 1 To sRow
    ik = Dic.Item(aXuat(i, 5))
    If ik > 0 Then
      aTon(ik, 6) = aTon(ik, 6) - aXuat(i, 6)
    End If
  Next i
  Sheets("FIFO2").Range("C5").Resize(UBound(aTon), 6) = aTon 'Giam hang ton kho
End Sub
FCode theo dữ liệu trong file
Mã:
Sub PhieuXuat()
  Dim aTon(), aDDH(), Res()
  Dim i&, r&, r2&, k&, sRow&
  Dim sNhap#, sXuat#
  Dim Ma$, MaP$, Lot, Kho$, Ke&
  With Sheets("FIFO2")
    i = .Range("T" & Rows.Count).End(xlUp).Row
    If i > 4 Then Range("T5:Z" & i).ClearContents 'Xóa du lieu
 
    i = .Range("L" & Rows.Count).End(xlUp).Row
    If i < 5 Then MsgBox ("Khong co du lieu"): Exit Sub
    aDDH = .Range("L5:P" & i).Value 'Don dat hang
 
    i = .Range("C" & Rows.Count).End(xlUp).Row
    If i < 5 Then MsgBox ("Khong co du lieu"): Exit Sub
    Res = .Range("C5:H" & i).Value
    .Range("C5:H" & i).Sort .[C5], 1, .[H5], , 1, Header:=xlNo
    aTon = .Range("C5:H" & i).Value 'Hàng ton kho
    .Range("C5:H" & i).Value = Res
  End With
  ReDim Res(1 To 50, 1 To 6)
  sRow = UBound(aDDH)
  For i = 1 To sRow
    Ma = aDDH(i, 1): MaP = aDDH(i, 2): Lot = aDDH(i, 3)
    Kho = aDDH(i, 4): sXuat = aDDH(i, 5)
    tmp = ""
    If Ma <> Empty Then
      For r = 1 To UBound(aTon)
        If aTon(r, 1) = Ma Then
          For r2 = r To UBound(aTon)
            If aTon(r2, 1) <> Ma Then Exit For '***
            sNhap = aTon(r2, 6)
            If sNhap > 0 Then
              If aTon(r2, 2) = MaP Or MaP = Empty Then
                If aTon(r2, 3) = Lot Or Lot = Empty Then
                  If aTon(r2, 4) = Kho Or Kho = Empty Then
                    k = k + 1
                    Res(k, 1) = Ma: Res(k, 2) = MaP: Res(k, 3) = aTon(r2, 3)
                    Res(k, 4) = Kho: Res(k, 5) = aTon(r2, 5)
                    If sNhap >= sXuat Then
                      Res(k, 6) = sXuat
                      sXuat = 0
                      Exit For '***
                    Else
                      Res(k, 6) = sNhap
                      sXuat = sXuat - sNhap
                    End If
                  End If
                End If
              End If
            End If
          Next r2
          If sXuat > 0 Then
            k = k + 1
            Res(k, 1) = Ma: Res(k, 2) = MaP: Res(k, 3) = Lot: Res(k, 4) = Kho
            Res(k, 6) = "Thieu " & sXuat
          End If
          Exit For '***
        End If
      Next r
    End If
  Next i
  Sheets("FIFO2").Range("T5").Resize(k, 6) = Res
End Sub

Sub XuatKho()
  Dim aTon(), aXuat(), Dic As Object, Ke$
  Dim i&, ik&, sRow&
  With Sheets("FIFO2")
    i = .Range("T" & Rows.Count).End(xlUp).Row
    If i < 5 Then MsgBox ("Khong co du lieu"): Exit Sub
    aXuat = .Range("T5:Y" & i).Value 'Phieu Xuat

    i = .Range("C" & Rows.Count).End(xlUp).Row
    If i < 5 Then MsgBox ("Khong co du lieu"): Exit Sub
    aTon = .Range("C5:H" & i).Value 'Hàng ton kho
    '.Range("T5:Y" & i).PrintPreview 'Xem trang in
    .Range("T5:Y" & i).PrintOut 'In Phieu xuat
    Range("T5:Z" & i).ClearContents 'Xóa du lieu
  End With
 
  'Giam hang ton kho
  Set Dic = CreateObject("scripting.dictionary")
  sRow = UBound(aTon)
  For i = 1 To sRow
    If aTon(i, 5) <> Empty Then Dic.Item(aTon(i, 5)) = i
  Next i
  sRow = UBound(aXuat)
  For i = 1 To sRow
    ik = Dic.Item(aXuat(i, 5))
    If ik > 0 Then
      aTon(ik, 6) = aTon(ik, 6) - aXuat(i, 6)
    End If
  Next i
  Sheets("FIFO2").Range("C5").Resize(UBound(aTon), 6) = aTon 'Giam hang ton kho
End Sub

FCode theo dữ liệu trong file
Mã:
Sub PhieuXuat()
  Dim aTon(), aDDH(), Res()
  Dim i&, r&, r2&, k&, sRow&
  Dim sNhap#, sXuat#
  Dim Ma$, MaP$, Lot, Kho$, Ke&
  With Sheets("FIFO2")
    i = .Range("T" & Rows.Count).End(xlUp).Row
    If i > 4 Then Range("T5:Z" & i).ClearContents 'Xóa du lieu
  
    i = .Range("L" & Rows.Count).End(xlUp).Row
    If i < 5 Then MsgBox ("Khong co du lieu"): Exit Sub
    aDDH = .Range("L5:P" & i).Value 'Don dat hang
  
    i = .Range("C" & Rows.Count).End(xlUp).Row
    If i < 5 Then MsgBox ("Khong co du lieu"): Exit Sub
    Res = .Range("C5:H" & i).Value
    .Range("C5:H" & i).Sort .[C5], 1, .[H5], , 1, Header:=xlNo
    aTon = .Range("C5:H" & i).Value 'Hàng ton kho
    .Range("C5:H" & i).Value = Res
  End With
  ReDim Res(1 To 50, 1 To 6)
  sRow = UBound(aDDH)
  For i = 1 To sRow
    Ma = aDDH(i, 1): MaP = aDDH(i, 2): Lot = aDDH(i, 3)
    Kho = aDDH(i, 4): sXuat = aDDH(i, 5)
    tmp = ""
    If Ma <> Empty Then
      For r = 1 To UBound(aTon)
        If aTon(r, 1) = Ma Then
          For r2 = r To UBound(aTon)
            If aTon(r2, 1) <> Ma Then Exit For '***
            sNhap = aTon(r2, 6)
            If sNhap > 0 Then
              If aTon(r2, 2) = MaP Or MaP = Empty Then
                If aTon(r2, 3) = Lot Or Lot = Empty Then
                  If aTon(r2, 4) = Kho Or Kho = Empty Then
                    k = k + 1
                    Res(k, 1) = Ma: Res(k, 2) = MaP: Res(k, 3) = aTon(r2, 3)
                    Res(k, 4) = Kho: Res(k, 5) = aTon(r2, 5)
                    If sNhap >= sXuat Then
                      Res(k, 6) = sXuat
                      sXuat = 0
                      Exit For '***
                    Else
                      Res(k, 6) = sNhap
                      sXuat = sXuat - sNhap
                    End If
                  End If
                End If
              End If
            End If
          Next r2
          If sXuat > 0 Then
            k = k + 1
            Res(k, 1) = Ma: Res(k, 2) = MaP: Res(k, 3) = Lot: Res(k, 4) = Kho
            Res(k, 6) = "Thieu " & sXuat
          End If
          Exit For '***
        End If
      Next r
    End If
  Next i
  Sheets("FIFO2").Range("T5").Resize(k, 6) = Res
End Sub

Sub XuatKho()
  Dim aTon(), aXuat(), Dic As Object, Ke$
  Dim i&, ik&, sRow&
  With Sheets("FIFO2")
    i = .Range("T" & Rows.Count).End(xlUp).Row
    If i < 5 Then MsgBox ("Khong co du lieu"): Exit Sub
    aXuat = .Range("T5:Y" & i).Value 'Phieu Xuat

    i = .Range("C" & Rows.Count).End(xlUp).Row
    If i < 5 Then MsgBox ("Khong co du lieu"): Exit Sub
    aTon = .Range("C5:H" & i).Value 'Hàng ton kho
    '.Range("T5:Y" & i).PrintPreview 'Xem trang in
    .Range("T5:Y" & i).PrintOut 'In Phieu xuat
    Range("T5:Z" & i).ClearContents 'Xóa du lieu
  End With
 
  'Giam hang ton kho
  Set Dic = CreateObject("scripting.dictionary")
  sRow = UBound(aTon)
  For i = 1 To sRow
    If aTon(i, 5) <> Empty Then Dic.Item(aTon(i, 5)) = i
  Next i
  sRow = UBound(aXuat)
  For i = 1 To sRow
    ik = Dic.Item(aXuat(i, 5))
    If ik > 0 Then
      aTon(ik, 6) = aTon(ik, 6) - aXuat(i, 6)
    End If
  Next i
  Sheets("FIFO2").Range("C5").Resize(UBound(aTon), 6) = aTon 'Giam hang ton kho
End Sub
chào bạn
Bạn viết code hay quá, bạn có thể giúp mình viết code cho file xuất hàng và nhập FIFO với nhiều điều kiện
FCode theo dữ liệu trong file
Mã:
Sub PhieuXuat()
  Dim aTon(), aDDH(), Res()
  Dim i&, r&, r2&, k&, sRow&
  Dim sNhap#, sXuat#
  Dim Ma$, MaP$, Lot, Kho$, Ke&
  With Sheets("FIFO2")
    i = .Range("T" & Rows.Count).End(xlUp).Row
    If i > 4 Then Range("T5:Z" & i).ClearContents 'Xóa du lieu
   
    i = .Range("L" & Rows.Count).End(xlUp).Row
    If i < 5 Then MsgBox ("Khong co du lieu"): Exit Sub
    aDDH = .Range("L5:P" & i).Value 'Don dat hang
   
    i = .Range("C" & Rows.Count).End(xlUp).Row
    If i < 5 Then MsgBox ("Khong co du lieu"): Exit Sub
    Res = .Range("C5:H" & i).Value
    .Range("C5:H" & i).Sort .[C5], 1, .[H5], , 1, Header:=xlNo
    aTon = .Range("C5:H" & i).Value 'Hàng ton kho
    .Range("C5:H" & i).Value = Res
  End With
  ReDim Res(1 To 50, 1 To 6)
  sRow = UBound(aDDH)
  For i = 1 To sRow
    Ma = aDDH(i, 1): MaP = aDDH(i, 2): Lot = aDDH(i, 3)
    Kho = aDDH(i, 4): sXuat = aDDH(i, 5)
    tmp = ""
    If Ma <> Empty Then
      For r = 1 To UBound(aTon)
        If aTon(r, 1) = Ma Then
          For r2 = r To UBound(aTon)
            If aTon(r2, 1) <> Ma Then Exit For '***
            sNhap = aTon(r2, 6)
            If sNhap > 0 Then
              If aTon(r2, 2) = MaP Or MaP = Empty Then
                If aTon(r2, 3) = Lot Or Lot = Empty Then
                  If aTon(r2, 4) = Kho Or Kho = Empty Then
                    k = k + 1
                    Res(k, 1) = Ma: Res(k, 2) = MaP: Res(k, 3) = aTon(r2, 3)
                    Res(k, 4) = Kho: Res(k, 5) = aTon(r2, 5)
                    If sNhap >= sXuat Then
                      Res(k, 6) = sXuat
                      sXuat = 0
                      Exit For '***
                    Else
                      Res(k, 6) = sNhap
                      sXuat = sXuat - sNhap
                    End If
                  End If
                End If
              End If
            End If
          Next r2
          If sXuat > 0 Then
            k = k + 1
            Res(k, 1) = Ma: Res(k, 2) = MaP: Res(k, 3) = Lot: Res(k, 4) = Kho
            Res(k, 6) = "Thieu " & sXuat
          End If
          Exit For '***
        End If
      Next r
    End If
  Next i
  Sheets("FIFO2").Range("T5").Resize(k, 6) = Res
End Sub

Sub XuatKho()
  Dim aTon(), aXuat(), Dic As Object, Ke$
  Dim i&, ik&, sRow&
  With Sheets("FIFO2")
    i = .Range("T" & Rows.Count).End(xlUp).Row
    If i < 5 Then MsgBox ("Khong co du lieu"): Exit Sub
    aXuat = .Range("T5:Y" & i).Value 'Phieu Xuat

    i = .Range("C" & Rows.Count).End(xlUp).Row
    If i < 5 Then MsgBox ("Khong co du lieu"): Exit Sub
    aTon = .Range("C5:H" & i).Value 'Hàng ton kho
    '.Range("T5:Y" & i).PrintPreview 'Xem trang in
    .Range("T5:Y" & i).PrintOut 'In Phieu xuat
    Range("T5:Z" & i).ClearContents 'Xóa du lieu
  End With
 
  'Giam hang ton kho
  Set Dic = CreateObject("scripting.dictionary")
  sRow = UBound(aTon)
  For i = 1 To sRow
    If aTon(i, 5) <> Empty Then Dic.Item(aTon(i, 5)) = i
  Next i
  sRow = UBound(aXuat)
  For i = 1 To sRow
    ik = Dic.Item(aXuat(i, 5))
    If ik > 0 Then
      aTon(ik, 6) = aTon(ik, 6) - aXuat(i, 6)
    End If
  Next i
  Sheets("FIFO2").Range("C5").Resize(UBound(aTon), 6) = aTon 'Giam hang ton kho
End Sub
FCode theo dữ liệu trong file
Mã:
Sub PhieuXuat()
  Dim aTon(), aDDH(), Res()
  Dim i&, r&, r2&, k&, sRow&
  Dim sNhap#, sXuat#
  Dim Ma$, MaP$, Lot, Kho$, Ke&
  With Sheets("FIFO2")
    i = .Range("T" & Rows.Count).End(xlUp).Row
    If i > 4 Then Range("T5:Z" & i).ClearContents 'Xóa du lieu
   
    i = .Range("L" & Rows.Count).End(xlUp).Row
    If i < 5 Then MsgBox ("Khong co du lieu"): Exit Sub
    aDDH = .Range("L5:P" & i).Value 'Don dat hang
   
    i = .Range("C" & Rows.Count).End(xlUp).Row
    If i < 5 Then MsgBox ("Khong co du lieu"): Exit Sub
    Res = .Range("C5:H" & i).Value
    .Range("C5:H" & i).Sort .[C5], 1, .[H5], , 1, Header:=xlNo
    aTon = .Range("C5:H" & i).Value 'Hàng ton kho
    .Range("C5:H" & i).Value = Res
  End With
  ReDim Res(1 To 50, 1 To 6)
  sRow = UBound(aDDH)
  For i = 1 To sRow
    Ma = aDDH(i, 1): MaP = aDDH(i, 2): Lot = aDDH(i, 3)
    Kho = aDDH(i, 4): sXuat = aDDH(i, 5)
    tmp = ""
    If Ma <> Empty Then
      For r = 1 To UBound(aTon)
        If aTon(r, 1) = Ma Then
          For r2 = r To UBound(aTon)
            If aTon(r2, 1) <> Ma Then Exit For '***
            sNhap = aTon(r2, 6)
            If sNhap > 0 Then
              If aTon(r2, 2) = MaP Or MaP = Empty Then
                If aTon(r2, 3) = Lot Or Lot = Empty Then
                  If aTon(r2, 4) = Kho Or Kho = Empty Then
                    k = k + 1
                    Res(k, 1) = Ma: Res(k, 2) = MaP: Res(k, 3) = aTon(r2, 3)
                    Res(k, 4) = Kho: Res(k, 5) = aTon(r2, 5)
                    If sNhap >= sXuat Then
                      Res(k, 6) = sXuat
                      sXuat = 0
                      Exit For '***
                    Else
                      Res(k, 6) = sNhap
                      sXuat = sXuat - sNhap
                    End If
                  End If
                End If
              End If
            End If
          Next r2
          If sXuat > 0 Then
            k = k + 1
            Res(k, 1) = Ma: Res(k, 2) = MaP: Res(k, 3) = Lot: Res(k, 4) = Kho
            Res(k, 6) = "Thieu " & sXuat
          End If
          Exit For '***
        End If
      Next r
    End If
  Next i
  Sheets("FIFO2").Range("T5").Resize(k, 6) = Res
End Sub

Sub XuatKho()
  Dim aTon(), aXuat(), Dic As Object, Ke$
  Dim i&, ik&, sRow&
  With Sheets("FIFO2")
    i = .Range("T" & Rows.Count).End(xlUp).Row
    If i < 5 Then MsgBox ("Khong co du lieu"): Exit Sub
    aXuat = .Range("T5:Y" & i).Value 'Phieu Xuat

    i = .Range("C" & Rows.Count).End(xlUp).Row
    If i < 5 Then MsgBox ("Khong co du lieu"): Exit Sub
    aTon = .Range("C5:H" & i).Value 'Hàng ton kho
    '.Range("T5:Y" & i).PrintPreview 'Xem trang in
    .Range("T5:Y" & i).PrintOut 'In Phieu xuat
    Range("T5:Z" & i).ClearContents 'Xóa du lieu
  End With
 
  'Giam hang ton kho
  Set Dic = CreateObject("scripting.dictionary")
  sRow = UBound(aTon)
  For i = 1 To sRow
    If aTon(i, 5) <> Empty Then Dic.Item(aTon(i, 5)) = i
  Next i
  sRow = UBound(aXuat)
  For i = 1 To sRow
    ik = Dic.Item(aXuat(i, 5))
    If ik > 0 Then
      aTon(ik, 6) = aTon(ik, 6) - aXuat(i, 6)
    End If
  Next i
  Sheets("FIFO2").Range("C5").Resize(UBound(aTon), 6) = aTon 'Giam hang ton kho
End Sub
Chào bạn

Bạn viết code hay quá, giúp
FCode theo dữ liệu trong file
Mã:
Sub PhieuXuat()
  Dim aTon(), aDDH(), Res()
  Dim i&, r&, r2&, k&, sRow&
  Dim sNhap#, sXuat#
  Dim Ma$, MaP$, Lot, Kho$, Ke&
  With Sheets("FIFO2")
    i = .Range("T" & Rows.Count).End(xlUp).Row
    If i > 4 Then Range("T5:Z" & i).ClearContents 'Xóa du lieu
   
    i = .Range("L" & Rows.Count).End(xlUp).Row
    If i < 5 Then MsgBox ("Khong co du lieu"): Exit Sub
    aDDH = .Range("L5:P" & i).Value 'Don dat hang
   
    i = .Range("C" & Rows.Count).End(xlUp).Row
    If i < 5 Then MsgBox ("Khong co du lieu"): Exit Sub
    Res = .Range("C5:H" & i).Value
    .Range("C5:H" & i).Sort .[C5], 1, .[H5], , 1, Header:=xlNo
    aTon = .Range("C5:H" & i).Value 'Hàng ton kho
    .Range("C5:H" & i).Value = Res
  End With
  ReDim Res(1 To 50, 1 To 6)
  sRow = UBound(aDDH)
  For i = 1 To sRow
    Ma = aDDH(i, 1): MaP = aDDH(i, 2): Lot = aDDH(i, 3)
    Kho = aDDH(i, 4): sXuat = aDDH(i, 5)
    tmp = ""
    If Ma <> Empty Then
      For r = 1 To UBound(aTon)
        If aTon(r, 1) = Ma Then
          For r2 = r To UBound(aTon)
            If aTon(r2, 1) <> Ma Then Exit For '***
            sNhap = aTon(r2, 6)
            If sNhap > 0 Then
              If aTon(r2, 2) = MaP Or MaP = Empty Then
                If aTon(r2, 3) = Lot Or Lot = Empty Then
                  If aTon(r2, 4) = Kho Or Kho = Empty Then
                    k = k + 1
                    Res(k, 1) = Ma: Res(k, 2) = MaP: Res(k, 3) = aTon(r2, 3)
                    Res(k, 4) = Kho: Res(k, 5) = aTon(r2, 5)
                    If sNhap >= sXuat Then
                      Res(k, 6) = sXuat
                      sXuat = 0
                      Exit For '***
                    Else
                      Res(k, 6) = sNhap
                      sXuat = sXuat - sNhap
                    End If
                  End If
                End If
              End If
            End If
          Next r2
          If sXuat > 0 Then
            k = k + 1
            Res(k, 1) = Ma: Res(k, 2) = MaP: Res(k, 3) = Lot: Res(k, 4) = Kho
            Res(k, 6) = "Thieu " & sXuat
          End If
          Exit For '***
        End If
      Next r
    End If
  Next i
  Sheets("FIFO2").Range("T5").Resize(k, 6) = Res
End Sub

Sub XuatKho()
  Dim aTon(), aXuat(), Dic As Object, Ke$
  Dim i&, ik&, sRow&
  With Sheets("FIFO2")
    i = .Range("T" & Rows.Count).End(xlUp).Row
    If i < 5 Then MsgBox ("Khong co du lieu"): Exit Sub
    aXuat = .Range("T5:Y" & i).Value 'Phieu Xuat

    i = .Range("C" & Rows.Count).End(xlUp).Row
    If i < 5 Then MsgBox ("Khong co du lieu"): Exit Sub
    aTon = .Range("C5:H" & i).Value 'Hàng ton kho
    '.Range("T5:Y" & i).PrintPreview 'Xem trang in
    .Range("T5:Y" & i).PrintOut 'In Phieu xuat
    Range("T5:Z" & i).ClearContents 'Xóa du lieu
  End With
 
  'Giam hang ton kho
  Set Dic = CreateObject("scripting.dictionary")
  sRow = UBound(aTon)
  For i = 1 To sRow
    If aTon(i, 5) <> Empty Then Dic.Item(aTon(i, 5)) = i
  Next i
  sRow = UBound(aXuat)
  For i = 1 To sRow
    ik = Dic.Item(aXuat(i, 5))
    If ik > 0 Then
      aTon(ik, 6) = aTon(ik, 6) - aXuat(i, 6)
    End If
  Next i
  Sheets("FIFO2").Range("C5").Resize(UBound(aTon), 6) = aTon 'Giam hang ton kho
End Sub
Chào bạn

Mình thấy bạn rất giỏi, mình có thể thêm nhiều điều kiện trên phiếu xuất kho ( Bill , HĐ, TK, ngày nhập)
Và trừ lùi số lượng trên sheet total ( thường này mình làm tay dò từng mã mất khá nhiều thời gian )
Cám ơn bạn
 

File đính kèm

chào bạn
Bạn viết code hay quá, bạn có thể giúp mình viết code cho file xuất hàng và nhập FIFO với nhiều điều kiện


Chào bạn

Bạn viết code hay quá, giúp

Chào bạn

Mình thấy bạn rất giỏi, mình có thể thêm nhiều điều kiện trên phiếu xuất kho ( Bill , HĐ, TK, ngày nhập)
Và trừ lùi số lượng trên sheet total ( thường này mình làm tay dò từng mã mất khá nhiều thời gian )
Cám ơn bạn
Code không khó, chỉ không biết sheet out ban đầu có gì, chay code ra kết quả như thế nào?
 

File đính kèm

của mình cũng gần giống với bạn ở trên , minh có note lại thông tin
Nhờ bạn giúp dùm

cám ơn bạn
Gởi lại file thêm ví dụ của 2 tình huống:
1/ Nếu ( Bill , HD,TK, ngày nhập ) số lương không đủ sẽ lấy ( bill, HD,TK, ngày nhập) của lô kế tiếp
2/ Nếu không có sẽ báo thiếu và tô màu vàng
 
Gởi lại file thêm ví dụ của 2 tình huống:
1/ Nếu ( Bill , HD,TK, ngày nhập ) số lương không đủ sẽ lấy ( bill, HD,TK, ngày nhập) của lô kế tiếp
2/ Nếu không có sẽ báo thiếu và tô màu vàng
mình gửi lại bạn file, mình có làm ví dụ 2 trường hợp
cám ơn bạn nha
 

File đính kèm

mình gửi lại bạn file, mình có làm ví dụ 2 trường hợp
cám ơn bạn nha
Không được chen ngang dữ liệu lung tung
Kiểm tra lại code theo file đính kèm.
Mã:
Option Explicit
Sub XYZ()
  Dim aNhap(), aTon#(), aDH(), aXuat(), res(), S, dic As Object
  Dim sRow&, sR&, i&, k&, r&, j&, iKey, sl#
 
  With Sheets("Total")
    i = .Range("C" & Rows.Count).End(xlUp).Row
    If i < 3 Then MsgBox ("Khong co Hang Nhap!"): Exit Sub
    aNhap = .Range("C3:I" & i).Value
    sRow = UBound(aNhap)
    ReDim aTon(1 To sRow, 1 To 2)
  End With
  With Sheets("out")
    i = .Range("G" & Rows.Count).End(xlUp).Row
    If i > 4 Then .Range("G5:M" & i).ClearContents
    i = .Range("A" & Rows.Count).End(xlUp).Row
    If i < 6 Then MsgBox ("Khong co don hang!"): Exit Sub
    aDH = .Range("A6:B" & i).Value
  End With
  sR = UBound(aDH)
  ReDim aXuat(1 To sR * 3, 1 To 6)
  Set dic = CreateObject("scripting.dictionary")
  For i = 1 To sR
    iKey = aDH(i, 1)
    If dic.exists(iKey) = False Then
      dic.Add iKey, Array(aDH(i, 2))
    Else 'Gop code xuat kho giong nhau
      S = dic.Item(iKey)
      S(0) = S(0) + aDH(i, 2)
    End If
  Next i
  For i = 1 To sRow
    aTon(i, 2) = aNhap(i, 7)
    iKey = aNhap(i, 1)
    If dic.exists(iKey) = True Then
      S = dic.Item(iKey)
      If S(0) > 0 Then
        k = k + 1
        aXuat(k, 1) = iKey
        aXuat(k, 3) = aNhap(i, 3)
        aXuat(k, 4) = aNhap(i, 4)
        aXuat(k, 5) = aNhap(i, 5)
        aXuat(k, 6) = aNhap(i, 6)
        sl = S(0)
        If aTon(i, 2) >= sl Then
          aTon(i, 1) = aTon(i, 1) + sl
          aTon(i, 2) = aTon(i, 2) - sl
          aXuat(k, 2) = sl
          S(0) = 0
        Else
          aTon(i, 1) = aTon(i, 2)
          aTon(i, 2) = 0
          aXuat(k, 2) = aTon(i, 1)
          S(0) = sl - aXuat(k, 2)
        End If
        ReDim Preserve S(0 To UBound(S) + 1)
        S(UBound(S)) = k
        dic.Item(iKey) = S
      End If
    End If
  Next i
 
  Sheets("Total").Range("J3").Resize(sRow, 2) = aTon
  If k Then
    ReDim res(1 To k, 1 To 7)
    For Each iKey In dic.keys
      S = dic.Item(iKey)
      For i = 1 To UBound(S)
        r = r + 1
        For j = 1 To 6
          res(r, j) = aXuat(S(i), j)
        Next j
        If S(0) > 0 Then res(r, 7) = "Thieu " & S(0)
      Next i
    Next iKey
    Sheets("out").Range("G5").Resize(k, 7) = res
    Range("K5").Resize(k).NumberFormat = "#"
  End If
End Sub
 

File đính kèm

Không được chen ngang dữ liệu lung tung
Kiểm tra lại code theo file đính kèm.
Mã:
Option Explicit
Sub XYZ()
  Dim aNhap(), aTon#(), aDH(), aXuat(), res(), S, dic As Object
  Dim sRow&, sR&, i&, k&, r&, j&, iKey, sl#
 
  With Sheets("Total")
    i = .Range("C" & Rows.Count).End(xlUp).Row
    If i < 3 Then MsgBox ("Khong co Hang Nhap!"): Exit Sub
    aNhap = .Range("C3:I" & i).Value
    sRow = UBound(aNhap)
    ReDim aTon(1 To sRow, 1 To 2)
  End With
  With Sheets("out")
    i = .Range("G" & Rows.Count).End(xlUp).Row
    If i > 4 Then .Range("G5:M" & i).ClearContents
    i = .Range("A" & Rows.Count).End(xlUp).Row
    If i < 6 Then MsgBox ("Khong co don hang!"): Exit Sub
    aDH = .Range("A6:B" & i).Value
  End With
  sR = UBound(aDH)
  ReDim aXuat(1 To sR * 3, 1 To 6)
  Set dic = CreateObject("scripting.dictionary")
  For i = 1 To sR
    iKey = aDH(i, 1)
    If dic.exists(iKey) = False Then
      dic.Add iKey, Array(aDH(i, 2))
    Else 'Gop code xuat kho giong nhau
      S = dic.Item(iKey)
      S(0) = S(0) + aDH(i, 2)
    End If
  Next i
  For i = 1 To sRow
    aTon(i, 2) = aNhap(i, 7)
    iKey = aNhap(i, 1)
    If dic.exists(iKey) = True Then
      S = dic.Item(iKey)
      If S(0) > 0 Then
        k = k + 1
        aXuat(k, 1) = iKey
        aXuat(k, 3) = aNhap(i, 3)
        aXuat(k, 4) = aNhap(i, 4)
        aXuat(k, 5) = aNhap(i, 5)
        aXuat(k, 6) = aNhap(i, 6)
        sl = S(0)
        If aTon(i, 2) >= sl Then
          aTon(i, 1) = aTon(i, 1) + sl
          aTon(i, 2) = aTon(i, 2) - sl
          aXuat(k, 2) = sl
          S(0) = 0
        Else
          aTon(i, 1) = aTon(i, 2)
          aTon(i, 2) = 0
          aXuat(k, 2) = aTon(i, 1)
          S(0) = sl - aXuat(k, 2)
        End If
        ReDim Preserve S(0 To UBound(S) + 1)
        S(UBound(S)) = k
        dic.Item(iKey) = S
      End If
    End If
  Next i
 
  Sheets("Total").Range("J3").Resize(sRow, 2) = aTon
  If k Then
    ReDim res(1 To k, 1 To 7)
    For Each iKey In dic.keys
      S = dic.Item(iKey)
      For i = 1 To UBound(S)
        r = r + 1
        For j = 1 To 6
          res(r, j) = aXuat(S(i), j)
        Next j
        If S(0) > 0 Then res(r, 7) = "Thieu " & S(0)
      Next i
    Next iKey
    Sheets("out").Range("G5").Resize(k, 7) = res
    Range("K5").Resize(k).NumberFormat = "#"
  End If
End Sub
hi,bạn
file chạy mượt, bạn cho mình xin địa chỉ mail nha
Mình muốn inbox riêng bạn

cám ơn bạn
 
Hi Bạn
Mình tính xin mail của bạn để gửi video quay màn hình cho bạn
* Tất cả mã đều bị luôn bạn
cám ơn bạn
Thiếu lệnh
dic.Item(iKey) = S
Mã:
Sub XYZ()
  Dim aNhap(), aTon#(), aDH(), aXuat(), res(), S, dic As Object
  Dim sRow&, sR&, i&, k&, r&, j&, iKey, sl#
 
  With Sheets("Total")
    i = .Range("C" & Rows.Count).End(xlUp).Row
    If i < 3 Then MsgBox ("Khong co Hang Nhap!"): Exit Sub
    aNhap = .Range("C3:I" & i).Value
    sRow = UBound(aNhap)
    ReDim aTon(1 To sRow, 1 To 2)
  End With
  With Sheets("out") 'sl out
    i = .Range("G" & Rows.Count).End(xlUp).Row
    If i > 4 Then .Range("G5:M" & i).ClearContents
    i = .Range("A" & Rows.Count).End(xlUp).Row
    If i < 6 Then MsgBox ("Khong co don hang!"): Exit Sub
    aDH = .Range("A6:B" & i).Value
  End With
  sR = UBound(aDH)
  ReDim aXuat(1 To sR * 3, 1 To 6)
  Set dic = CreateObject("scripting.dictionary")
  For i = 1 To sR
    iKey = aDH(i, 1)
    If dic.exists(iKey) = False Then
      dic.Add iKey, Array(aDH(i, 2))
    Else 'Gop code xuat kho giong nhau
      S = dic.Item(iKey)
      S(0) = S(0) + aDH(i, 2)
      dic.Item(iKey) = S
    End If
  Next i
  For i = 1 To sRow
    aTon(i, 2) = aNhap(i, 7)
    iKey = aNhap(i, 1)
    If dic.exists(iKey) = True Then
      S = dic.Item(iKey)
      If S(0) > 0 Then
        k = k + 1
        aXuat(k, 1) = iKey
        aXuat(k, 3) = aNhap(i, 3)
        aXuat(k, 4) = aNhap(i, 4)
        aXuat(k, 5) = aNhap(i, 5)
        aXuat(k, 6) = aNhap(i, 6)
        sl = S(0)
        If aTon(i, 2) >= sl Then
          aTon(i, 1) = aTon(i, 1) + sl
          aTon(i, 2) = aTon(i, 2) - sl
          aXuat(k, 2) = sl
          S(0) = 0
        Else
          aTon(i, 1) = aTon(i, 2)
          aTon(i, 2) = 0
          aXuat(k, 2) = aTon(i, 1)
          S(0) = sl - aXuat(k, 2)
        End If
        ReDim Preserve S(0 To UBound(S) + 1)
        S(UBound(S)) = k
        dic.Item(iKey) = S
      End If
    End If
  Next i
 
  Sheets("Total").Range("J3").Resize(sRow, 2) = aTon
  If k Then
    ReDim res(1 To k, 1 To 7)
    For Each iKey In dic.keys
      S = dic.Item(iKey)
      For i = 1 To UBound(S)
        r = r + 1
        For j = 1 To 6
          res(r, j) = aXuat(S(i), j)
        Next j
        If S(0) > 0 Then res(r, 7) = "Thieu " & S(0)
      Next i
    Next iKey
    Sheets("out").Range("G5").Resize(k, 7) = res
    Range("K5").Resize(k).NumberFormat = "#"
  End If
End Sub
 
Thiếu lệnh
dic.Item(iKey) = S
Mã:
Sub XYZ()
  Dim aNhap(), aTon#(), aDH(), aXuat(), res(), S, dic As Object
  Dim sRow&, sR&, i&, k&, r&, j&, iKey, sl#
 
  With Sheets("Total")
    i = .Range("C" & Rows.Count).End(xlUp).Row
    If i < 3 Then MsgBox ("Khong co Hang Nhap!"): Exit Sub
    aNhap = .Range("C3:I" & i).Value
    sRow = UBound(aNhap)
    ReDim aTon(1 To sRow, 1 To 2)
  End With
  With Sheets("out") 'sl out
    i = .Range("G" & Rows.Count).End(xlUp).Row
    If i > 4 Then .Range("G5:M" & i).ClearContents
    i = .Range("A" & Rows.Count).End(xlUp).Row
    If i < 6 Then MsgBox ("Khong co don hang!"): Exit Sub
    aDH = .Range("A6:B" & i).Value
  End With
  sR = UBound(aDH)
  ReDim aXuat(1 To sR * 3, 1 To 6)
  Set dic = CreateObject("scripting.dictionary")
  For i = 1 To sR
    iKey = aDH(i, 1)
    If dic.exists(iKey) = False Then
      dic.Add iKey, Array(aDH(i, 2))
    Else 'Gop code xuat kho giong nhau
      S = dic.Item(iKey)
      S(0) = S(0) + aDH(i, 2)
      dic.Item(iKey) = S
    End If
  Next i
  For i = 1 To sRow
    aTon(i, 2) = aNhap(i, 7)
    iKey = aNhap(i, 1)
    If dic.exists(iKey) = True Then
      S = dic.Item(iKey)
      If S(0) > 0 Then
        k = k + 1
        aXuat(k, 1) = iKey
        aXuat(k, 3) = aNhap(i, 3)
        aXuat(k, 4) = aNhap(i, 4)
        aXuat(k, 5) = aNhap(i, 5)
        aXuat(k, 6) = aNhap(i, 6)
        sl = S(0)
        If aTon(i, 2) >= sl Then
          aTon(i, 1) = aTon(i, 1) + sl
          aTon(i, 2) = aTon(i, 2) - sl
          aXuat(k, 2) = sl
          S(0) = 0
        Else
          aTon(i, 1) = aTon(i, 2)
          aTon(i, 2) = 0
          aXuat(k, 2) = aTon(i, 1)
          S(0) = sl - aXuat(k, 2)
        End If
        ReDim Preserve S(0 To UBound(S) + 1)
        S(UBound(S)) = k
        dic.Item(iKey) = S
      End If
    End If
  Next i
 
  Sheets("Total").Range("J3").Resize(sRow, 2) = aTon
  If k Then
    ReDim res(1 To k, 1 To 7)
    For Each iKey In dic.keys
      S = dic.Item(iKey)
      For i = 1 To UBound(S)
        r = r + 1
        For j = 1 To 6
          res(r, j) = aXuat(S(i), j)
        Next j
        If S(0) > 0 Then res(r, 7) = "Thieu " & S(0)
      Next i
    Next iKey
    Sheets("out").Range("G5").Resize(k, 7) = res
    Range("K5").Resize(k).NumberFormat = "#"
  End If
End Sub
vẫn bị giống vậy bạn ơi
Nhập 2 lệnh xuất, nhưng vẫn ghi nhận có 1 à bạn

cám ơn ban
 
Web KT

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

Back
Top Bottom