Menu

App script quản lý rủi ro cho cá nhân & doanh nghiệp với báo cáo chuẩn định dạng biểu đồ

Tự động hóa việc tạo danh sách duy nhất từ nhiều cột bằng VBA

Đồng Trọng Cát 12/04/2026 23:26 442 lượt xem 1 trả lời

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 Sub

Lư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" & lastRow bạ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é!

0

Chào bạn,

Vấn đề bạn đang gặp phải khá phổ biến khi xử lý dữ liệu lớn. Dùng VBA để tự động hóa việc gom và loại bỏ trùng lặp từ nhiều cột là một giải pháp rất hiệu quả.

Mình từng làm một đoạn code tương tự để gom danh sách khách hàng từ nhiều sheet khác nhau. Ý tưởng chung là duyệt qua từng cột, thêm các giá trị vào một Collection (hoặc Dictionary) để tự động loại bỏ trùng lặp, sau đó xuất ra một vùng dữ liệu mới.

Bạn có thể chia sẻ thêm về cấu trúc dữ liệu của bạn không? Ví dụ, tên các cột có cố định không, hay bạn muốn xử lý dựa trên tiêu đề cột chẳng hạn?

Nếu cần, mình có thể chia sẻ một ví dụ code đơn giản để bạn tham khảo.

2

Bạn cần đăng nhập để trả lời chủ đề này.

Đăng nhập Đăng ký