- Kỹ thuật xóa dữ liệu trùng của các ô, code cực ngắn - có thể làm thành Add-In

Liên hệ QC
Mr Okebab đã viết:
Đây là những tuyệt chiêu của các cao thủ, mong bác Tuân có thể nói thêm về những điều này, VD ở topic : Các thủ thuật tăng tốc tính toán chẳng hạn.

Nếu bác đồng ý thì xin đãi bác 1 cốc sữa . . .dê chính hiệu Okebab

Thân!

Tớ đã có bài viết về tăng tốc độ tính toán rồi đó (không nhớ là ở Webketoan hay trên giaiphapexcel nữa). Tuy nhiên các bài viết đó cũng chỉ ở dạng khai thác Excel ở mức cao chứ chưa hẳn là thủ thuật. Không dám gọi là tuyệt chiêu hay thủ thuật nhưng vào một ngày mát trời (nếu trời nóng máy bốc khói thì thành dê thui mất!!! He he) tớ sẽ post thêm một topic về cái tốc độ tính toán trong Excel và VBA. Mong có dịp còn được tắm sữa dê của Mr Okebab nữa--=0 .

Chủ đề này khá thú vị, chúng ta tiếp tục tìm giải pháp cho nó nha!
 
TuanVNUNI đã viết:
Tớ đã có bài viết về tăng tốc độ tính toán rồi đó (không nhớ là ở Webketoan hay trên giaiphapexcel nữa). Tuy nhiên các bài viết đó cũng chỉ ở dạng khai thác Excel ở mức cao chứ chưa hẳn là thủ thuật. Không dám gọi là tuyệt chiêu hay thủ thuật nhưng vào một ngày mát trời (nếu trời nóng máy bốc khói thì thành dê thui mất!!! He he) tớ sẽ post thêm một topic về cái tốc độ tính toán trong Excel và VBA. Mong có dịp còn được tắm sữa dê của Mr Okebab nữa--=0 .

Chủ đề này khá thú vị, chúng ta tiếp tục tìm giải pháp cho nó nha!

Em chỉ dám đãi bác uống thôi, bác lại đòi . . . tắm làm cho dân Sài Gòn khủng hoảng luôn!!!$@!!!$@!!
Chắc phải đến VinaMilk mượn đỡ mấy . . nàng bò về vắt đỡ. (Dê sữa ít lắm bác ạ)--=0--=0

Hôm nào rảnh thì bác post lên nhé, em đang muốn tham khảo mấy đề tài dạng này đấy, vì các bài ở GPE mới dừng lại ở mức cơ bản. Nhưng bác nhớ là dùng ngôn ngữ . . bình dân học vụ thôi. Chứ hàn lâm quá là . .. bác viết . . . mọi người cùng đọc . . . chỉ mình bác hiểu đấy:=\+:=\+

Cảm ơn bác nhiều!!
Thân!
 
Xóa bản ghi trùng?

Quay lại vấn đề "Xóa dữ liệu trùng" nhé!

Vấn đề đặt ra là tìm và xóa bản ghi (dòng) trong một vùng đã chọn (không phải tìm một ô). Nếu ta chọn vùng là một cột hay nhiều cột thì việc xóa bản ghi vẫn luôn đúng?


Thực ra vấn đề trên sẽ có thể có nhiều giải pháp, cái tôi muốn biết là giải pháp nào thì tốc độ là nhanh nhất? Chúng ta hãy test trên khối dữ liệu lớn nha. Dùng hàm GetTickCount để đo.

Mình cung cấp một thủ tục tạo dữ liệu để test:
Mã:
Sub TaoGiaTri()
On Error GoTo Done
Dim i&, j&, nR&, nC&

Application.EnableEvents = False
Application.ScreenUpdating = False

nR = 10000 'Số dòng
nC = 3 ' Số cột

For i = 1 To nR
    For j = 1 To nC
        Cells(i, j) = i * j 'Gán giá trị
    Next j
