Chào mọi người,
Dạo gần đây mình có gặp một bài toán khá hay khi làm việc với Excel. Mình có một file với nhiều cột chứa dữ liệu, nhưng trong mỗi cột lại có các giá trị bị lặp lại. Yêu cầu đặt ra là cần trích xuất ra một danh sách duy nhất (unique list) bao gồm tất cả các giá trị từ tất cả các cột này, loại bỏ hoàn toàn trùng lặp.
Ban đầu mình thử dùng các hàm có sẵn như UNIQUE hoặc kết hợp FILTER nhưng nó chỉ xử lý được từng cột hoặc một phạm vi cố định. Với số lượng cột không cố định và dữ liệu có thể thay đổi, việc làm thủ công hoặc dùng công thức sẽ rất mất thời gian và dễ sai sót.
Sau khi suy nghĩ một chút, mình đã nghĩ đến việc sử dụng VBA để giải quyết triệt để vấn đề này. Dưới đây là đoạn code mình viết, hy vọng sẽ hữu ích cho các bạn:
Sub CreateUniqueList()
Dim ws As Worksheet
Dim lastRow As Long
Dim cell As Range
Dim uniqueValues As Object
Dim outputSheetName As String
Set ws = ThisWorkbook.Sheets("Sheet1") ' Thay "Sheet1" bằng tên sheet chứa dữ liệu của bạn
outputSheetName = "UniqueList"
Set uniqueValues = CreateObject("Scripting.Dictionary")
' Tìm hàng cuối cùng có dữ liệu
lastRow = ws.Cells(Rows.Count, "A").End(xlUp).Row ' Giả sử dữ liệu bắt đầu từ cột A
' Duyệt qua từng ô trong các cột cần xử lý
For Each cell In ws.Range("A1:Z" & lastRow) ' Thay "A1:Z" bằng phạm vi cột bạn muốn xử lý
If Not uniqueValues.Exists(Trim(cell.Value)) Then
If Trim(cell.Value) "" Then
uniqueValues.Add Trim(cell.Value), 1
End If
End If
Next cell
' Tạo sheet mới hoặc xóa sheet cũ để ghi kết quả
On Error Resume Next
Application.DisplayAlerts = False
ThisWorkbook.Sheets(outputSheetName).Delete
Application.DisplayAlerts = True
On Error GoTo 0
Set wsOutput = ThisWorkbook.Sheets.Add(After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count))
wsOutput.Name = outputSheetName
' Ghi danh sách duy nhất ra sheet kết quả
Dim i As Long
i = 1
For Each key In uniqueValues.Keys
wsOutput.Cells(i, 1).Value = key
i = i + 1
Next key
MsgBox "Đã tạo danh sách duy nhất thành công!", vbInformation
End SubLưu ý:
- Bạn cần thay
"Sheet1"bằng tên sheet chứa dữ liệu của bạn. - Phạm vi
"A1:Z" & lastRowbạn cũng cần điều chỉnh cho phù hợp với số lượng và vị trí các cột cần xử lý. Ví dụ, nếu bạn muốn xử lý từ cột A đến cột E, bạn có thể sửa thành"A1:E" & lastRow. - Code này sử dụng
Scripting.Dictionaryđể lưu trữ các giá trị duy nhất, đảm bảo hiệu suất tốt ngay cả với lượng dữ liệu lớn.
Hy vọng đoạn code này sẽ giúp ích cho công việc của mọi người. Nếu có thắc mắc hoặc cải tiến gì, mọi người cứ chia sẻ nhé!