tangoctuan
Thành viên hoạt động
- Tham gia
- 22/4/08
- Bài viết
- 153
- Được thích
- 19
Các kết quả bạn tính như thế nào?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!
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.Các kết quả bạn tính như thế nào?
Dòng 5 và 6 có mã vị trí và giờ bắt đầu giống nhau tính sao?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!
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.Dòng 5 và 6 có mã vị trí và giờ bắt đầu giống nhau tính sao?
Kiểm tra lại . . .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!
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!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