Nhờ các bạn giúp mình cách lọc bớt dữ liệu gần giống nhau (8 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

minharsenal

Thành viên mới
Tham gia
14/2/11
Bài viết
15
Được thích
0
Chào các bạn,
Mình có cái bảng như sau:


Ví dụ như 2 giá trị bôi vàng là gần như giống nhau, chỉ khác nhau một chút xíu ở phần thời gian (chênh nhau 1s)
Bây giờ mình muốn lọc tự động, xoá bớt đi các giá trị gần giống nhau như thế, điều kiện xoá là giá trị thời gian chênh nhau dưới 30s.
Cám ơn các bạn!
File mình gửi đính kèm.
 

File đính kèm

=IF(AND(HOUR(C3)-HOUR(C2)=0,SECOND(C3)-SECOND(C2)<10,A3=A2),1,0)
Bắt đầu từ dòng thứ 3 Bạn thử cái đoạn hàm này xem, sau đó chọn filter giá trị = 0View attachment GPE-.xls
 
Upvote 0
Chào các bạn,
Mình có cái bảng như sau:


Ví dụ như 2 giá trị bôi vàng là gần như giống nhau, chỉ khác nhau một chút xíu ở phần thời gian (chênh nhau 1s)
Bây giờ mình muốn lọc tự động, xoá bớt đi các giá trị gần giống nhau như thế, điều kiện xoá là giá trị thời gian chênh nhau dưới 30s.
Cám ơn các bạn!
File mình gửi đính kèm.
Bài toán này cũng tương đối khó nhưng không thể làm khó được mình. Bằng cách a hay b gì đó mình cũng xơi được hết. Lúc nào rảnh thì mình viết cho nếu như chưa có ai viết. Kiên nhẫn đợi nhé.
Bạn nào có ngon thì viết code cho bài này đi, chứ toàn đợi code nông dân rồi bình luận làm xấu hổ chết được. Ẹc
 
Lần chỉnh sửa cuối:
Upvote 0
Không cho đủ điều kiện lấy gì làm?

1. Nhiều cái gần giống nhau thì lấy cái nào bỏ cái nào?

2. Lúc các dữ kiện gần gióng nhau rồi, so sánh giờ thì so với trị nhỏ nhất, trị lớn nhất, trị giữa hay từng cặp gần nhau?

10:20:10 và 10:20:30 thì cách nhau 20s; nhưng nếu có thêm 10:20:50 thì tính là cách nhau 20s hay 40s ?
 
Upvote 0
Không cho đủ điều kiện lấy gì làm?

1. Nhiều cái gần giống nhau thì lấy cái nào bỏ cái nào?

2. Lúc các dữ kiện gần gióng nhau rồi, so sánh giờ thì so với trị nhỏ nhất, trị lớn nhất, trị giữa hay từng cặp gần nhau?

10:20:10 và 10:20:30 thì cách nhau 20s; nhưng nếu có thêm 10:20:50 thì tính là cách nhau 20s hay 40s ?

Bài toán đặt ra là mình phải xóa bớt giá trị gần như là trùng nhau về thời gian của từng người. Không phải là chỉ so sánh riêng cột thời gian và xóa đi các giá trị gần như trùng nhau. Như vậy thì sẽ bị mất dữ liệu của nhiều người. Ví dụ như trong hình của mình là xóa đi 3 giá trị thừa của tên Nguyễn Đức Dũng, chỉ giữ lại 1 giá trị, và vì thời gian chênh nhau không đáng kể (thường chỉ là 1,2 hoặc 3s) nên giữ lại giá trị nào cũng được.
 
Upvote 0
Chào các bạn,
Mình có cái bảng như sau:


Ví dụ như 2 giá trị bôi vàng là gần như giống nhau, chỉ khác nhau một chút xíu ở phần thời gian (chênh nhau 1s)
Bây giờ mình muốn lọc tự động, xoá bớt đi các giá trị gần giống nhau như thế, điều kiện xoá là giá trị thời gian chênh nhau dưới 30s.
Cám ơn các bạn!
File mình gửi đính kèm.
Có phải bạn muốn ra thế này không?
 

File đính kèm

  • Untitled.jpg
    Untitled.jpg
    30.7 KB · Đọc: 60
Upvote 0
Hình như đây là dữ liệu xuất ra từ bảng chấm vân tay cho công ty

Bạn có thể tham khảo cách "củ chuối" này xem

- Bước 1: Sort dữ liệu theo trường Giờ và tên
- Bước 2: Tại F2 gõ công thức
Mã:
=IF(A2<>A3,1,"")
- Bước 3: Auto filter cột F với điều kiện trống và xóa tất cả vùng đó (dùng Delete Row)
- Bước 4: bỏ Auto filter và xem kết quả
 
Upvote 0
Bài toán đặt ra là mình phải xóa bớt giá trị gần như là trùng nhau về thời gian của từng người. Không phải là chỉ so sánh riêng cột thời gian và xóa đi các giá trị gần như trùng nhau. Như vậy thì sẽ bị mất dữ liệu của nhiều người. Ví dụ như trong hình của mình là xóa đi 3 giá trị thừa của tên Nguyễn Đức Dũng, chỉ giữ lại 1 giá trị, và vì thời gian chênh nhau không đáng kể (thường chỉ là 1,2 hoặc 3s) nên giữ lại giá trị nào cũng được.

Bạn không hiểu vấn đề số 2 tôi đề ra. Trong dữ liệu mẫu của bạn, 4 Nguyễn Đức Dũng đều có giờ rất gần nhau nên có thể dùng chính sách "chọn cái nào cũng được". Nhưng nếu:
... Nguyễn Đức Dũng ... 07:28:32
... Nguyễn Đức Dũng ... 07:28:52
... Nguyễn Đức Dũng ... 07:29:12
... Nguyễn Đức Dũng ... 07:29:32
Thì tuy mỗi dòng liên tiếp chỉ cách nhau 20s nhưng 1 và 4 cách nhau 60s.

Để nhận biết rằng 1 và 4 tuy cách nhau 60s nhưng lại có thể coi như gần nhau theo nguyên tắc nối dãy, thì bạn cần phải nêu rõ quy luật để lập và sử lý theo dãy.
Lúc so sánh, người ta không so 1 với 2, 3, 4 mà so 1 với 2, 2 với 3, ...
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn không hiểu vấn đề số 2 tôi đề ra. Trong dữ liệu mẫu của bạn, 4 Nguyễn Đức Dũng đều có giờ rất gần nhau nên có thể dùng chính sách "chọn cái nào cũng được". Nhưng nếu:
... Nguyễn Đức Dũng ... 07:28:32
... Nguyễn Đức Dũng ... 07:28:52
... Nguyễn Đức Dũng ... 07:29:12
... Nguyễn Đức Dũng ... 07:29:32
Thì tuy mỗi dòng liên tiếp chỉ cách nhau 20s nhưng 1 và 4 cách nhau 60s.

Để nhận biết rằng 1 và 4 tuy cách nhau 60s nhưng lại có thể coi như gần nhau theo nguyên tắc nối dãy, thì bạn cần phải nêu rõ quy luật để lập và sử lý theo dãy.
Lúc so sánh, người ta không so 1 với 2, 3, 4 mà so 1 với 2, 2 với 3, ...

Mình hiểu ý bạn nhưng dữ liệu của mình nó chỉ xảy ra trường hợp chênh nhau 1 vài s là tối đa thôi. Nên mình mới lấy mốc 30s để xử lý dữ liệu. Kể cả để khoảng chênh thời gian giữa 2 dòng liên tiếp của cùng 1 người là 1 vài phút thì cũng được.
 
Upvote 0
Đúng là như thế này. Bạn giúp mình với }}}}}
Chạy thử SUB này, hên xui.
[GPECODE=vb]Public Sub GPE_()
Dim Dic As Object, sArr(), dArr(), I As Long, J As Long, K As Long, Tem As String
Set Dic = CreateObject("Scripting.Dictionary")
sArr = Range([A2], [A2].End(xlDown)).Resize(, 5).Value2
ReDim dArr(1 To UBound(sArr, 1), 1 To 5)
For I = 1 To UBound(sArr, 1)
Tem = sArr(I, 1) & sArr(I, 2) & "#" & Round(sArr(I, 3), 2) * 100
If Not Dic.exists(Tem) Then
Dic.Add Tem, ""
K = K + 1
For J = 1 To 5
dArr(K, J) = sArr(I, J)
Next J
End If
Next I
[G2:K10000].ClearContents
[G2].Resize(K, 5) = dArr
Set Dic = Nothing
End Sub[/GPECODE]
 
