Cần hỗ trợ hàm VLookup tìm giá trị mới nhất (1 người xem)

Liên hệ QC

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

thanhtaiteo

Thành viên mới
Tham gia
25/1/13
Bài viết
35
Được thích
1
Hiện em gặp 1 ca khó nhờ các anh chị cao thủ xem giúp em với .
Có đính kèm file .

upload_2018-3-26_7-26-0.png
 

File đính kèm

bạn xem công thức trong file nhé!
 

File đính kèm

bạn xem công thức trong file nhé!

Cám ơn bác dazkangel và bác hoangminhtien ! nhưng em không hiểu tại sao trong công thức lại ko đề cập đến cột j
Vì cột j ( Last edit ) nó quyết định giá trị đó có phải là mới nhất hay không ?

Và khi em thay đổi thời gian cột J của case 122231943 về thời gian mới hơn thì, đáng lý ra kết quả phải trả vè là 21 nhưng công thức ko nhận ra dc, vẫn giữ nguyên là 26

Mong nhận được sự hỗ trợ thêm ạ .

upload_2018-3-26_8-38-43.png
 
Cám ơn bác dazkangel và bác hoangminhtien ! nhưng em không hiểu tại sao trong công thức lại ko đề cập đến cột j
Vì cột j ( Last edit ) nó quyết định giá trị đó có phải là mới nhất hay không ?

Và khi em thay đổi thời gian cột J của case 122231943 về thời gian mới hơn thì, đáng lý ra kết quả phải trả vè là 21 nhưng công thức ko nhận ra dc, vẫn giữ nguyên là 26

Mong nhận được sự hỗ trợ thêm ạ .

View attachment 192994
Vậy thử cách sau:
PHP:
=IFERROR(LOOKUP(2,1/(IF(C5="",B5,C5)&AGGREGATE(14,6,(IF(C5="",B5,C5)=I$5:I$28)*J$5:J$28,1)=I$5:I$28&J$5:J$28),K$5:K$28),"")
 
Lần chỉnh sửa cuối:
Vậy thử cách sau:
PHP:
=IFERROR(LOOKUP(2,1/(IF(C5="",B5,C5)&AGGREGATE(14,6,(IF(C5="",B5,C5)=I$5:I$28)*J$5:J$28,1)=I$5:I$28&J$5:J$28),K$5:K$28),"")

Thành công rồi bác dazkangel, nhưng em hơi đau đầu vì hiện tại em áp dụng thực tế thì file rất nặng hầu như công thức không chạy được .

Tìm kiếm kết quả của khoản 20.000 dòng với vùng dữ liệu là 200.000 dòng . Nó đứng mấy bác ạ .

Nếu bác có thể cho em xin cái code VBA để chạy đỡ nhọc nhằng hơn được ko ạ
 
Thành công rồi bác dazkangel, nhưng em hơi đau đầu vì hiện tại em áp dụng thực tế thì file rất nặng hầu như công thức không chạy được .

Tìm kiếm kết quả của khoản 20.000 dòng với vùng dữ liệu là 200.000 dòng . Nó đứng mấy bác ạ .

Nếu bác có thể cho em xin cái code VBA để chạy đỡ nhọc nhằng hơn được ko ạ
Chạy thử hàm sau, nhớ kết thúc bằng Ctrl+Shift+Enter:
PHP:
=INDIRECT("K"&4+MATCH(MAX((IF(C5="",B5,C5)=I$5:I$28)*J$5:J$28),(IF(C5="",B5,C5)=I$5:I$28)*J$5:J$28,0))
Bạn cho mượn file 200.000 dòng thử xem.
Về VBA thua bác ạ hỏi anh HieuCD xem...
 
Lần chỉnh sửa cuối:
Chạy thử hàm sau, nhớ kết thúc bằng Ctrl+Shift+Enter:
PHP:
=INDIRECT("K"&4+MATCH(MAX((IF(C5="",B5,C5)=I$5:I$28)*J$5:J$28),(IF(C5="",B5,C5)=I$5:I$28)*J$5:J$28,0))
Bạn cho mượn file 200.000 dòng thử xem.
Về VBA thua bác ạ hỏi anh HieuCD xem...

Bác có facebook và email không ? một số thông tin hơi nhạy cảm minh ko thể share trên đây được .
 
Bác có facebook và email không ? một số thông tin hơi nhạy cảm minh ko thể share trên đây được .
Mình có tạo ra 4 cột phụ, tuy nhìn rườm rà nhưng sẽ nhẹ hơn nhiều bạn thử làm theo xem.
Ẩn đi khi không muốn động tới.
 

