Nhờ các anh chị giúp em file Excel có 110.000 dòng này (4 người xem)

Liên hệ QC

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

huyenanhsgu

Thành viên mới
Tham gia
18/10/18
Bài viết
4
Được thích
0
Xin chào các anh chị, hiện em có 1 file exel cần xử lý, yêu cầu rất đơn giản: "Xóa tất cả các dòng có nội dung giống nhau"
VD: dữ liệu là 9, 10, 10, 11 thì trả về kết quả là 9, 11
Vấn đề không có gì để nói nếu như file không quá nặng (trên 110.000 row), máy em chạy tầm 1 tiếng vẫn không tài nào trả ra kết quả và treo liên tục. Đã 2 ngày mà em vẫn chưa thể hoàn thành.
Nhờ các anh chị có thể xử lý giúp em file này hoặc hướng dẫn em hướng xủ lý để máy chạy nhanh nhất.

Em xin cám ơn
 

File đính kèm

Kết quả ở cột B
Bạn nhớ cho tôi biết thời gian trên máy bạn nhé
Mã:
Sub test()
Dim lastRow As Long, r As Long, count As Long, text As String, key, item, Arr(), dic As Object, t
    t = Timer
    With ThisWorkbook.Worksheets("Sheet1")
        .Range("B2:B500000").ClearContents
        lastRow = .Cells(Rows.count, "A").End(xlUp).Row
        If lastRow < 2 Then Exit Sub
        Arr = .Range("A2:A" & lastRow + 1).Value
    End With
    Set dic = CreateObject("Scripting.Dictionary")
    dic.comparemode = vbTextCompare
    For r = 1 To UBound(Arr) - 1
        text = Arr(r, 1)
        If Len(text) Then
            If dic.exists(text) Then
                If dic.item(text) = 0 Then
                    dic.item(text) = 1
                    count = count + 1
                End If
            Else
                dic.Add text, 0
            End If
        End If
    Next r
    If dic.count - count Then
        ReDim Arr(1 To dic.count - count, 1 To 1)
        count = 0
        For Each key In dic.keys
            If dic.item(key) = 0 Then
                count = count + 1
                Arr(count, 1) = key
            End If
        Next key
        ThisWorkbook.Worksheets("Sheet1").Range("B2").Resize(count).Value = Arr
    End If
    MsgBox "Thoi gian: " & Timer - t
End Sub
@befaint:
Giả sử dữ liệu chỉ là A2 = "hic hic", A3 = A4 = A5 = "blala" thì nếu tôi hiểu ý tác giả (VD: dữ liệu là 9, 10, 10, 11 thì trả về kết quả là 9, 11) thì kết quả chỉ là "hic hic". Code của bạn trả về "hic hic" và "blala"
 
@befaint:
Giả sử dữ liệu chỉ là A2 = "hic hic", A3 = A4 = A5 = "blala" thì nếu tôi hiểu ý tác giả (VD: dữ liệu là 9, 10, 10, 11 thì trả về kết quả là 9, 11) thì kết quả chỉ là "hic hic". Code của bạn trả về "hic hic" và "blala"
.
Cảm ơn anh. Em chỉnh lại rồi. Có 2 code trong file. Em tranh thủ nghịch ngợm lại bài cũ thôi ạ.
 
.
Cảm ơn anh. Em chỉnh lại rồi. Có 2 code trong file. Em tranh thủ nghịch ngợm lại bài cũ thôi ạ.
Tôi không hiểu. :D
Với 2 code của bạn thì khi xyz lặp lại n lần với n > 1 và n lẻ thì xyz có trong kết quả. Mà tôi lại hiểu chủ chủ đề là với mọi n > 1 thì xyz phải không có trong kết quả
---
Mã:
If Dic.Exists(sKey) = False Then
    Dic.Add sKey, ""
Else
    Dic.Remove sKey