Next i
For i = 1 To nR
    For j = 1 To nC
        Cells(i + nR, j) = i * j 'Gán giá trị
    Next j
Next i

Done:

Application.ScreenUpdating = True
Application.EnableEvents = True

End Sub

Kết quả thủ tục trên ta có bảng dữ liệu gồm 3 cột và 20000 dòng. Nếu chạy thủ tục "Xóa trùng" thì chỉ còn lại 1000 dòng đầu tiên (vì các dòng từ 10001 trở đi là trùng lặp).
 
Lần chỉnh sửa cuối:
Tiếp nữa đi bác ????
 
- Đang hồi gây cấn, tiếp nữa đi anh ơi !!!
 
Mình vẫn đang nghiên cứu vụ này. Bác nào có giải pháp gì thì cứ đưa ra nhé!
 
Vấn đề đặt ra là tìm và xóa bản ghi (dòng) trong một vùng đã chọn (không phải tìm một ô). Nếu ta chọn vùng là một cột hay nhiều cột thì việc xóa bản ghi vẫn luôn đúng?
Một cách giải xóa bản ghi khi chọn nhiều cột (từ c1 đến c2)

Dùng vòng lặp Do Loop tìm dữ liệu trùng của các ô trong cột đầu tiên.
__Ví dụ cells(r1,c1) trùng với cells(rn,c1)

- Khi tìm được rn, dùng vòng lặp For Next so sánh 2 ô tương ứng ở dòng r1 và rn từ cột c1 đến c2
For c=c1 to c2
__If cells(r1,c)<>cells(rn,c) then Exit For ‘2 ô dữ liệu khác nhau,thoát vòng lặp
Next
If c>c2 then ‘c>c2 có nghĩa là các ô dòng r1 và rn hoàn toàn giống nhau
__Cells(rn,c1).EntireRow.Delete (xóa dòng rn)
End if
 
xin lỗi các bác vì bảo upload file lên mà vẫn chưa làm.
Em có một file ví dụ này mong các bác ra tay giúp đỡ.
Đề bài:
Lọc ra những người có Mã 1 và Mã 2 giống nhau nhưng khác tên. Chú ý: Khi so sánh tên thì bỏ qua chữ viết hoa và không viết hoa. Ví dụ nguyễn văn a và Nguyễn Văn A vẫn coi là tên giống nhau.
 

File đính kèm

  • filevidu.zip
    269.6 KB · Đọc: 115
Không có TuanVNUNI phát hiện, mình vẫn tưởng là đúng! Không phải tại Find mà do mình bỏ bớt một số Option của Find để viết cho gọn và không test kỹ các trưởng hợp.
Câu lệnh rfind2 = Selection.Find(What:=dulieu, After:=Cells(rfind1, c)).Row tìm theo điều kiện dễ nhất,sẽ tìm dạng tương tự. Bảo tìm 10 thì 210, 310, 101, 1000, ... đều đúng. Với một số yêu cầu tìm kiếm khác thì đúng, nhưng với yêu cầu tìm dữ liệu trùng thì hoàn toàn sai !

Câu lệnh trên cần sửa lại:
rfind2 = Selection.Find(What:=dulieu, After:=Cells(rfind1, c), LookAt:=xlWhole, SearchOrder:=xlByColumns).Row

Trong câu này có thêm 2 Option hạn chế cách tìm của Find là:

SearchOrder:=xlByColumns (Search By Columns: tìm trong cột)

LookAt:=xlWhole (Match entire cell constents: tìm đúng nội dung trong ô) do thiếu đoạn này mà sai





Thầy Long ơi! file này nếu bên trong ô là 1 công thức thì nó sẽ không hoạt động. Thầy có cách nào điều chỉnh lại không ah?
Thanks
 
Hiện Thầy Long đang nằm viện!

Thầy Long ơi! file này nếu bên trong ô là 1 công thức thì nó sẽ không hoạt động. Thầy có cách nào điều chỉnh lại không ah?