File đính kèm

Mình có tạo ra 4 cột phụ, tuy nhìn rườm rà nhưng sẽ nhẹ hơn nhiều bạn thử làm theo xem.
Ẩn đi khi không muốn động tới.

Em thề là nghiên cứu nữa ngày ! mà em ko biết bác tạo thêm cột M N O Q để làm gì ạ ??



upload_2018-3-29_8-14-51.png
 

File đính kèm

Em thề là nghiên cứu nữa ngày ! mà em ko biết bác tạo thêm cột M N O Q để làm gì ạ ??



View attachment 193120
Khi 1 công thức mảng hoạt động nó phải chạy 1 mảng rất lớn, bạn càng lặp lại công thức nhiều lần thì nó càng rất nặng.
Nhưng nếu có mảng phụ ta không cần phải lặp lại mảng nữa nên giảm bớt được rất nhiều tài nguyên RAM.
Cơ bản thì bạn thấy nó chạy ổn chưa ?
 

File đính kèm

Tìm kiếm kết quả của khoản 20.000 dòng với vùng dữ liệu là 200.000 dòng . Nó đứng mấy bác ạ .

Nếu bác có thể cho em xin cái code VBA để chạy đỡ nhọc nhằng hơn được ko ạ
Bạn chạy thử Sub này cho dữ liệu thật của bạn xem sao,
PHP:
Public Sub GPE()
Dim Dic As Object, sArr(), tArr(), dArr(), Tem As String
Dim I As Long, J As Long, K As Long, R As Long, Rws As Long
Set Dic = CreateObject("Scripting.Dictionary")
    sArr = Range("i5", Range("i5").End(xlDown)).Resize(, 3).Value
    R = UBound(sArr)
    ReDim tArr(1 To R, 1 To 3)
    For I = 1 To R
        Tem = sArr(I, 1)
        If Not Dic.Exists(Tem) Then
            K = K + 1
            Dic.Item(Tem) = K
            For J = 1 To 3
                tArr(K, J) = sArr(I, J)
            Next J
        Else
            Rws = Dic.Item(Tem)
            If sArr(I, 2) > tArr(Rws, 2) Then
                tArr(Rws, 2) = sArr(I, 2)
                tArr(Rws, 3) = sArr(I, 3)
            End If
        End If
    Next I
    '-------------------------------------------'
    sArr = Range("b5", Range("b5").End(xlDown)).Resize(, 2).Value
    R = UBound(sArr)
    ReDim dArr(1 To R, 1 To 1)
    For I = 1 To R
        Tem = IIf(sArr(I, 2) <> Empty, sArr(I, 2), sArr(I, 1))
        If Dic.Exists(Tem) Then dArr(I, 1) = tArr(Dic.Item(Tem), 3)
    Next I
    'Range("m5").Resize(K, 3) = tArr '
    Range("d5").Resize(R) = dArr
Set Dic = Nothing
End Sub
 
Lần chỉnh sửa cuối:
Hiện em gặp 1 ca khó nhờ các anh chị cao thủ xem giúp em với .
Có đính kèm file .

View attachment 192990
Thử code
Mã:
Sub Result()
  Dim dArr As Variant, sArr As Variant, Arr As Variant
  Dim i As Long, key
  With Sheets("Sheet1")
    dArr = .Range("I5:K" & .Range("I" & Rows.Count).End(xlUp).Row).Value
    sArr = .Range("B5:C" & .Range("B" & Rows.Count).End(xlUp).Row).Value
  End With
  ReDim Arr(1 To UBound(sArr), 1 To 1)
  With CreateObject("Scripting.Dictionary")
    For i = 1 To UBound(dArr)
      key = dArr(i, 1)
      If Not .exists(key) Then .Add key, i Else If dArr(i, 2) > dArr(.Item(key), 2) Then .Item(key) = i
    Next i
    For i = 1 To UBound(sArr)
      If sArr(i, 2) = Empty Then sArr(i, 2) = sArr(i, 1)
      Arr(i, 1) = dArr(.Item(sArr(i, 2)), 3)
    Next i
  End With
  Sheets("Sheet1").Range("D5").Resize(UBound(Arr)) = Arr
End Sub
 

File đính kèm

Góp vui với 1 cột phụ loại bỏ các ID có trước
Anh giải thích sao phải cộng 0,0000001 được không anh ô kết quả số 7 sao bị lỗi nhỉ?
Em làm theo anh nhưng công thức khác thì nó chịu:
PHP:
=IF(SUMPRODUCT((I$5:I$28=I5)*(J$5:J$28>J5)),"",I5)
 