End If
xyz xuất hiện lần 1 -> được thêm vào. Khi xuất hiện lần 2 thì bị xóa đi. Khi xuất hiện lần 3 thì lại được thêm vào. Tức khi xuất hiện n lần với n > 1 và n lẻ thì được thêm vào.

Tương tự với
Mã:
If oArrList.Contains(sText) = False Then
    oArrList.Add sText
Else
    oArrList.Remove sText
End If
 
Lần chỉnh sửa cuối:
Tôi không hiểu.
Với 2 code của bạn thì khi xyz lặp lại n lần với n > 1 và n lẻ thì xyz có trong kết quả. Mà tôi lại hiểu chủ chủ đề là với mọi n > 1 thì xyz phải không có trong kết quả
Em không rõ có nhầm lẫn ở chỗ nào không. Em hiểu yêu cầu ở bài #1 là lấy những giá trị mà chỉ xuất hiện 1 lần duy nhất.

Anh tải lại file (986__.xlsb) ở bài #2 giúp em với.
 
Em không rõ có nhầm lẫn ở chỗ nào không. Em hiểu yêu cầu ở bài #1 là lấy những giá trị mà chỉ xuất hiện 1 lần duy nhất.

Anh tải lại file (986__.xlsb) ở bài #2 giúp em với.
Thì tôi đọc thấy chủ chủ đề viết thì tôi hiểu là không lấy lặp lại mà. Nhưng cũng có thể tôi hiểu sai nhên mới có chữ "NẾU" trong bài viết.

Nhưng nếu là lọc duy nhất thì code vẫn sai. Vì khi xyz lặp lại số chẵn lần thì kết quả lại không có xyz
-----
Còn nếu là lọc duy nhất thì chỉ cần
Mã:
If Dic.Exists(sKey) = False Then Dic.Add sKey, ""
----
Đỏ đỏ
Trong vd. của tôi:
1. Nếu chỉ lấy những giá trị xuất hiện 1 lần (code của tôi hiểu theo cách này) thì kết quả chỉ là "hic hic"
2. Nếu là lấy duy nhất, tức mỗi giá trị chỉ được đếm 1 lần, thì kết quả phải là "hic hic" và "blala"

Hiểu theo cách nào thì kết quả của bạn cũng sai.

Không biết tôi có nhầm lẫn râu ông nọ cắm cằm bà kia không :D

Về code, về chuyên môn bạn có thể góp ý với tôi thoải mái. Vì đã là code thì chỉ có đúng sai, chuẩn và chưa chuẩn thôi, chứ không phụ thuộc vào cảm tính, vào gu, vào quan điểm. Nhầm lẫn là chuyện thường vì chúng ta cũng chỉ là con người.
 
Lần chỉnh sửa cuối:
Máy em chạy hết 5s, :(. Em làm theo kiểu tô vàng ô giống nhau rồi filter theo màu vàng, lag không tả được. Cám ơn các b nhiều ạ.
 
Tôi không hiểu. :D
Với 2 code của bạn thì khi xyz lặp lại n lần với n > 1 và n lẻ thì xyz có trong kết quả. Mà tôi lại hiểu chủ chủ đề là với mọi n > 1 thì xyz phải không có trong kết quả
---
Mã:
If Dic.Exists(sKey) = False Then
    Dic.Add sKey, ""
Else
    Dic.Remove sKey
End If
xyz xuất hiện lần 1 -> được thêm vào. Khi xuất hiện lần 2 thì bị xóa đi. Khi xuất hiện lần 3 thì lại được thêm vào. Tức khi xuất hiện n lần với n > 1 và n lẻ thì được thêm vào.

Tương tự với
Mã:
If oArrList.Contains(sText) = False Then
    oArrList.Add sText
Else
    oArrList.Remove sText
End If
Thôi tèo, em làm sai. :p:p

Em cảm ơn anh.
 
Web KT

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

Back
Top Bottom