Lấy hóa đơn đầu vào cho hóa đơn đầu ra (3 người xem)

Liên hệ QC

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

queluatb

Thành viên thường trực
Tham gia
17/1/11
Bài viết
350
Được thích
41
Em xin nhờ các anh/chị hỗ trợ giúp em lấy thông tin hóa đơn từ Sheet BK_N sang Sheet HD theo tên vật tư chi tiết như sau
Dữ liệu nguồn: Sheet HD (có thông tin vật tư xuất hóa đơn) và Sheet BK_N (có số lượng và các thông tin theo hóa đơn mua vào), thông tin được tìm kiếm dựa theo cột E Sheet HD
- Lấy tên vật tư (cột E)
- Tìm trong Sheet BK_N các dòng có cùng tên vật tư
Khi tìm thấy vật tư trùng:
- Lấy Số lượng từ Sheet BK_N (cột N)
- Trừ đi Số lượng từ Sheet HD (cột G)
- Nếu vẫn còn dư (>0):
* Lấy thông tin tương ứng ngày hóa đơn (W), số hóa đơn (X), mã khách (D), tên khách (E) từ Sheet BH_N sang Sheet HD tương ứng
* Tiếp tục trừ cho các dòng tiếp theo CÙNG tên vật tư trong Sheet HD
- Nếu vẫn dư < 0:
* Láy số lượng còn dư (dương) của hóa đơn trước và thông tin tương ứng ngày hóa đơn (W), số hóa đơn (X), mã khách (D), tên khách (E) từ Sheet BH_N sang Sheet HD tương ứng
* Đồng thời lấy hóa đơn tiếp theo của BK_N để bù vào phần <0 mà hóa đơn trước trừ lừi và thông tin tương ứng ngày hóa đơn (W), số hóa đơn (X), mã khách (D), tên khách (E) từ Sheet BH_N sang Sheet HD tương ứng
* Tiếp tục nếu vẫn dư (>0) trở lại bước trên
em xin gửi file đính kèm và có kết quả mong muốn ở trong file xin nhờ anh/chị giúp đỡ
em xin cám ơn
 

File đính kèm

Em xin nhờ các anh/chị hỗ trợ giúp em lấy thông tin hóa đơn từ Sheet BK_N sang Sheet HD theo tên vật tư chi tiết như sau
Dữ liệu nguồn: Sheet HD (có thông tin vật tư xuất hóa đơn) và Sheet BK_N (có số lượng và các thông tin theo hóa đơn mua vào), thông tin được tìm kiếm dựa theo cột E Sheet HD
- Lấy tên vật tư (cột E)
- Tìm trong Sheet BK_N các dòng có cùng tên vật tư
Khi tìm thấy vật tư trùng:
- Lấy Số lượng từ Sheet BK_N (cột N)
- Trừ đi Số lượng từ Sheet HD (cột G)
- Nếu vẫn còn dư (>0):
* Lấy thông tin tương ứng ngày hóa đơn (W), số hóa đơn (X), mã khách (D), tên khách (E) từ Sheet BH_N sang Sheet HD tương ứng
* Tiếp tục trừ cho các dòng tiếp theo CÙNG tên vật tư trong Sheet HD
- Nếu vẫn dư < 0:
* Láy số lượng còn dư (dương) của hóa đơn trước và thông tin tương ứng ngày hóa đơn (W), số hóa đơn (X), mã khách (D), tên khách (E) từ Sheet BH_N sang Sheet HD tương ứng
* Đồng thời lấy hóa đơn tiếp theo của BK_N để bù vào phần <0 mà hóa đơn trước trừ lừi và thông tin tương ứng ngày hóa đơn (W), số hóa đơn (X), mã khách (D), tên khách (E) từ Sheet BH_N sang Sheet HD tương ứng
* Tiếp tục nếu vẫn dư (>0) trở lại bước trên
em xin gửi file đính kèm và có kết quả mong muốn ở trong file xin nhờ anh/chị giúp đỡ
em xin cám ơn
Khó hiểu quá, cách giải thích và cách làm của bạn xem mà vẫn chưa hiểu.
 