Anh giải thích sao phải cộng 0,0000001 được không anh ô kết quả số 7 sao bị lỗi nhỉ?
Em làm theo anh nhưng công thức khác thì nó chịu:
PHP:
=IF(SUMPRODUCT((I$5:I$28=I5)*(J$5:J$28>J5)),"",I5)
Mình không dùng hàm Sumproduct vì nó khá nặng khi dữ liệu nhiều
Dữ liệu thời gian rất khó chịu, mình cũng không biết lúc nào nó bị lổi như trong trường hợp nầy
Thời gian trong file tính tới giây, 1 giây = 1/24/60/60 = 0.0000116, nên mình cộng thêm 0.0000001 (trừ hao 7 số lẻ, thực ra chỉ cần 6 số lẻ 0.000001), không tăng thêm giây nào nhưng lớn hơn giá trị gốc để khử lổi điều kiện J$5:J$28, ">"&
 
Mình không dùng hàm Sumproduct vì nó khá nặng khi dữ liệu nhiều
Dữ liệu thời gian rất khó chịu, mình cũng không biết lúc nào nó bị lổi như trong trường hợp nầy
Thời gian trong file tính tới giây, 1 giây = 1/24/60/60 = 0.0000116, nên mình cộng thêm 0.0000001 (trừ hao 7 số lẻ, thực ra chỉ cần 6 số lẻ 0.000001), không tăng thêm giây nào nhưng lớn hơn giá trị gốc để khử lổi điều kiện J$5:J$28, ">"&

Em chân thành cám ơn sự hỗ trợ từ bác dazkangel, bác Ba Tê, Bác HieuCD

Em xin Summary lại vấn đề như sau ạ

upload_2018-3-31_10-42-56.png
 

File đính kèm

Em chân thành cám ơn sự hỗ trợ từ bác dazkangel, bác Ba Tê, Bác HieuCD

Em xin Summary lại vấn đề như sau ạ

View attachment 193220
PHP:
Public Sub GPE()
Dim Dic As Object, sArr(), tArr(), Tem As String
Dim I As Long, K As Long, R As Long, Rws As Long
Set Dic = CreateObject("Scripting.Dictionary")
    sArr = Sheets("App total").Range("G3", Sheets("App total").Range("G3").End(xlDown)).Resize(, 52).Value
    R = UBound(sArr)
    ReDim tArr(1 To R, 1 To 4)
    For I = 1 To R
        Tem = sArr(I, 1)
        If Not Dic.exists(Tem) Then
            K = K + 1
            Dic.Item(Tem) = K
            tArr(K, 1) = sArr(I, 1)
            tArr(K, 2) = sArr(I, 45)
            tArr(K, 3) = sArr(I, 15)
            tArr(K, 4) = sArr(I, 52)
        Else
            Rws = Dic.Item(Tem)
            If sArr(I, 45) > tArr(Rws, 2) Then
                tArr(Rws, 2) = sArr(I, 45)
                tArr(Rws, 3) = sArr(I, 15)
                tArr(Rws, 4) = sArr(I, 52)
            End If
        End If
    Next I
    '-------------------------------------------'
With Sheets("Details")
    sArr = .Range("cq2", .Range("cq2").End(xlDown)).Resize(, 3).Value
    R = UBound(sArr)
    ReDim Arr1(1 To R, 1 To 1)
    ReDim Arr2(1 To R, 1 To 1)
    For I = 1 To R
        Tem = IIf(sArr(I, 3) <> Empty, sArr(I, 3), sArr(I, 1))
        If Dic.exists(Tem) Then
            Arr1(I, 1) = tArr(Dic.Item(Tem), 3)
            Arr2(I, 1) = tArr(Dic.Item(Tem), 4)
        Else
            Arr1(I, 1) = "Not Created App"
        End If
    Next I
    .Range("fv2").Resize(R) = Arr1
    .Range("fy2").Resize(R) = Arr2
End With
Set Dic = Nothing
End Sub
 
Lần chỉnh sửa cuối:
Em chân thành cám ơn sự hỗ trợ từ bác dazkangel, bác Ba Tê, Bác HieuCD

Em xin Summary lại vấn đề như sau ạ

