thanhtaiteo
Thành viên mới

- Tham gia
- 25/1/13
- Bài viết
- 35
- Được thích
- 1
Liệu đây có phải hàm bạn tìm kiếm: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
D5=IFERROR(LOOKUP(2,1/(IF(C5="",B5,C5)=I$5:I$28),K$5:K$28),"")
bạn xem công thức trong file nhé!
Vậy thử cách sau: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
=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),"")
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),"")
Chạy thử hàm sau, nhớ kết thúc bằng Ctrl+Shift+Enter: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 ạ
=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))
Chạy thử hàm sau, nhớ kết thúc bằng Ctrl+Shift+Enter:
Bạn cho mượn file 200.000 dòng thử xem.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))
Về VBA thua bác ạ hỏi anh HieuCD xem...
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.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 .
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.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
Góp vui với 1 cột phụ loại bỏ các ID có trướcEm 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
xem mãi mới hiểu giờ mới ngộ ra kém quá híc hícGóp vui với 1 cột phụ loại bỏ các ID có trước
Bạn dùng cột phụ và bảng phụ chưa nhiều nên chưa quen thôi, sau nầy bạn sẽ giỏi hơn mình.xem mãi mới hiểu giờ mới ngộ ra kém quá híc híc
Bạn chạy thử Sub này cho dữ liệu thật của bạn xem sao,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 ạ
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
hi hi biết bao giờ, em thì lười tìm hiểu rồi ^^Bạn dùng cột phụ và bảng phụ chưa nhiều nên chưa quen thôi, sau nầy bạn sẽ giỏi hơn mình.![]()
Thử codeHiệ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
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
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ỉ?Góp vui với 1 cột phụ loại bỏ các ID có trước
=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ềuAnh 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)
http://www.giaiphapexcel.com/dienda...hất-dựa-vào-điều-kiện-lọc.127619/#post-799207Anh 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, ">"&
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
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
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
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: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ình nghĩ bài nầy không dùng Pivot được do yêu cầu phức tạpVì 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![]()
Do bạn ẩn cột nên tôi bị nhầm, đoạn này phải như vầy: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
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
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.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