Upvote 0
Em xin nhờ các anh/chị hỗ trợ giúp em lấy thông tin hóa đơn từ Sheet BK_N sang Sheet HD theo tên vật tư chi tiết như sau
Dữ liệu nguồn: Sheet HD (có thông tin vật tư xuất hóa đơn) và Sheet BK_N (có số lượng và các thông tin theo hóa đơn mua vào), thông tin được tìm kiếm dựa theo cột E Sheet HD
- Lấy tên vật tư (cột E)
- Tìm trong Sheet BK_N các dòng có cùng tên vật tư
Khi tìm thấy vật tư trùng:
- Lấy Số lượng từ Sheet BK_N (cột N)
- Trừ đi Số lượng từ Sheet HD (cột G)
- Nếu vẫn còn dư (>0):
* Lấy thông tin tương ứng ngày hóa đơn (W), số hóa đơn (X), mã khách (D), tên khách (E) từ Sheet BH_N sang Sheet HD tương ứng
* Tiếp tục trừ cho các dòng tiếp theo CÙNG tên vật tư trong Sheet HD
- Nếu vẫn dư < 0:
* Láy số lượng còn dư (dương) của hóa đơn trước và thông tin tương ứng ngày hóa đơn (W), số hóa đơn (X), mã khách (D), tên khách (E) từ Sheet BH_N sang Sheet HD tương ứng
* Đồng thời lấy hóa đơn tiếp theo của BK_N để bù vào phần <0 mà hóa đơn trước trừ lừi và thông tin tương ứng ngày hóa đơn (W), số hóa đơn (X), mã khách (D), tên khách (E) từ Sheet BH_N sang Sheet HD tương ứng
* Tiếp tục nếu vẫn dư (>0) trở lại bước trên
em xin gửi file đính kèm và có kết quả mong muốn ở trong file xin nhờ anh/chị giúp đỡ
em xin cám ơn
Kết quả trả về cột "T"
Mã:
Sub xyz()
  Dim arr(), aHD(), res(), col, a, dic As Object, VT$
  Dim sRow&, sCol&, sCol_2&, i&, r&, n&, j&, k&, sl#, t#
 
  Set dic = CreateObject("Scripting.Dictionary")
  With Sheets("BK_N")
    arr = .Range("D8", .Range("X" & Rows.Count).End(xlUp)).Value
  End With
  With Sheets("HD")
    aHD = .Range("A19", .Range("G" & Rows.Count).End(xlUp)).Value
  End With
  sRow = UBound(arr)
  For i = 1 To sRow
    If dic.exists(arr(i, 3)) = False Then
      dic(arr(i, 3)) = Array(1, i)
    Else
      a = dic(arr(i, 3))
      ReDim Preserve a(0 To UBound(a) + 1)
      a(UBound(a)) = i
      dic(arr(i, 3)) = a
    End If
  Next i
  col = Array(0, 20, 21, 1, 2, 3, 6)
 
  sRow = UBound(aHD):     sCol = UBound(aHD, 2):      sCol_2 = sCol - 2
  i = sRow * 3
  If i > 1000000 Then ReDim res(1 To 1000000, 1 To sCol) Else ReDim res(1 To i, 1 To sCol)
  For i = 1 To sRow
    If aHD(i, 1) <> Empty Then
      k = k + 1
      For j = 1 To sCol
        res(k, j) = aHD(i, j)
      Next j
    Else
      VT = aHD(i, 5)
      If dic.exists(VT) Then
        sl = aHD(i, 7)
        a = dic(VT)
        For n = a(0) To UBound(a)
          r = a(n)
          If arr(r, 11) > sl Then t = sl Else t = arr(r, 11)
          End If
          k = k + 1
          For j = 1 To sCol_2
            res(k, j) = arr(r, col(j))
          Next j
          res(k, sCol) = t
          arr(r, 11) = arr(r, 11) - t
          If arr(r, 11) = 0 Then a(0) = a(0) + 1
          sl = sl - t
          If sl = 0 Then
            dic(VT) = a
            Exit For
          End If
        Next n
      Else
        k = k + 1
        res(k, 5) = aHD(i, 5): res(k, sCol) = aHD(i, sCol)
      End If
    End If
  Next i
  With Sheets("HD")
    .Range("U19").Resize(k, 2).NumberFormat = "@"
    .Range("T19").Resize(k, sCol) = res
  End With
End Sub
 
Upvote 0
Kết quả trả về cột "T"
Mã:
Sub xyz()
  Dim arr(), aHD(), res(), col, a, dic As Object, VT$
  Dim sRow&, sCol&, sCol_2&, i&, r&, n&, j&, k&, sl#, t#
 
  Set dic = CreateObject("Scripting.Dictionary")
  With Sheets("BK_N")
    arr = .Range("D8", .Range("X" & Rows.Count).End(xlUp)).Value
  End With
  With Sheets("HD")
    aHD = .Range("A19", .Range("G" & Rows.Count).End(xlUp)).Value
  End With
  sRow = UBound(arr)
  For i = 1 To sRow
    If dic.exists(arr(i, 3)) = False Then
      dic(arr(i, 3)) = Array(1, i)
    Else
      a = dic(arr(i, 3))
      ReDim Preserve a(0 To UBound(a) + 1)
      a(UBound(a)) = i
      dic(arr(i, 3)) = a
    End If
  Next i
  col = Array(0, 20, 21, 1, 2, 3, 6)
 
  sRow = UBound(aHD):     sCol = UBound(aHD, 2):      sCol_2 = sCol - 2
  i = sRow * 3
  If i > 1000000 Then ReDim res(1 To 1000000, 1 To sCol) Else ReDim res(1 To i, 1 To sCol)
  For i = 1 To sRow
    If aHD(i, 1) <> Empty Then
      k = k + 1
      For j = 1 To sCol
        res(k, j) = aHD(i, j)
      Next j
    Else
      VT = aHD(i, 5)
      If dic.exists(VT) Then
        sl = aHD(i, 7)
        a = dic(VT)
        For n = a(0) To UBound(a)
          r = a(n)
          If arr(r, 11) > sl Then t = sl Else t = arr(r, 11)
          End If
          k = k + 1
          For j = 1 To sCol_2
            res(k, j) = arr(r, col(j))
          Next j
          res(k, sCol) = t
          arr(r, 11) = arr(r, 11) - t
          If arr(r, 11) = 0 Then a(0) = a(0) + 1
          sl = sl - t
          If sl = 0 Then
            dic(VT) = a
            Exit For
          End If
        Next n
      Else
        k = k + 1
        res(k, 5) = aHD(i, 5): res(k, sCol) = aHD(i, sCol)
      End If
    End If
  Next i
  With Sheets("HD")
    .Range("U19").Resize(k, 2).NumberFormat = "@"
    .Range("T19").Resize(k, sCol) = res
  End With
End Sub
vâng em xin cám ơn ạ
 
Upvote 0
Web KT

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

Back
Top Bottom