Nhờ giúp đỡ tìm số lượng bị trùng về thời gian

Liên hệ QC
Tôi tuân thủ nội quy khi đăng bài

tangoctuan

Thành viên hoạt động
Tham gia
22/4/08
Bài viết
153
Được thích
19
Kính nhờ các bạn cho giúp mình một đoạn code VBA để tìm số lượng bị trùng với các điều kiện khác nhau như trong file đính kèm với.
Hiện trong file mình đang ví dụ làm thủ công lọc bằng tay, file thực tế có số lượng khoảng 150k dòng.

Cảm ơn mọi người nhiều!
 

File đính kèm

  • Book1.xlsb
    251 KB · Đọc: 26
Kính nhờ các bạn cho giúp mình một đoạn code VBA để tìm số lượng bị trùng với các điều kiện khác nhau như trong file đính kèm với.
Hiện trong file mình đang ví dụ làm thủ công lọc bằng tay, file thực tế có số lượng khoảng 150k dòng.

Cảm ơn mọi người nhiều!
Các kết quả bạn tính như thế nào?
 
Upvote 0
Các kết quả bạn tính như thế nào?
Mình lọc theo Giờ Bắt đầu của từng dòng, rồi đếm xem kết quả có tất cả bao nhiêu mã ID/mã vị trí/mã tỉnh.
Tương tự như vậy lọc với Giờ kết thúc.
Kết quả lọc được mình viết vào các cột tương ứng.
Nhờ bạn xem giúp mình với nhé. Cảm ơn bạn nhiều!
 
Upvote 0
Mình lọc theo Giờ Bắt đầu của từng dòng, rồi đếm xem kết quả có tất cả bao nhiêu mã ID/mã vị trí/mã tỉnh.
Tương tự như vậy lọc với Giờ kết thúc.
Kết quả lọc được mình viết vào các cột tương ứng.
Nhờ bạn xem giúp mình với nhé. Cảm ơn bạn nhiều!
Dòng 5 và 6 có mã vị trí và giờ bắt đầu giống nhau tính sao?
 
Upvote 0
Dòng 5 và 6 có mã vị trí và giờ bắt đầu giống nhau tính sao?
Vì có mã vị trí và giờ giống nhau nên khi lọc với giá trị giờ tại ô D5 thì ra 2 kết quả (2 dòng) và G5=1 (vì chỉ có một mã vị trí có giờ như vậy), tương tự mã tỉnh cũng giống nhau nên H5=1, nhưng mã ID khác nhau nên F5=2.
Tương tự như vậy với giờ kết thúc.
Cảm ơn bạn nhiều!
 
Upvote 0
2 cách:
1) Dùng 2 cột phụ để tách giờ ra khỏi ngày
2) Dùng VBA (không dùng cột phụ)
Bạn muốn làm theo cái nào?
 
Upvote 0
Kính nhờ các bạn cho giúp mình một đoạn code VBA để tìm số lượng bị trùng với các điều kiện khác nhau như trong file đính kèm với.
Hiện trong file mình đang ví dụ làm thủ công lọc bằng tay, file thực tế có số lượng khoảng 150k dòng.

Cảm ơn mọi người nhiều!
Kiểm tra lại . . .
Mã:
Sub XYZ()
  Dim dicBD As Object, dBD As Object, dicKT As Object, dKT As Object
  Dim arr(), res(), a, sRow&, i&
 
  Set dicBD = CreateObject("scripting.dictionary")
  Set dBD = CreateObject("scripting.dictionary")
  Set dicKT = CreateObject("scripting.dictionary")
  Set dKT = CreateObject("scripting.dictionary")
  arr = Sheet1.Range("A2", Sheet1.Range("E" & Rows.Count).End(xlUp)).Value
  sRow = UBound(arr)
  ReDim res(1 To sRow, 1 To 6)
  For i = 1 To sRow
    Call AddDic(arr, dicBD, dBD, i, arr(i, 4))
    Call AddDic(arr, dicKT, dKT, i, arr(i, 5))
  Next i
  Call AddRes(res, dicBD, 0)
  Call AddRes(res, dicKT, 3)
  Sheet1.Range("F2").Resize(sRow, 6) = res