View attachment 193220
Mã:
Sub Result()
  Dim dID As Variant, dTime As Variant, dRes1 As Variant, dRes2 As Variant
  Dim ID1 As Variant, ID2 As Variant, Res1 As Variant, Res2 As Variant
  Dim i As Long, ik As Long, dsR As Long, sR As Long, key As String
 
  With Sheets("App total")
    dsR = .Range("G" & Rows.Count).End(xlUp).Row - 2
    If dsR < 1 Then MsgBox ("Khong co du lieu, thoat chuong trinh"): Exit Sub
    dID = .Range("G3").Resize(dsR).Value
    dTime = .Range("AY3").Resize(dsR).Value
    dRes1 = .Range("U3").Resize(dsR).Value
    dRes2 = .Range("BF3").Resize(dsR).Value
  End With
 
  With Sheets("Details")
    sR = .Range("CQ" & Rows.Count).End(xlUp).Row - 1
    If sR < 1 Then MsgBox ("Khong co du lieu, thoat chuong trinh"): Exit Sub
    ID1 = .Range("CQ2").Resize(sR).Value
    ID2 = .Range("CS2").Resize(sR).Value
  End With
  ReDim Res1(1 To sR, 1 To 1)
  ReDim Res2(1 To sR, 1 To 1)
  With CreateObject("Scripting.Dictionary")
    For i = 1 To dsR
      key = dID(i, 1)
      If Not .exists(key) Then .Add key, i Else If dTime(i, 1) > dTime(.Item(key), 1) Then .Item(key) = i
    Next i
  
    For i = 1 To sR
      If ID2(i, 1) = Empty Then key = ID1(i, 1) Else key = ID2(i, 1)
      ik = .Item(key)
      If ik Then
        Res1(i, 1) = dRes1(ik, 1)
        Res2(i, 1) = dRes2(ik, 1)
      Else
        Res1(i, 1) = "Not Created App"
      End If
    Next i
  End With
 
  With Sheets("Details")
    .Range("FV2").Resize(sR) = Res1
    .Range("FY2").Resize(sR) = Res2
  End With
End Sub
 
Mã:
Sub Result()
  Dim dID As Variant, dTime As Variant, dRes1 As Variant, dRes2 As Variant
  Dim ID1 As Variant, ID2 As Variant, Res1 As Variant, Res2 As Variant
  Dim i As Long, ik As Long, dsR As Long, sR As Long, key As String
 
  With Sheets("App total")
    dsR = .Range("G" & Rows.Count).End(xlUp).Row - 2
    If dsR < 1 Then MsgBox ("Khong co du lieu, thoat chuong trinh"): Exit Sub
    dID = .Range("G3").Resize(dsR).Value
    dTime = .Range("AY3").Resize(dsR).Value
    dRes1 = .Range("U3").Resize(dsR).Value
    dRes2 = .Range("BF3").Resize(dsR).Value
  End With
 
  With Sheets("Details")
    sR = .Range("CQ" & Rows.Count).End(xlUp).Row - 1
    If sR < 1 Then MsgBox ("Khong co du lieu, thoat chuong trinh"): Exit Sub
    ID1 = .Range("CQ2").Resize(sR).Value
    ID2 = .Range("CS2").Resize(sR).Value
  End With
  ReDim Res1(1 To sR, 1 To 1)
  ReDim Res2(1 To sR, 1 To 1)
  With CreateObject("Scripting.Dictionary")
    For i = 1 To dsR
      key = dID(i, 1)
      If Not .exists(key) Then .Add key, i Else If dTime(i, 1) > dTime(.Item(key), 1) Then .Item(key) = i
    Next i
 
    For i = 1 To sR
      If ID2(i, 1) = Empty Then key = ID1(i, 1) Else key = ID2(i, 1)
      ik = .Item(key)
      If ik Then
        Res1(i, 1) = dRes1(ik, 1)
        Res2(i, 1) = dRes2(ik, 1)
      Else
        Res1(i, 1) = "Not Created App"
      End If
    Next i
  End With
 
  With Sheets("Details")
    .Range("FV2").Resize(sR) = Res1
    .Range("FY2").Resize(sR) = Res2
  End With
End Sub
Vì không biết gì về code nên chế bằng pivot, anh xem kết quả đúng không nha:
 

File đính kèm

Vì không biết gì về code nên chế bằng pivot, anh xem kết quả đúng không nha:
Mình nghĩ bài nầy không dùng Pivot được do yêu cầu phức tạp
- Lấy tất cả các dòng theo sheet detail
- Lấy ID đã điều chỉnh và mới nhất ở 2 sheet
Pivot của bạn chỉ lấy tất cả các dòng của Sheets("App total") và xếp lại cột
Code VBA căn bản không khó hơn công thức Excel, bạn tập viết từ từ, sẽ nhớ các lệnh và quen cách tư duy lập trình, chia quá trình xử lý theo từng bước (tương tự như cột phụ excel)
Chúc bạn 1 ngày vui :)
 
