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

Liên hệ QC

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

guitarnguyen1989

Thành viên chính thức
Tham gia
31/7/16
Bài viết
59
Được thích
7
Help me !
Khi mình kiểm tra " hàng hóa" thì gắn cho nó một số lô (A1,A2,B1,B2....) , khi xuất kho thì số lô này thủ kho ghi lại , Mình làm cái bảng này mục đích là để đối chiếu xem thủ kho có xuất đúng quy trình FIFO ko !

Cần giúp :
Đổ dữ liệu cột số lô từ bảng nhập qua cột số lô bảng xuất . theo đều kiện FIFO ( nhập trước ,xuất trước ) .

Thanks mọi người !
 

File đính kèm

FIFO là gì, từ chuyên biệt thế này thì nên giải thích kỹ khi muốn được trợ giúp
 
Help me !
Khi mình kiểm tra " hàng hóa" thì gắn cho nó một số lô (A1,A2,B1,B2....) , khi xuất kho thì số lô này thủ kho ghi lại , Mình làm cái bảng này mục đích là để đối chiếu xem thủ kho có xuất đúng quy trình FIFO ko !

Cần giúp :
Đổ dữ liệu cột số lô từ bảng nhập qua cột số lô bảng xuất . theo đều kiện FIFO ( nhập trước ,xuất trước ) .

Cảm ơn mọi người !
Dùng 2 cột phụ, chỉ theo dõi tàm tạm
 

File đính kèm

Kết quả chưa đúng bạn ơi, Xuất mặt hàng A1 ngày 04 xuất 85 thì phải là lấy lô A-01 80, còn 5 thì bị không biết lấy từ lô nào ta. Dữ liệu này không chuẩn rồi
Chỉ theo dỏi "tàm tạm", 1 lần xuất có thể từ nhiều lô, kết quả là lô sau cùng "A-02"
 
Kết quả chưa đúng bạn ơi, Xuất mặt hàng A1 ngày 04 xuất 85 thì phải là lấy lô A-01 80, còn 5 thì bị không biết lấy từ lô nào ta. Dữ liệu này không chuẩn rồi

Mình cố ý để dử liệu như vậy :ví dụ như khi thủ kho xuất khống hoặc nhập liệu không chính xác thì mình có thể biết dc .
 
Chỉ theo dỏi "tàm tạm", 1 lần xuất có thể từ nhiều lô, kết quả là lô sau cùng "A-02"

Bạn có thể giúp mình khi xuất kho mà có sự giao nhau giữa 2 lô hàng thì điền vào cột số lô 2 số lô ( như : A01 = 5 và A02 7)
Bài đã được tự động gộp:

Dữ liệu ví dụ không chuẩn mà Fi với Fo kiểu gì???

Mình cố ý để dự liệu như vậy .
Khi thủ kho nhập sai dữ liệu , hoặc khống thì sẽ gắn giá trị " thiếu "

VÍ dụ :"A01 Xuat 80 thiếu 5" mình hiểu là lô A01 xuất 80 thiếu 5 ko có số lô
 
Bạn có thể giúp mình khi xuất kho mà có sự giao nhau giữa 2 lô hàng thì điền vào cột số lô 2 số lô ( như : A01 = 5 và A02 7)
Bài đã được tự động gộp:



Mình cố ý để dự liệu như vậy .
Khi thủ kho nhập sai dữ liệu , hoặc khống thì sẽ gắn giá trị " thiếu "

VÍ dụ :"A01 Xuat 80 thiếu 5" mình hiểu là lô A01 xuất 80 thiếu 5 ko có số lô
Công thức khá rối, dùng code VBA chạy Macro được không?
 
Bạn kiểm tra file
 

File đính kèm

