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

Liên hệ QC

queluatb

Thành viên thường trực
Tham gia
17/1/11
Bài viết
345
Được thích
41
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
 

File đính kèm

  • Dotim.xlsb
    227.5 KB · Đọc: 33
Lần chỉnh sửa cuối:
Xin nhờ các/anh chị xem hỗ trợ giúp em với ạ. Em xin cám ơn
 
Upvote 0
Xin nhờ các/anh chị xem hỗ trợ giúp em với ạ. 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ý
 
Upvote 0
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

Bạn đang trình bày những gì mình hiểu; Chưa phải là những gì để người khác hiểu.
Ví dụ:

Hiện tại em muốn dò tìm để lấy danh mục vật tư (DMVT) qua các sheet, . . .
Lấy DMVT từ trang nào?
Phải cụ thể qua các sheet tên là gì, (nếu hơn 3 trang thì chí ít phải ví dụ 2 tên trang
 
Upvote 0
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
 

File đính kèm

  • Dotim (1).xlsb
    208.2 KB · Đọc: 21
Upvote 0
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 . .
Mã:
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
 
Upvote 0
=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é
 
Upvote 0
Kiểm tra lại . .
Mã:
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
em cám ơn anh nhiều, để em kiểm tra ạ
 
Upvote 0
Web KT
Back
Top Bottom