Xin nhờ hỗ trợ tìm số thứ tự theo điều kiện thời gian

Liên hệ QC

tangoctuan

Thành viên hoạt động
Tham gia
22/4/08
Bài viết
153
Được thích
19
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!
 

File đính kèm

  • Tim so thu tu.xlsb
    9.4 KB · Đọc: 15
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!
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.
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);"")
 
Lần chỉnh sửa cuối:
Chưa rõ quy tắc tìm số thứ tự, bạn giải thích tại sao E6 = 2?
Cá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.
Untitled.png

Bài đã được tự động gộp:

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);"")
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:

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 ô.
 
Lần chỉnh sửa cuối:
Cá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.
Untitled.png

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 ô.
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 file
 

File đính kèm

  • Tim so thu tu.xlsx
    10.3 KB · Đọc: 6
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.
Mã:
=IF($B2="Tự động",SUMPRODUCT(($A$2:$A$11=$A2)*($B$2:$B$11="Tự động")*($C$2:$C$11-C2<=0)),"")
Mã:
=IF($B2="Thủ công",SUMPRODUCT(($A$2:$A$11=$A2)*($B$2:$B$11="Thủ công")*($C$2:$C$11-C2<=0)),"")
 

File đính kèm

  • Tim so thu tu.xlsb
    15.7 KB · Đọc: 7
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!
 
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!
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.
---------------------------
Híc! Hình như viết kiểu này cũng không cần Dic.
 

File đính kèm

  • Tim so thu tu.xlsb
    19.5 KB · Đọc: 8
  • KhongDic.xlsb
    18.5 KB · Đọc: 5
Lần chỉnh sửa cuối:
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!
Chạy code
Mã:
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
 
Châ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.
 
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).
Chứ code của bạn hầu như là chạy cực nhanh, chỉ có duy nhất code này một lần bạn giúp mình thậm chí chỉ với khoảng 150k dòng thôi cũng chạy mất trên 10 phút, nhưng như thế cũng là quá tốt rồi, giải quyết được bao việc, đến giờ vẫn là phương án duy nhất mình đang sử dụng!
Untitled-1.png
 
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á :D
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
 

File đính kèm

  • Tim so thu tu.xlsb
    2.5 MB · Đọc: 18
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
Kinh khủng thật
 
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

Máy em chạy đến 32s cơ mà~
1608965570293.png
 
Web KT
Back
Top Bottom