Dò tìm nhiều điều kiện với ngày nhập trước ngày xuất

Chia sẻ bởi:hands
★★★★★
Quảng cáo

Em xin chào các anh/chị. Hiện tại em muốn dò tìm để lấy danh mục vật tư qua các sheet, tuy nhiên việc lấy danh mục của em thiếu chính xác do các điều kiện lấy không thỏa mãn, em đang mày mò học code mà không nghĩ được cách lấy sao cho chính xác.
Em có đính kèm file và mô tả thêm trong file, rất mong các anh/chị hỗ trợ giúp đỡ em
Em xin được bổ sung thêm Sheets(VJ) là Sheet nhập và ngày thanh toán là ngày nhập, Sheets(3T) là Sheet xuất
Em xin cám ơn

Đọc code của bạn và dữ liệu trong file thấy nhiều điểm còn mơ hồ
1/ dữ liệu thật được lưu ở mấy sheet? tên gì?
2/ dữ liệu các sheet có được xếp thứ tự theo thời gian?
3/ Số tiền có số âm không?
4/ Các cột số lượng luôn luôn =1?, nếu lớn hơn 1 thì cho ví dụ xử lý

Em xin cám ơn sự hỗ trợ của các anh. Em trình bày lại vấn đề như sau:

Trong file hiện em có 3 Sheet, Sheet VJ –> Sheet nhập, Sheet 3tsoft –> Sheet xuất, Sheet 1 –> Sheet để kiểm tra giữ liệu khi add Dic (Sheet này không liên quan với hai Sheet nhập, xuất)

Đầu tiên em có phát sinh nhập (Sheet VJ), tại Cột O em tạo danh mục vật tư theo "Cột C" PNR dựa theo ngày phát sinh và số thứ tự theo quy luật Mã/năm,tháng,ngày/STT
– Trong cùng một ngày không có phát sinh trùng PNR
Ví Dụ 1: VJ2209020021 –> Tương ứng "VJ = Mã", "220922 = năm, tháng, ngày", "0021 = STT"

Tại Sheet xuất (Sheet 3tsoft) em dựa theo "Cột K" PNR và "Cột R" Thành tiền để dò tìm qua Sheet nhập (Sheet VJ) tương ứng với "Cột C" Số vé và "Cột J " tiền trước thuế để lấy danh mục tại "Cột O" Sheet VJ sang "Cột K" Sheet 3tsoft

Tuy nhiên việc lấy dữ liệu như vậy của em không được chính xác do:
– Cùng PNR và khác số tiền sẽ lấy đúng được danh mục
– Cùng PNR và cùng số tiền sẽ bị sai danh mục, do chỉ lấy được danh mục tạo trước, danh mục tạo sau không lấy được
Ví Dụ 2: tại Sheet xuất (3tsoft) hiện tại em đang lọc PNR: K9N773, tương ứng với số tiền "1.338.000, 200.000, 200.000, 200.000, 860.000) em sẽ dò tìm qua Sheet nhập (VJ) lấy được danh mục vật tư tương ứng " VJ2209020021, VJ2209090026, VJ2209090026, VJ2209090026, VJ2209260026" –> Danh mục đúng là " VJ2209020021, VJ2209090026, VJ2209150047, VJ2209220033, VJ2209260026"
Việc dò tìm của em hiện chỉ đúng vơi PNR tương ứng với số tiền khác nhau "1.338.000 và 860.000" Số tiền trùng "200.000" thiếu chính xác do trùng cả PNR và số tiền

Em nhờ các anh/chị giúp em làm sao để lấy được chính xác danh mục vật tư có cùng PNR và cùng số tiền "200.000" như Ví Dụ 2 trên

– Dữ liệu của em được xắp xếp theo thời gian
– Số tiền có âm, tuy nhiên việc âm tiền sẽ đồng nhất cả Nhập và Xuất (cùng âm, hoặc cùng dương)
– Cột số lượng luôn có số lượng là 1, vì có 1 vé

Em xin gửi lại file đã filter lại

Em xin cám ơn anh/chị rất nhiều

Kiểm tra lại . .

Sub XYZ()        'Lay danh muc tu hang vao ehoadon B1
  Dim dic2 As Object, sh3T As Worksheet, shVJ As Worksheet
  Dim arr, a3T(), aVJ(), res()
  Dim sr3T&, srVJ&, i&, j&, r&, key$, ngay As Date

On Error Resume Next
  Set sh3T = Sheets("3tsoft")
  Set shVJ = Sheets("VJ")
  sh3T.ShowAllData
  shVJ.ShowAllData
On Error GoTo 0
  a3T = sh3T.Range("A3", sh3T.Range("R" & Rows.Count).End(xlUp)).Value
  aVJ = shVJ.Range("C3", shVJ.Range("O" & Rows.Count).End(xlUp)).Value
  sr3T = UBound(a3T):     srVJ = UBound(aVJ)
  ReDim res(1 To sr3T, 1 To 1)
  Set dic2 = CreateObject("Scripting.Dictionary")
  For i = 1 To srVJ
    key = aVJ(i, 1) & "|" & aVJ(i, 8)
    If dic2.exists(key) = False Then
      dic2.Add key, Array(1, i)
    Else
      arr = dic2(key)
      ReDim Preserve arr(0 To UBound(arr) + 1)
      arr(UBound(arr)) = i
      dic2(key) = arr
    End If
  Next i

For i = 1 To sr3T
    key = a3T(i, 11) & "|" & a3T(i, 18)
    If dic2.exists(key) Then
      arr = dic2(key)
      ngay = DateValue(Mid(a3T(i, 1), 7, 4) & Mid(a3T(i, 1), 3, 4) & Mid(a3T(i, 1), 1, 2))
      For j = arr(0) To UBound(arr)
        r = arr(j)
        If ngay >= aVJ(r, 2) Then
          res(i, 1) = aVJ(r, 13)
          arr(0) = j + 1
          dic2(key) = arr
          Exit For
        End If
      Next j
    End If
  Next i
  sh3T.Range("J3").Resize(sr3T, 1) = res
  Set dic2 = Nothing
End Sub

=IFERROR(INDEX(VJ!$O$3:$O$1959,MATCH(1,(VJ!$D$3:$D$1959=LARGE(IF(B3>IF(L3=VJ!$C$3:$C$1959,VJ!$D$3:$D$1959,""),IF(L3=VJ!$C$3:$C$1959,VJ!$D$3:$D$1959,"")),1))*(VJ!$C$3:$C$1959=L3),0)),"")
Bạn tham khảo thử xem nhé

www.giaiphapexcel.com/diendan/threads/d%C3%B2-t%C3%ACm-nhi%E1%BB%81u-%C4%91i%E1%BB%81u-ki%E1%BB%87n-v%E1%BB%9Bi-ng%C3%A0y-nh%E1%BA%ADp-tr%C6%B0%E1%BB%9Bc-ng%C3%A0y-xu%E1%BA%A5t.163527/

Khóa học Power PI – Ứng dung trong Nhân sự
Khóa học SprinGO phù hợp

Khóa học Power PI – Ứng dung trong Nhân sự

TỔNG QUAN KHÓA HỌC: POWER BI CHO NGÀNH NHÂN SỰ Khóa học Power BI cho Nhân sự được thiết kế dành riêng cho các...

Xem khóa học
★★★★★ 5 ★ 1 👤 0 ▥ 0
Quảng cáo

Bạn nên đọc

Bình luận

Quảng cáo

Cũ vẫn chất

Xem thêm