Sau đây mình giới thiệu cách xóa dữ liệu từ các ô công thức đem lại:

Ví dụ ta có trang tính sau:
| A | B | C 3 |0|0|
4 |5|1|(Công thức tại [B5]:
5 |10|2| =MOD(A5,4) )
6 |15|3|
7 |20|0|(Tổng quát:
8 |25|1|Công thức tại [Bi]:
9 |30|2| =MOD(Ai,4) )
10 |35|3|
11 |40|0|
12 |45|1|
13 |50|2|
14 |55|3|
15 |60|0|

Macro sau đây sẽ tô màu (hay xóa) các dòng mà tại cột B có trị (do công thức đem lại) bằng 3

PHP:
Option Explicit

Sub DelInFormulas()
 Dim Jj As Long, Rng As Range, sRng As Range:            Dim MyAdd As String
 
 Set Rng = [B65535]
 Set sRng = Range("B3:B15").Find(3, , xlValues, xlWhole)
 If Not sRng Is Nothing Then
   MyAdd = sRng.Address
   Do
      Set Rng = Union(sRng, Rng)
      Set sRng = Range("B3:B15").FindNext(sRng)
   Loop While Not sRng Is Nothing And sRng.Address <> MyAdd
 End If
 Rng.Interior.ColorIndex = 38
' Rng.EntireRow.Delete '
End Sub

Mong rằng mình đã hiểu đúng ý bạn.

Thân ái!
 
Lần chỉnh sửa cuối:
Sau đây mình giới thiệu cách xóa dữ liệu từ các ô công thức đem lại:

Ví dụ ta có trang tính sau:
| A | B | C 3 |0|0|
4 |5|1|(Công thức tại [B5]:
5 |10|2| =MOD(A5,4) )
6 |15|3|
7 |20|0|(Tổng quát:
8 |25|1|Công thức tại [Bi]:
9 |30|2| =MOD(Ai,4) )
10 |35|3|
11 |40|0|
12 |45|1|
13 |50|2|
14 |55|3|
15 |60|0|

Macro sau đây sẽ tô màu (hay xóa) các dòng mà tại cột B có trị (do công thức đem lại) bằng 3

PHP:
Option Explicit

Sub DelInFormulas()
 Dim Jj As Long, Rng As Range, sRng As Range:            Dim MyAdd As String
 
 Set Rng = [B65535]
 Set sRng = Range("B3:B15").Find(3, , xlValues, xlWhole)
 If Not sRng Is Nothing Then
   MyAdd = sRng.Address
   Do
      Set Rng = Union(sRng, Rng)
      Set sRng = Range("B3:B15").FindNext(sRng)
   Loop While Not sRng Is Nothing And sRng.Address <> MyAdd
 End If
 Rng.Interior.ColorIndex = 38
' Rng.EntireRow.Delete '
End Sub

Mong rằng mình đã hiểu đúng ý bạn.

Thân ái!
Thanks bạn rất nhiều! Xem code bạn xong thì mình hiểu chỉ cần thêm xlvalues vào trong hàm find nữa là tìm chính xác giá trị khi đó là 1 công thức
 
SPAM 1 cái, nhờ MOD/SMOD xóa dùm, một khi có ai nhấn nút

Xem xong thì mình hiểu, chỉ cần thêm xlvalues vào trong hàm find nữa là tìm chính xác giá trị khi đó là 1 công thức

FIND() không fải là 1 hàm; Nó là 1 fương thức, bạn à.

Cũng 1 số người như bạn, chứ bạn không fải là duy nhất.

Có không ít fương thức còn trả về giá trị True/False như fương thức Intersect(), . . .


Chúc tuần làm việc vui vẻ & kết quả!

(Bạn nhận được tin nhắn của mình thì nhấn giúp nút cảm ơn; để MOD/SMOD xóa dùm bài này! Xin cảm ơn!)
 
Web KT
Back
Top Bottom