Upvote 0
Có vẻ như cái mày quẹt vân tay của bạn bị tội không phản hồi - khiến người ta quẹt nhiều lần cho chắc ăn. Hay bị hư mất cái bộ phận lô gíc tránh quẹt nhiều lần - lô gíc này nhận quẹt xong thì ngưng không cho quẹt tiếp, hiển thị "xin đợi 1 chút" và sau đó "đã ghi nhận - cám ơn", và cho quẹt tiếp.

@Ba Tê: tôi thử code của bạn nó cho khoảng cách tới 10 phút lận. Tôi nghĩ code cần phân biệt hẳn từ 30 giây ra con toán tính khoảng cách giờ. Về sau này lúc cần điều chỉnh, người ta chỉ cần sửa con số đó.
 
Upvote 0
Chạy thử SUB này, hên xui.
[GPECODE=vb]Public Sub GPE_()
Dim Dic As Object, sArr(), dArr(), I As Long, J As Long, K As Long, Tem As String
Set Dic = CreateObject("Scripting.Dictionary")
sArr = Range([A2], [A2].End(xlDown)).Resize(, 5).Value2
ReDim dArr(1 To UBound(sArr, 1), 1 To 5)
For I = 1 To UBound(sArr, 1)
Tem = sArr(I, 1) & sArr(I, 2) & "#" & Round(sArr(I, 3), 2) * 100
If Not Dic.exists(Tem) Then
Dic.Add Tem, ""
K = K + 1
For J = 1 To 5
dArr(K, J) = sArr(I, J)
Next J
End If
Next I
[G2:K10000].ClearContents
[G2].Resize(K, 5) = dArr
Set Dic = Nothing
End Sub[/GPECODE]
Giải thuật này của anh thật đáng phục. Code nhìn có vẻ đơn giản nhưng ít ai có thể nghĩ ra thuật toán này.
Tuy nhiên em ngồi suy nghĩ hoài cũng không hiểu tại sao không có so sánh gì mà vẫn có thể lọc ra được những dòng cần thiết (chính xác hay chưa thì chờ chủ topic phản hồi sau). Anh vui lòng giải thích thêm chỗ này.
 
