Dùng Macro lọc dữ liệu bảng trong Excel
Giả sbạn mt bảng cha danh ch lịch nhân viên (hoc bt cdanh sách
như ở dưới):
Sheet1:
bạn mun chỉ ly lịch nhng nhân viên mã s0252, 0253, .... Nếu bạn
chọn tng người trong danh sách (có thvài trăm đến i nghìn nhân viên) thì
sẽ rt mt thi gian.
Để thc hin nhanh, ta sẽ tạo macro lọc nhng nhân viên cn lấy như sau:
- Tạo vòng lp từ đầu ti cui của danh sách snhân viên, ly tng sNV,
sau đó tạo tiếp vòng lp để duyt từ đu ti cui danh sách lịch, khi tìm thy thì
cho ngng vòng lp tạo tiếp mt ng lp khác duyt qua c ct của mu tin
tìm thy để chép (copy) sang Sheet2.
- Thc hin:
+ Tạo mt sheet để cha kết quả lọc, (Sheet2)
+ Tạo mt sheet cha mã NV:
Sheet3:
Trong Excel, vào menu Tools\Macro\Visual Basic Editor:
Trong ca sbên trái, nhấn đúp vào VBAProject để bung các nhánh con trong đó
ra. Bạn sẽ thy có ba sheet mình tạo trên, nhấn đúp vào mt sheet bt kỳ để
mca sổ soạn thảo code của sheet đó, sau đó thc hin soạn như ở dưới:
Sub CopyRecord()
Dim i, j, k, n, n1 As Integer
Dim temp
'n smu tin của sheet 3
'n1 smu tin của sheet 1
n = 100
n1 = 1500
'vòng lp duyt tmu tin th2 đến mu tin cui cùng của sheet cha nhân
viên(trong ví dụ là 100)
For i = 2 To n
'lưu giái trị của hàng thi, ct th2 của sheet3 vào biến temp (trong dụ
NV).
'như vậy biến temp sẽ ln lượt cha s nhân viên của tng người trong
danh sách
temp = Sheet3.Cells(i, 2)
'vòng lp duyt tmu tin th2 đến mu tin cui cùng của sheet chưa danh sách
nhân viên
For j = 2 To n1
'kim tra nếu nhân viên trong Sheet1 (danh sách nhân viên) trùng vi biến
temp thì tạo tiếp vòng lp duyt qua các ct ca mu tin tìm thy.
If temp = Sheet1.Cells(j, 2) Then
k = 2
Do While Not IsEmpty(Sheet1.Cells(j, k))
'Cp nht các ô vào sheet2
Sheet2.Cells(i, k) = Sheet1.Cells(j, k)
k = k + 1
Loop
Exit For
End If
Next
Next
End Sub
Sau khi đã viết xong code, ta nhn F5 để chạy macro này, chi giây để macro
lọc dliu, sau khi maco thc hin xong nhim vụ, bạn hãy m Sheet2 ra coi. Cha
cha! nó đã copy đầy đủ theo danh sách mã số ca bạn.
Nếu bạn mun marco tự động chạy thì thc hiện như sau:
Macro chạy mi khi bạn thay đi d liu trong sheet lý lịch: Chép đoạn trên
(không chép ng đu tiên cuôi cùng: Sub CopyRecord End Sub). Nhấn đúp
vào Sheet1 để mca scode, trong listbox bên trái phía trên của ca scode,
chọn Worksheet, bên phải chọn Change, bạn sẽ thấy như sau:
Private Sub Worksheet_Change(ByVal Target As Range)
End Sub
n đoạn đã copy vào trong thủ tục này. Bây gi thì mi ln bạn thay đổi d
liu trong Sheet1 thì macro sẽ tđộng cp nht lại dliu. Nếu dliu quá nhiu
và bạn phải làm vic thường xuyên trên Sheet1 thì không nên dùng cách này vì nó
sẽ m chm quá trình xcủa bạn (nh xóa đoạn sau khi bạn đã copy
sang sheet khác). Bạn tháp dụng cách này để thlàm được nhiu vic khác
na.