Lần chỉnh sửa cuối:
Dc bạn ! nếu dung code dc thì quá tốt . Cảm ơn
Chạy code
Mã:
Sub GPE()
  Dim sArr(), dArr(), Res()
  Dim i As Long, n As Long, sRow As Long
  Dim sNhap As Double, sXuat As Double
  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
    sArr = .Range("A3:D" & i).Value
    i = .Range("F" & Rows.Count).End(xlUp).Row
    If i < 3 Then MsgBox ("Khong co du lieu"): Exit Sub
    dArr = .Range("F3:H" & i).Value
    sRow = UBound(dArr)
    ReDim Res(1 To sRow, 1 To 1)
  End With
  For i = 1 To sRow
    sXuat = dArr(i, 3):    Ma = dArr(i, 2): tmp = ""
    If Len(Ma) > 0 And sXuat > 0 Then
      For n = 1 To UBound(sArr)
        If sArr(n, 2) = Ma Then
          sNhap = sArr(n, 3)
          If sNhap > 0 Then
            If sNhap >= sXuat Then
              Res(i, 1) = tmp & sArr(n, 4)
              If Len(tmp) > 0 Then Res(i, 1) = Res(i, 1) & "(" & sXuat & ")"
              sArr(n, 3) = sNhap - sXuat
              sXuat = 0
              Exit For
            Else
              tmp = tmp & sArr(n, 4) & "(" & sNhap & "); "
              sArr(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
 

File đính kèm

Chạy code
Mã:
Sub GPE()
  Dim sArr(), dArr(), Res()
  Dim i As Long, n As Long, sRow As Long
  Dim sNhap As Double, sXuat As Double
  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
    sArr = .Range("A3:D" & i).Value
    i = .Range("F" & Rows.Count).End(xlUp).Row
    If i < 3 Then MsgBox ("Khong co du lieu"): Exit Sub
    dArr = .Range("F3:H" & i).Value
    sRow = UBound(dArr)
    ReDim Res(1 To sRow, 1 To 1)
  End With
  For i = 1 To sRow
    sXuat = dArr(i, 3):    Ma = dArr(i, 2): tmp = ""
    If Len(Ma) > 0 And sXuat > 0 Then
      For n = 1 To UBound(sArr)
        If sArr(n, 2) = Ma Then
          sNhap = sArr(n, 3)
          If sNhap > 0 Then
            If sNhap >= sXuat Then
              Res(i, 1) = tmp & sArr(n, 4)
              If Len(tmp) > 0 Then Res(i, 1) = Res(i, 1) & "(" & sXuat & ")"
              sArr(n, 3) = sNhap - sXuat
              sXuat = 0
              Exit For
            Else
              tmp = tmp & sArr(n, 4) & "(" & sNhap & "); "
              sArr(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
thank you so much !!!!
 
-> Theo nguyên tắc FiFo thì code này hợp lý



-> Anh phải dựa vào ngày nhập và ngày xuất để tính FiFo nữa. Với bài anh code hiện tại thì chưa chuẩn...
ĐÚNG RỒI ANH ! MÌNH CÓ THỂ THÊM 1 ĐỀU KIỆN NỬA KO :
Nếu ngày xuất > ngày nhập và số lượng xuất > số lượng nhập thì xuất nếu không thì gắn 1 giá trị nào đó để nhận biết dc !!!!
Bài đã được tự động gộp:

Chạy code
Mã:
Sub GPE()
  Dim sArr(), dArr(), Res()
  Dim i As Long, n As Long, sRow As Long
  Dim sNhap As Double, sXuat As Double
  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
    sArr = .Range("A3:D" & i).Value
    i = .Range("F" & Rows.Count).End(xlUp).Row
    If i < 3 Then MsgBox ("Khong co du lieu"): Exit Sub
    dArr = .Range("F3:H" & i).Value
    sRow = UBound(dArr)
    ReDim Res(1 To sRow, 1 To 1)
  End With
  For i = 1 To sRow
    sXuat = dArr(i, 3):    Ma = dArr(i, 2): tmp = ""
    If Len(Ma) > 0 And sXuat > 0 Then
      For n = 1 To UBound(sArr)
        If sArr(n, 2) = Ma Then
          sNhap = sArr(n, 3)
          If sNhap > 0 Then
            If sNhap >= sXuat Then
              Res(i, 1) = tmp & sArr(n, 4)
              If Len(tmp) > 0 Then Res(i, 1) = Res(i, 1) & "(" & sXuat & ")"
              sArr(n, 3) = sNhap - sXuat
              sXuat = 0
              Exit For
            Else
              tmp = tmp & sArr(n, 4) & "(" & sNhap & "); "
              sArr(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
MÌNH CÓ THỂ THÊM 1 ĐỀU KIỆN NỬA KO :
Nếu ngày xuất > ngày nhập và số lượng xuất > số lượng nhập thì xuất nếu không thì gắn 1 giá trị nào đó để nhận biết !!!!
 
ĐÚNG RỒI ANH ! MÌNH CÓ THỂ THÊM 1 ĐỀU KIỆN NỬA KO :
Nếu ngày xuất > ngày nhập và số lượng xuất > số lượng nhập thì xuất nếu không thì gắn 1 giá trị nào đó để nhận biết dc !!!!
Bài đã được tự động gộp:


MÌNH CÓ THỂ THÊM 1 ĐỀU KIỆN NỬA KO :
Nếu ngày xuất > ngày nhập và số lượng xuất > số lượng nhập thì xuất nếu không thì gắn 1 giá trị nào đó để nhận biết !!!!
Bạn đã kiểm tra file của tôi chưa vậy? Cái này vô lý này: số lượng xuất > số lượng nhập
 
Bạn đã kiểm tra file của tôi chưa vậy? Cái này vô lý này: số lượng xuất > số lượng nhập
sorry số luong xuất > sl nhập , mình ghi nhầm

File mình đã xem , thanks bạn .
Có thể thểm đều kiện là ngày xuất >= ngày nhập và số xuất < số nhập thì xuất , còn lại mình sẽ gắn 1 giá trị để nhận biết ! Help me
 
sorry số luong xuất > sl nhập , mình ghi nhầm

File mình đã xem , Cảm ơn bạn .
Có thể thểm đều kiện là ngày xuất >= ngày nhập và số xuất < số nhập thì xuất , còn lại mình sẽ gắn 1 giá trị để nhận biết ! Help me
Bạn xem rồi mà bạn không thấy mấy cái phần số lô để trắng đó ah??
 
-> Theo nguyên tắc FiFo thì code này hợp lý



-> Anh phải dựa vào ngày nhập và ngày xuất để tính FiFo nữa. Với bài anh code hiện tại thì chưa chuẩn...
ĐÚNG RỒI ANH ! MÌNH CÓ THỂ THÊM 1 ĐỀU KIỆN NỬA KO :
Nếu ngày xuất > ngày nhập và số lượng xuất > số lượng nhập thì xuất nếu không thì gắn 1 giá trị nào đó để nhận biết dc !!!!
Bài đã được tự động gộp:


MÌNH CÓ THỂ THÊM 1 ĐỀU KIỆN NỬA KO :
Nếu ngày xuất > ngày nhập và số lượng xuất > số lượng nhập thì xuất nếu không thì gắn 1 giá trị nào đó để nhận biết !!!!
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
 
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
 

ý mình giờ là mình xuất bao nhiêu=> cột Tổng xuất kho đều phải ghi nhận để trừ lùi cho đúng

* 1 mã hàng mình có thể xuất nhiều lần với nhiều ngày khác nhau

bạn cho minh địa chỉ mail , mình gửi chắc bạn sẽ hiểu rõ hơn
cám ơn bạn
 

File đính kèm

ý mình giờ là mình xuất bao nhiêu=> cột Tổng xuất kho đều phải ghi nhận để trừ lùi cho đúng

* 1 mã hàng mình có thể xuất nhiều lần với nhiều ngày khác nhau

bạn cho minh địa chỉ mail , mình gửi chắc bạn sẽ hiểu rõ hơn
cám ơn bạn
Code chỉ chạy dữ liệu trong sheet "out"
Cần liên lạc bạn vào hộp đối thoại
 

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

Back
Top Bottom