End Sub

Private Sub AddDic(arr, dic, dic2, i, ByVal gio$)
  Dim a, key$
  If dic.exists(gio) = False Then
      dic.Add gio, Array(0, 0, 0, i)
  Else
      a = dic(gio)
      ReDim Preserve a(0 To UBound(a) + 1)
      a(UBound(a)) = i
      dic(gio) = a
  End If
  a = dic(gio)
  key = arr(i, 3) & "|" & gio
  If dic2.exists(key) = False Then
      dic2.Add key, Empty
      a(0) = a(0) + 1
  End If
  key = arr(i, 2) & "|" & gio
  If dic2.exists(key) = False Then
      dic2.Add key, Empty
      a(1) = a(1) + 1
  End If
  key = arr(i, 1) & "|" & gio
  If dic2.exists(key) = False Then
      dic2.Add key, Empty
      a(2) = a(2) + 1
  End If
  dic(gio) = a
End Sub

Private Sub AddRes(res, dic, ByVal dj&)
  Dim a, j&, r&
  For Each a In dic.items
    For j = 3 To UBound(a)
      r = a(j)
      res(r, 1 + dj) = a(0)
      res(r, 2 + dj) = a(1)
      res(r, 3 + dj) = a(2)
    Next j
  Next a
End Sub
 
Upvote 0
Kiểm tra lại . . .
Mã:
Sub XYZ()
  Dim dicBD As Object, dBD As Object, dicKT As Object, dKT As Object
  Dim arr(), res(), a, sRow&, i&
 
  Set dicBD = CreateObject("scripting.dictionary")
  Set dBD = CreateObject("scripting.dictionary")
  Set dicKT = CreateObject("scripting.dictionary")
  Set dKT = CreateObject("scripting.dictionary")
  arr = Sheet1.Range("A2", Sheet1.Range("E" & Rows.Count).End(xlUp)).Value
  sRow = UBound(arr)
  ReDim res(1 To sRow, 1 To 6)
  For i = 1 To sRow
    Call AddDic(arr, dicBD, dBD, i, arr(i, 4))
    Call AddDic(arr, dicKT, dKT, i, arr(i, 5))
  Next i
  Call AddRes(res, dicBD, 0)
  Call AddRes(res, dicKT, 3)
  Sheet1.Range("F2").Resize(sRow, 6) = res
End Sub

Private Sub AddDic(arr, dic, dic2, i, ByVal gio$)
  Dim a, key$
  If dic.exists(gio) = False Then
      dic.Add gio, Array(0, 0, 0, i)
  Else
      a = dic(gio)
      ReDim Preserve a(0 To UBound(a) + 1)
      a(UBound(a)) = i
      dic(gio) = a
  End If
  a = dic(gio)
  key = arr(i, 3) & "|" & gio
  If dic2.exists(key) = False Then
      dic2.Add key, Empty
      a(0) = a(0) + 1
  End If
  key = arr(i, 2) & "|" & gio
  If dic2.exists(key) = False Then
      dic2.Add key, Empty
      a(1) = a(1) + 1
  End If
  key = arr(i, 1) & "|" & gio
  If dic2.exists(key) = False Then
      dic2.Add key, Empty
      a(2) = a(2) + 1
  End If
  dic(gio) = a
End Sub

Private Sub AddRes(res, dic, ByVal dj&)
  Dim a, j&, r&
  For Each a In dic.items
    For j = 3 To UBound(a)
      r = a(j)
      res(r, 1 + dj) = a(0)
      res(r, 2 + dj) = a(1)
      res(r, 3 + dj) = a(2)
    Next j
  Next a
End Sub
25s đã chạy xong 130k dòng. Như tên lửa. Cảm ơn bạn rất nhiều, chúc bạn sức khỏe!
 
Upvote 0
Web KT

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

Back
Top Bottom