7. Giả sử bạn muốn lọc và dán dữ liệu vào một sổ làm việc mới thay vì thêm các trang tính trong cùng một sổ làm việc
Option Explicit Sub filter[] Application.ScreenUpdating = False Dim x As Range Dim rng As Range Dim rng1 As Range Dim last As Long Dim sht As String Dim newBook As Excel.Workbook Dim Workbk As Excel.Workbook 'Specify sheet name in which the data is stored sht = "DATA Sheet" 'Workbook where VBA code resides Set Workbk = ThisWorkbook 'New Workbook Set newBook = Workbooks.Add[xlWBATWorksheet] Workbk.Activate 'change filter column in the following code last = Workbk.Sheets[sht].Cells[Rows.Count, "F"].End[xlUp].Row With Workbk.Sheets[sht] Set rng = .Range["A1:F" & last] End With Workbk.Sheets[sht].Range["F1:F" & last].AdvancedFilter Action:=xlFilterCopy, CopyToRange:=Range["AA1"], Unique:=True For Each x In Workbk.Sheets[sht].Range[[AA2], Cells[Rows.Count, "AA"].End[xlUp]] With rng .AutoFilter .AutoFilter Field:=6, Criteria1:=x.Value .SpecialCells[xlCellTypeVisible].Copy newBook.Sheets.Add[After:=Sheets[Sheets.Count]].Name = x.Value newBook.Activate ActiveSheet.Paste End With Next x ' Turn off filter Workbk.Sheets[sht].AutoFilterMode = False With Application .CutCopyMode = False .ScreenUpdating = True End With End Sub8. Trường hợp muốn dán dữ liệu vào nhiều workbook sau khi lọc dữ liệu. Dữ liệu cho từng giá trị duy nhất sẽ được lưu trong một sổ làm việc khác có tên giống như giá trị duy nhất
Option Explicit Sub filter[] Application.ScreenUpdating = False Dim x As Range Dim rng As Range Dim rng1 As Range Dim last As Long Dim sht As String Dim newBook As Excel.Workbook Dim Workbk As Excel.Workbook 'Specify sheet name in which the data is stored sht = "DATA Sheet" 'Workbook where VBA code resides Set Workbk = ThisWorkbook 'change filter column in the following code last = Workbk.Sheets[sht].Cells[Rows.Count, "F"].End[xlUp].Row With Workbk.Sheets[sht] Set rng = .Range["A1:F" & last] End With Workbk.Sheets[sht].Range["F1:F" & last].AdvancedFilter Action:=xlFilterCopy, CopyToRange:=Range["AA1"], Unique:=True ' Loop through unique values in column For Each x In Workbk.Sheets[sht].Range[[AA2], Cells[Rows.Count, "AA"].End[xlUp]] With rng .AutoFilter .AutoFilter Field:=6, Criteria1:=x.Value .SpecialCells[xlCellTypeVisible].Copy 'Add New Workbook in loop Set newBook = Workbooks.Add[xlWBATWorksheet] newBook.Sheets.Add[After:=Sheets[Sheets.Count]].Name = x.Value newBook.Activate ActiveSheet.Paste End With 'Save new workbook newBook.SaveAs x.Value & ".xlsx" 'Close workbook newBook.Close SaveChanges:=False Next x ' Turn off filter Workbk.Sheets[sht].AutoFilterMode = False With Application .CutCopyMode = False .ScreenUpdating = True End With End Sub
Bạn có thể bỏ dòng mã này nếu không muốn đóng workbook mới tạo9. Giả sử bạn muốn tính tổng các giá trị trong mỗi trang tính. Chương trình sau tính tổng cột B của mỗi trang tính. Nó cũng viết 'Tổng số' ở hàng cuối cùng của cột A. Nó giả sử dữ liệu của bạn bắt đầu từ cột AnewBook.Close SaveChanges:=False
Sub sumLoop[]
Làm mờ WS dưới dạng trang tính
Cho Mỗi WS Trong ThisWorkbook. bảng tính
WS. Kích hoạt
Phạm vi ["A" & Hàng. Đếm]. Kết thúc[xlUp]. Lựa chọn
cuối cùng = Lựa chọn. Chèo thuyền
totRow = cuối cùng + 1
WS. Phạm vi ["A" & totRow] = "Tổng cộng"
WS. Phạm vi["B" & totRow] = Ứng dụng. Bảng TínhChức Năng. Tổng[Cột["B. B"]]
WS tiếp theo
kết thúc phụ
10. Cách lọc chỉ một giá trị thay vì tất cả các giá trị duy nhất
Xóa dòng mã sau -
Sheets[sht].Range["F1:F" & last].AdvancedFilter Action:=xlFilterCopy, CopyToRange:=Range["AA1"], Unique:=True
Bước tiếp theo là nhập giá trị bạn muốn lọc vào ô AA2 và đảm bảo không có gì được điền vào toàn bộ cột AA ngoại trừ ô AA2. Ví dụ: tôi sẽ nhập giá trị 1 vào ô AA2 vì tôi muốn chọn 1 trong cột F [cột 'xếp hạng']
Nhấp vào liên kết bên dưới để xem macro đang hoạt độngTải xuống sổ làm việc
Liên kết có liên quan - Lọc dữ liệu dựa trên lựa chọn thả xuống
Hướng dẫn Excel. 100 bài hướng dẫn Excel
Thông báo
Chia sẻ Chia sẻ Tweet Đăng ký
bài viết liên quan
về tác giả
Deepanshu thành lập ListenData với một mục tiêu đơn giản - Làm cho các phân tích trở nên dễ hiểu và dễ theo dõi. Ông có hơn 10 năm kinh nghiệm trong lĩnh vực khoa học dữ liệu. Trong nhiệm kỳ của mình, ông đã làm việc với các khách hàng toàn cầu trong nhiều lĩnh vực khác nhau như Ngân hàng, Bảo hiểm, Cổ phần tư nhân, Viễn thông và Nhân sự
Nhiều chức năng của Excel cũng có sẵn để sử dụng trong VBA – và phương thức Autofilter là một trong những chức năng như vậy
Nếu bạn có một tập dữ liệu và bạn muốn lọc nó bằng một tiêu chí, bạn có thể dễ dàng thực hiện việc đó bằng cách sử dụng tùy chọn Bộ lọc trong dải băng Dữ liệu
Và nếu bạn muốn một phiên bản nâng cao hơn của nó, thì cũng có một bộ lọc nâng cao trong Excel
Vậy tại sao lại sử dụng AutoFilter trong VBA?
Nếu bạn chỉ cần lọc dữ liệu và thực hiện một số thao tác cơ bản, tôi khuyên bạn nên sử dụng chức năng Bộ lọc sẵn có mà giao diện Excel cung cấp
Bạn nên sử dụng Bộ lọc tự động VBA khi bạn muốn lọc dữ liệu như một phần của quá trình tự động hóa [hoặc nếu nó giúp bạn tiết kiệm thời gian bằng cách lọc dữ liệu nhanh hơn]
Ví dụ: giả sử bạn muốn lọc nhanh dữ liệu dựa trên lựa chọn thả xuống, sau đó sao chép dữ liệu đã lọc này vào một trang tính mới
Mặc dù điều này có thể được thực hiện bằng cách sử dụng chức năng bộ lọc sẵn có cùng với một số thao tác sao chép-dán, nhưng bạn có thể mất nhiều thời gian để thực hiện việc này theo cách thủ công
Trong trường hợp như vậy, sử dụng Bộ lọc tự động VBA có thể tăng tốc mọi thứ và tiết kiệm thời gian
Ghi chú. Tôi sẽ đề cập đến ví dụ này [về cách lọc dữ liệu dựa trên lựa chọn thả xuống và sao chép vào một trang tính mới] ở phần sau của hướng dẫn này
Hướng dẫn này bao gồm
Cú pháp bộ lọc tự động VBA của Excel
Expression. AutoFilter[ _Field_ , _Criteria1_ , _Operator_ , _Criteria2_ , _VisibleDropDown_ ]
- Sự diễn đạt. Đây là phạm vi mà bạn muốn áp dụng bộ lọc tự động
- Đồng ruộng. [Đối số tùy chọn] Đây là số cột mà bạn muốn lọc. Điều này được tính từ bên trái trong tập dữ liệu. Vì vậy, nếu bạn muốn lọc dữ liệu dựa trên cột thứ hai, giá trị này sẽ là 2
- tiêu chí1. [Đối số tùy chọn] Đây là tiêu chí dựa vào đó bạn muốn lọc tập dữ liệu
- Nhà điều hành. [Đối số tùy chọn] Trong trường hợp bạn cũng đang sử dụng tiêu chí 2, bạn có thể kết hợp hai tiêu chí này dựa trên Toán tử. Các toán tử sau đây có sẵn để sử dụng. xlAnd, xlOr, xlBottom10Items, xlTop10Items, xlBottom10Percent, xlTop10Percent, xlFilterCellColor, xlFilterDynamic, xlFilterFontColor, xlFilterIcon, xlFilterValues
- tiêu chí2. [Đối số tùy chọn] Đây là tiêu chí thứ hai mà bạn có thể lọc tập dữ liệu
- Hiển ThịThả Xuống. [Đối số tùy chọn] Bạn có thể chỉ định xem bạn có muốn biểu tượng thả xuống bộ lọc xuất hiện trong các cột được lọc hay không. Đối số này có thể là TRUE hoặc FALSE
Ngoài Biểu thức, tất cả các đối số khác là tùy chọn
Trong trường hợp bạn không sử dụng bất kỳ đối số nào, nó sẽ chỉ áp dụng hoặc xóa các biểu tượng bộ lọc cho các cột
Sub FilterRows[] Worksheets["Filter Data"].Range["A1"].AutoFilter End Sub
Đoạn mã trên sẽ chỉ áp dụng phương thức Autofilter cho các cột [hoặc nếu nó đã được áp dụng, nó sẽ xóa nó]
Điều này đơn giản có nghĩa là nếu bạn không thể nhìn thấy các biểu tượng bộ lọc trong tiêu đề cột, bạn sẽ bắt đầu nhìn thấy nó khi đoạn mã trên được thực thi và nếu bạn có thể nhìn thấy nó, thì nó sẽ bị xóa
Trong trường hợp bạn có bất kỳ dữ liệu nào đã được lọc, nó sẽ xóa các bộ lọc và hiển thị cho bạn tập dữ liệu đầy đủ
Bây giờ, hãy xem một số ví dụ về việc sử dụng Bộ lọc tự động VBA của Excel sẽ làm rõ cách sử dụng của nó
Thí dụ. Lọc dữ liệu dựa trên điều kiện Văn bản
Giả sử bạn có tập dữ liệu như hình bên dưới và bạn muốn lọc tập dữ liệu đó dựa trên cột 'Mục'
Đoạn mã dưới đây sẽ lọc tất cả các hàng có mục là 'Máy in'
Sub FilterRows[] Worksheets["Sheet1"].Range["A1"].AutoFilter Field:=2, Criteria1:="Printer" End Sub
Đoạn mã trên đề cập đến Sheet1 và trong đó, nó đề cập đến A1 [là một ô trong tập dữ liệu]
Lưu ý rằng ở đây chúng tôi đã sử dụng Trường. =2, vì cột mặt hàng là cột thứ hai trong tập dữ liệu của chúng tôi từ bên trái
Bây giờ nếu bạn đang nghĩ - tại sao tôi cần làm điều này bằng mã VBA. Điều này có thể dễ dàng được thực hiện bằng chức năng bộ lọc sẵn có.
Bạn đúng
Nếu đây là tất cả những gì bạn muốn làm, tốt hơn nên sử dụng chức năng Bộ lọc sẵn có
Nhưng khi bạn đọc phần hướng dẫn còn lại, bạn sẽ thấy rằng điều này có thể được kết hợp với một số mã bổ sung để tạo ra khả năng tự động hóa mạnh mẽ
Nhưng trước khi tôi cho bạn xem những thứ đó, trước tiên hãy để tôi trình bày một vài ví dụ để cho bạn thấy tất cả những gì mà phương pháp AutoFilter có thể làm
Bấm vào đây để tải file ví dụ về và làm theo
Thí dụ. Nhiều Tiêu chí [VÀ/HOẶC] trong cùng một Cột
Giả sử tôi có cùng tập dữ liệu và lần này tôi muốn lọc tất cả các bản ghi có mục là 'Máy in' hoặc 'Máy chiếu'
Đoạn mã dưới đây sẽ làm điều này
Sub FilterRowsOR[] Worksheets["Sheet1"].Range["A1"].AutoFilter Field:=2, Criteria1:="Printer", Operator:=xlOr, Criteria2:="Projector" End Sub
Lưu ý rằng ở đây tôi đã sử dụng toán tử xlOR
Điều này yêu cầu VBA sử dụng cả hai tiêu chí và lọc dữ liệu nếu bất kỳ tiêu chí nào trong hai tiêu chí được đáp ứng
Tương tự, bạn cũng có thể sử dụng tiêu chí AND
Ví dụ: nếu bạn muốn lọc tất cả các bản ghi có số lượng lớn hơn 10 nhưng nhỏ hơn 20, bạn có thể sử dụng mã bên dưới
Sub FilterRowsAND[] Worksheets["Sheet1"].Range["A1"].AutoFilter Field:=4, Criteria1:=">10", _ Operator:=xlAnd, Criteria2:="