Lần chỉnh sửa cuối:
Upvote 0
Giải thuật này của anh thật đáng phục. Code nhìn có vẻ đơn giản nhưng ít ai có thể nghĩ ra thuật toán này.
Tuy nhiên em ngồi suy nghĩ hoài cũng không hiểu tại sao không có so sánh gì mà vẫn có thể lọc ra được những dòng cần thiết (chính xác hay chưa thì chờ chủ topic phản hồi sau). Anh vui lòng giải thích thêm chỗ này.
Hi hi...
Nó ... ở chỗ này:
Round(sArr(I, 3), 2) * 100
Khi xem sArr(I,3) là Number

Có vẻ như cái mày quẹt vân tay của bạn bị tội không phản hồi - khiến người ta quẹt nhiều lần cho chắc ăn. Hay bị hư mất cái bộ phận lô gíc tránh quẹt nhiều lần - lô gíc này nhận quẹt xong thì ngưng không cho quẹt tiếp, hiển thị "xin đợi 1 chút" và sau đó "đã ghi nhận - cám ơn", và cho quẹt tiếp.

@Ba Tê: tôi thử code của bạn nó cho khoảng cách tới 10 phút lận. Tôi nghĩ code cần phân biệt hẳn từ 30 giây ra con toán tính khoảng cách giờ. Về sau này lúc cần điều chỉnh, người ta chỉ cần sửa con số đó.
Tôi thử với
Round(sArr(I, 3), 3) * 100
Round(sArr(I, 3), 4) * 100
............
Kết quả sẽ khác nhau khi so sánh thời gian chênh lệch nhiều hay ít. Với các số
3,4... trong Round() nó sẽ làm tròn 1 khoảng tgian nào đó bằng nhau.
Hên xui, tui chọn thí thí là số
2.

Cái số 100 là "vui thôi", kẻo anh Bill bắt lỗi số lẻ.
Híc. Hổng chịu thì thay số khác.
 
Lần chỉnh sửa cuối:
Upvote 0
Mình thử mần bài này không dùng Dic, kết quả ra cũng tá lả
PHP:
Sub ABC()
Dim nguon(), kq(1 To 10000, 1 To 5), I, J, K, A, B, C, t1, t2
Range([A2], [E65536].End(3)).Sort [A1], , [C1]
nguon = Range([A2], [E65536].End(3)).Value
K = 1: C = 30
For J = 1 To 5:    kq(1, J) = nguon(1, J): Next
For I = 2 To UBound(nguon)
    If nguon(I, 1) = nguon(I - 1, 1) Then
        If nguon(I, 2) = nguon(I - 1, 2) Then
            t1 = kq(K, 3): t2 = nguon(I, 3)
            A = Hour(t1) * 3600 + Minute(t1) * 60 + Second(t1)
            B = Hour(t2) * 3600 + Minute(t2) * 60 + Second(t2)
            If B - A > C Then
                K = K + 1
                For J = 1 To 5: kq(K, J) = nguon(I, J): Next
            End If
        End If
    Else
        K = K + 1
        For J = 1 To 5: kq(K, J) = nguon(I, J): Next
    End If
Next
[F2].Resize(K, 5) = kq
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Hic sao chạy mấy cái Sub của a Ba Tê với a Quanghai1969 không được nhỉ?
 
Upvote 0
Web KT

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

Back
Top Bottom