tangoctuan
Thành viên hoạt động



- Tham gia
- 22/4/08
- Bài viết
- 153
- Được thích
- 19
Chưa rõ quy tắc tìm số thứ tự, bạn giải thích tại sao E6 = 2?Chào các bạn!
Nhờ các bạn vui lòng giúp có cách nào tìm ra kết quả tại cột D theo như file mẫu gửi kèm (hiện đang phải làm thủ công bằng tay) được không ạ. Mong các bạn hỗ trợ.
Cảm ơn các bạn!
Cột C có phải "thời gian" đâu mà sắp xếp.Chào các bạn!
Nhờ các bạn vui lòng giúp có cách nào tìm ra kết quả tại cột D theo như file mẫu gửi kèm (hiện đang phải làm thủ công bằng tay) được không ạ. Mong các bạn hỗ trợ.
Cảm ơn các bạn!
=IF(B2="Tự động";COUNTIFS($A$2:$A$11;A2;$B$2:$B$11;"Tự động";$C$2:$C$11;"<="&C2);"")
Cám ơn bạn. Là như thế này bạn à.Chưa rõ quy tắc tìm số thứ tự, bạn giải thích tại sao E6 = 2?
Hic nó là dạng thời gian theo cách xuất dữ liệu logfile của hệ thống ghi chép tự động. Cám ơn bác. Để mình thử công thức này.Cột C có phải "thời gian" đâu mà sắp xếp.
Nếu đúng kiểu "thời gian" thì công thức ô D2:
PHP:=IF(B2="Tự động";COUNTIFS($A$2:$A$11;A2;$B$2:$B$11;"Tự động";$C$2:$C$11;"<="&C2);"")
Vì không phải dạng thời gian nên công thức này không dùng được. Có cách nào không bác? Mình thử với các hàm month, day, year, hour... thì vẫn trả ra được đúng, nhưng đây nó lại ghép với nhau trong cùng ô.Cột C có phải "thời gian" đâu mà sắp xếp.
Nếu đúng kiểu "thời gian" thì công thức ô D2:
PHP:=IF(B2="Tự động";COUNTIFS($A$2:$A$11;A2;$B$2:$B$11;"Tự động";$C$2:$C$11;"<="&C2);"")
Một là bạn tự chuyển nó về đúng dạng "thời gian", hai là dùng 1 cột phụ, viết công thức để chuyển như trong fileCám ơn bạn. Là như thế này bạn à.
Lọc Serial cột A với mã 1010619. Lọc Kích hoạt cột B là Thủ công. Thì sẽ ra được 2 dòng. Và tương ứng theo thời điểm kích hoạt (cột C) sẽ được như vậy.
![]()
Bài đã được tự động gộp:
Hic nó là dạng thời gian theo cách xuất dữ liệu logfile của hệ thống ghi chép tự động. Cám ơn bác. Để mình thử công thức này.
Bài đã được tự động gộp:
Vì không phải dạng thời gian nên công thức này không dùng được. Có cách nào không bác? Mình thử với các hàm month, day, year, hour... thì vẫn trả ra được đúng, nhưng đây nó lại ghép với nhau trong cùng ô.
Bạn thay COUNTIFS bằng SUMPRODUCT.Vì không phải dạng thời gian nên công thức này không dùng được. Có cách nào không bác? Mình thử với các hàm month, day, year, hour... thì vẫn trả ra được đúng, nhưng đây nó lại ghép với nhau trong cùng ô.
=IF($B2="Tự động",SUMPRODUCT(($A$2:$A$11=$A2)*($B$2:$B$11="Tự động")*($C$2:$C$11-C2<=0)),"")
=IF($B2="Thủ công",SUMPRODUCT(($A$2:$A$11=$A2)*($B$2:$B$11="Thủ công")*($C$2:$C$11-C2<=0)),"")
Tạm thời chỉ giúp được tới đây thôi, VBA cũng làm theo cách thủ công, nếu dữ liệu "khủng" chạy không nổi thì chờ các bạn khác vậy.Cảm ơn các bạn, công thức đều chạy ra kết quả đúng ý rồi, nhưng khi áp vào cho dữ liệu thực của mình thì không chạy được do dữ liệu nhiều quá, nhờ các bạn hỗ trợ giúp bằng VBA với. Xin cảm ơn!
Chạy codeChào các bạn!
Nhờ các bạn vui lòng giúp có cách nào tìm ra kết quả tại cột D theo như file mẫu gửi kèm (hiện đang phải làm thủ công bằng tay) được không ạ. Mong các bạn hỗ trợ.
Cảm ơn các bạn!
Sub XYZ()
Dim sArr(), Res()
Dim i&, k&, sRow&, iKey$, jC&
sArr = Range("A2:D" & Range("A" & Rows.Count).End(xlUp).Row).Value
sRow = UBound(sArr)
ReDim Preserve Res(1 To sRow, 1 To 2)
For i = 1 To sRow
sArr(i, 3) = DateSerial(Mid(sArr(i, 3), 7, 4), Mid(sArr(i, 3), 4, 2), Left(sArr(i, 3), 2)) _
+ TimeSerial(Mid(sArr(i, 3), 12, 2), Mid(sArr(i, 3), 15, 2), Right(sArr(i, 3), 2))
sArr(i, 4) = i
Next i
Range("AA2").Resize(sRow, 4) = sArr
Range("AA2").Resize(sRow, 4).Sort Key1:=Range("AA2"), Key2:=Range("AB2"), Key3:=Range("AC2")
sArr = Range("AA2").Resize(sRow, 4).Value
For i = 1 To sRow
If iKey <> sArr(i, 1) & sArr(i, 2) Then
iKey = sArr(i, 1) & sArr(i, 2)
k = 1
Else
k = k + 1
End If
If Mid(sArr(i, 2), 1, 2) = "Th" Then jC = 2 Else jC = 1
Res(sArr(i, 4), jC) = k
Next i
Range("D2").Resize(sRow, 2) = Res
Range("AA2").Resize(sRow, 4).ClearContents
End Sub
Code mình viết ít khi nào chạy hơn 1 phút, thường chỉ vài giâyChân thành cảm ơn các bạn rất nhiều! Code đã chạy ra kết quả đúng mong muốn, và lại rất nhanh, mất 2-3 phút là đã chạy xong rồi.
Dữ liệu bạn ấy hơn 500 ngàn dòng đó anh. Em chưa nghĩ được cách viết, code anh viết "hại não" quáCode mình viết ít khi nào chạy hơn 1 phút, thường chỉ vài giây
Chắc tại dữ liệu của mình hơi nhiều hoặc do máy tính cũng yếu nữa (máy i3).Code mình viết ít khi nào chạy hơn 1 phút, thường chỉ vài giây
Tạo 1.000.000 dòng bạn chạy thử xem thời gian như thế nào, máy mình 25 giâyDữ liệu bạn ấy hơn 500 ngàn dòng đó anh. Em chưa nghĩ được cách viết, code anh viết "hại não" quá![]()
Sub XYZ()
Dim sarr(), Res()
Dim i&, k&, sRow&, iKey$, jC&, t#
'Application.ScreenUpdating = False
i = Range("A" & Rows.Count).End(xlUp).Row
If i < 1000001 Then Call TaoDuLieu_1000000dong
t = Timer
sarr = Range("A2:D" & Range("A" & Rows.Count).End(xlUp).Row).Value
sRow = UBound(sarr)
ReDim Preserve Res(1 To sRow, 1 To 2)
For i = 1 To sRow
sarr(i, 3) = DateSerial(Mid(sarr(i, 3), 7, 4), Mid(sarr(i, 3), 4, 2), Left(sarr(i, 3), 2)) _
+ TimeSerial(Mid(sarr(i, 3), 12, 2), Mid(sarr(i, 3), 15, 2), Right(sarr(i, 3), 2))
sarr(i, 4) = i
Next i
Range("AA2").Resize(sRow, 4) = sarr
Range("AA2").Resize(sRow, 4).Sort Key1:=Range("AA2"), Key2:=Range("AB2"), Key3:=Range("AC2")
sarr = Range("AA2").Resize(sRow, 4).Value
For i = 1 To sRow
If iKey <> sarr(i, 1) & sarr(i, 2) Then
iKey = sarr(i, 1) & sarr(i, 2)
k = 1
Else
k = k + 1
End If
If Mid(sarr(i, 2), 1, 2) = "Th" Then jC = 2 Else jC = 1
Res(sarr(i, 4), jC) = k
Next i
Range("D2").Resize(sRow, 2) = Res
Range("AA2").Resize(sRow, 4).ClearContents
MsgBox (" Thoi gian: " & Timer - t & "Giay")
'Application.ScreenUpdating = True
End Sub
Sub TaoDuLieu_1000000dong()
Dim sarr(), Res() As String, i&, n&, j&, k&
sarr = Range("A2:D11").Value
ReDim Res(1 To 1000000, 1 To 3)
For n = 1 To 100000
For i = 1 To 10
k = k + 1
For j = 1 To 3
Res(k, j) = sarr(i, j)
Next j
Next i
Next n
Range("A2").Resize(1000000, 3) = Res
End Sub
Kinh khủng thậtTạo 1.000.000 dòng bạn chạy thử xem thời gian như thế nào, máy mình 25 giây
Mã:Sub XYZ() Dim sarr(), Res() Dim i&, k&, sRow&, iKey$, jC&, t# 'Application.ScreenUpdating = False i = Range("A" & Rows.Count).End(xlUp).Row If i < 1000001 Then Call TaoDuLieu_1000000dong t = Timer sarr = Range("A2:D" & Range("A" & Rows.Count).End(xlUp).Row).Value sRow = UBound(sarr) ReDim Preserve Res(1 To sRow, 1 To 2) For i = 1 To sRow sarr(i, 3) = DateSerial(Mid(sarr(i, 3), 7, 4), Mid(sarr(i, 3), 4, 2), Left(sarr(i, 3), 2)) _ + TimeSerial(Mid(sarr(i, 3), 12, 2), Mid(sarr(i, 3), 15, 2), Right(sarr(i, 3), 2)) sarr(i, 4) = i Next i Range("AA2").Resize(sRow, 4) = sarr Range("AA2").Resize(sRow, 4).Sort Key1:=Range("AA2"), Key2:=Range("AB2"), Key3:=Range("AC2") sarr = Range("AA2").Resize(sRow, 4).Value For i = 1 To sRow If iKey <> sarr(i, 1) & sarr(i, 2) Then iKey = sarr(i, 1) & sarr(i, 2) k = 1 Else k = k + 1 End If If Mid(sarr(i, 2), 1, 2) = "Th" Then jC = 2 Else jC = 1 Res(sarr(i, 4), jC) = k Next i Range("D2").Resize(sRow, 2) = Res Range("AA2").Resize(sRow, 4).ClearContents MsgBox (" Thoi gian: " & Timer - t & "Giay") 'Application.ScreenUpdating = True End Sub Sub TaoDuLieu_1000000dong() Dim sarr(), Res() As String, i&, n&, j&, k& sarr = Range("A2:D11").Value ReDim Res(1 To 1000000, 1 To 3) For n = 1 To 100000 For i = 1 To 10 k = k + 1 For j = 1 To 3 Res(k, j) = sarr(i, j) Next j Next i Next n Range("A2").Resize(1000000, 3) = Res End Sub
Tạo 1.000.000 dòng bạn chạy thử xem thời gian như thế nào, máy mình 25 giây
Mã:Sub XYZ() Dim sarr(), Res() Dim i&, k&, sRow&, iKey$, jC&, t# 'Application.ScreenUpdating = False i = Range("A" & Rows.Count).End(xlUp).Row If i < 1000001 Then Call TaoDuLieu_1000000dong t = Timer sarr = Range("A2:D" & Range("A" & Rows.Count).End(xlUp).Row).Value sRow = UBound(sarr) ReDim Preserve Res(1 To sRow, 1 To 2) For i = 1 To sRow sarr(i, 3) = DateSerial(Mid(sarr(i, 3), 7, 4), Mid(sarr(i, 3), 4, 2), Left(sarr(i, 3), 2)) _ + TimeSerial(Mid(sarr(i, 3), 12, 2), Mid(sarr(i, 3), 15, 2), Right(sarr(i, 3), 2)) sarr(i, 4) = i Next i Range("AA2").Resize(sRow, 4) = sarr Range("AA2").Resize(sRow, 4).Sort Key1:=Range("AA2"), Key2:=Range("AB2"), Key3:=Range("AC2") sarr = Range("AA2").Resize(sRow, 4).Value For i = 1 To sRow If iKey <> sarr(i, 1) & sarr(i, 2) Then iKey = sarr(i, 1) & sarr(i, 2) k = 1 Else k = k + 1 End If If Mid(sarr(i, 2), 1, 2) = "Th" Then jC = 2 Else jC = 1 Res(sarr(i, 4), jC) = k Next i Range("D2").Resize(sRow, 2) = Res Range("AA2").Resize(sRow, 4).ClearContents MsgBox (" Thoi gian: " & Timer - t & "Giay") 'Application.ScreenUpdating = True End Sub Sub TaoDuLieu_1000000dong() Dim sarr(), Res() As String, i&, n&, j&, k& sarr = Range("A2:D11").Value ReDim Res(1 To 1000000, 1 To 3) For n = 1 To 100000 For i = 1 To 10 k = k + 1 For j = 1 To 3 Res(k, j) = sarr(i, j) Next j Next i Next n Range("A2").Resize(1000000, 3) = Res End Sub