Mình nghĩ bài nầy không dùng Pivot được do yêu cầu phức tạp
- Lấy tất cả các dòng theo sheet detail
- Lấy ID đã điều chỉnh và mới nhất ở 2 sheet
Pivot của bạn chỉ lấy tất cả các dòng của Sheets("App total") và xếp lại cột
Code VBA căn bản không khó hơn công thức Excel, bạn tập viết từ từ, sẽ nhớ các lệnh và quen cách tư duy lập trình, chia quá trình xử lý theo từng bước (tương tự như cột phụ excel)
Chúc bạn 1 ngày vui :)

Dạ em xin update lại thông tin như sau ạ .

Cách Pivot của bác dazkangle làm cho em có thêm 1 cách để giải quyết các vấn đề khác nữa ạ . Cám ơn bác .

Áp dụng theo 3 cách của Bác Dazkangel, bác HieuCD, bác Ba Tê thì cho kết quả như sau :

Trong kết quả của hàng trăm ngàn dòng thì lồi ra 5 case bị lệch result 1 của bác dankangel và bác HieuCD .

Em check tay thì kết quả của bác HieuCD có thể giúp em trọn vẹn cả đôi đường .

Vấn đề đã được giải quyết, em chân thành cám ơn 3 bác đã hỗ trợ cho em những ngày qua .

Em xin tri ân, để tỏ lòng biết ơn vì đã hỗ trợ, 3 bác cho em xin số điện thoại ạ . Thank you very much !!!!!

upload_2018-4-1_14-22-2.png
 

File đính kèm

  • upload_2018-4-1_14-14-35.png
    upload_2018-4-1_14-14-35.png
    37.7 KB · Đọc: 1
Dạ em xin update lại thông tin như sau ạ .

Cách Pivot của bác dazkangle làm cho em có thêm 1 cách để giải quyết các vấn đề khác nữa ạ . Cám ơn bác .

Áp dụng theo 3 cách của Bác Dazkangel, bác HieuCD, bác Ba Tê thì cho kết quả như sau :

Trong kết quả của hàng trăm ngàn dòng thì lồi ra 5 case bị lệch result 1 của bác dankangel và bác HieuCD .

Em check tay thì kết quả của bác HieuCD có thể giúp em trọn vẹn cả đôi đường .

Vấn đề đã được giải quyết, em chân thành cám ơn 3 bác đã hỗ trợ cho em những ngày qua .

Em xin tri ân, để tỏ lòng biết ơn vì đã hỗ trợ, 3 bác cho em xin số điện thoại ạ . Thank you very much !!!!!

View attachment 193242
Do bạn ẩn cột nên tôi bị nhầm, đoạn này phải như vầy:
(Đã sửa lại bài #22)
PHP:
With Sheets("Details")
    sArr = .Range("cq2", .Range("cq2").End(xlDown)).Resize(, 3).Value
    R = UBound(sArr)
    ReDim Arr1(1 To R, 1 To 1)
    ReDim Arr2(1 To R, 1 To 1)
    For i = 1 To R
        Tem = IIf(sArr(i, 3) <> Empty, sArr(i, 3), sArr(i, 1))'<------------'
        If Dic.exists(Tem) Then
            Arr1(i, 1) = tArr(Dic.Item(Tem), 3)
            Arr2(i, 1) = tArr(Dic.Item(Tem), 4)
        Else
            Arr1(i, 1) = "Not Created App"
        End If
    Next i
    .Range("fv2").Resize(R) = Arr1
    .Range("fy2").Resize(R) = Arr2
End With
 
Dạ em xin update lại thông tin như sau ạ .

Cách Pivot của bác dazkangle làm cho em có thêm 1 cách để giải quyết các vấn đề khác nữa ạ . Cám ơn bác .

Áp dụng theo 3 cách của Bác Dazkangel, bác HieuCD, bác Ba Tê thì cho kết quả như sau :

Trong kết quả của hàng trăm ngàn dòng thì lồi ra 5 case bị lệch result 1 của bác dankangel và bác HieuCD .

Em check tay thì kết quả của bác HieuCD có thể giúp em trọn vẹn cả đôi đường .

Vấn đề đã được giải quyết, em chân thành cám ơn 3 bác đã hỗ trợ cho em những ngày qua .

Em xin tri ân, để tỏ lòng biết ơn vì đã hỗ trợ, 3 bác cho em xin số điện thoại ạ . Thank you very much !!!!!

View attachment 193242
Với dữ liệu từ vài ngàn dòng thôi đã đuối rồi. Nên đành xài VBA vậy, cảm ơn trên đây là vui rồi bạn.
 

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

Back
Top Bottom