Làm cách nào để tự động làm mới bộ lọc tự động Excel khi dữ liệu được thay đổi?
Trường hợp sử dụng: Tôi thay đổi giá trị của một ô thành giá trị đã được lọc. Tôi muốn thấy hàng hiện tại biến mất mà không phải làm gì khác.
Làm cách nào để tự động làm mới bộ lọc tự động Excel khi dữ liệu được thay đổi?
Trường hợp sử dụng: Tôi thay đổi giá trị của một ô thành giá trị đã được lọc. Tôi muốn thấy hàng hiện tại biến mất mà không phải làm gì khác.
Câu trả lời:
Tôi thấy rằng khi tôi làm việc với các bảng, điều này không hoạt động. Bộ lọc không nằm trên tờ mà trên bàn. mã này đã lừa
Private Sub Worksheet_Change(ByVal Target As Range)
With ActiveWorkbook.Worksheets("Sheet1").ListObjects("Table1")
.AutoFilter.ApplyFilter
End With
End Sub
Tôi đã tìm thấy thông tin ở đây: http://www.jkp-ads.com/articles/Excel2007TablesVBA.asp
Nhấp chuột phải vào tên trang tính của bạn, chọn "Xem mã" và dán mã bên dưới. Sau khi dán, nhấp vào biểu tượng Excel bên dưới "Tệp" ở trên cùng bên trái hoặc nhập Alt-F11, để quay lại chế độ xem bảng tính.
Điều này sẽ cho phép tự động làm mới. Đừng quên lưu tệp theo định dạng với lời nói dối hỗ trợ macro .xlsm
.
Private Sub Worksheet_Change(ByVal Target As Range)
If Me.FilterMode = True Then
With Application
.EnableEvents = False
.ScreenUpdating = False
End With
With ActiveWorkbook
.CustomViews.Add ViewName:="Mine", RowColSettings:=True
Me.AutoFilterMode = False
.CustomViews("Mine").Show
.CustomViews("Mine").Delete
End With
With Application
.EnableEvents = True
.ScreenUpdating = True
End With
End If
End Sub
Tôi cũng sử dụng VBA / Macro dựa trên Worksheet_Change
sự kiện, nhưng cách tiếp cận của tôi hơi khác một chút ... Ok, đầu tiên là mã và sau đó là các giải thích:
Private Sub Worksheet_Change(ByVal Target As Range)
' first remove filter
ActiveSheet.Range("$L$1:$L$126").AutoFilter Field:=1
' then apply it again
ActiveSheet.Range("$L$1:$L$126").AutoFilter Field:=1, Criteria1:="<>0"
End Sub
(Sử dụng tổ hợp phím Alt+ F11để làm bảng phát triển xuất hiện và dán mã vào bảng tính chứa bộ lọc bạn muốn tự động làm mới.)
Trong ví dụ của tôi, tôi giả sử có một bộ lọc đơn giản trên một cột (L trong trường hợp của tôi) và phạm vi dữ liệu của tôi nằm trên các hàng từ 1 (ngay cả khi nó có thể chứa tiêu đề) đến 126 (chọn một số đủ lớn để có chắc chắn rồi). Thao tác rất đơn giản: vì có gì đó được thay đổi trên trang tính của tôi, bộ lọc trên phạm vi đã chỉ định sẽ bị xóa / áp dụng lại để làm mới nó. Những gì cần một chút giải thích ở đây là Trường và Tiêu chí .
Các Dòng là một số nguyên bù đắp phạm vi. Trong trường hợp của tôi, tôi chỉ có một bộ lọc cột duy nhất và phạm vi được tạo bởi một cột đơn (L), là cột đầu tiên trong phạm vi (do đó tôi sử dụng 1 làm giá trị).
Các Tiêu chuẩn là một chuỗi mô tả các bộ lọc để áp dụng cho phạm vi dữ liệu. Trong ví dụ của tôi, tôi muốn chỉ hiển thị các hàng trong đó cột L khác 0 (do đó tôi đã sử dụng "<> 0").
Đó là tất cả. Để tham khảo thêm về phương pháp Range.AutoFilter, hãy xem: https://msdn.microsoft.com/en-us/l Library / office / ff193884.aspx
Chỉ để củng cố (các) câu trả lời:
Sorin nói:
Nhấp chuột phải vào tên trang tính của bạn, chọn "Xem mã" và dán mã bên dưới. Sau khi dán, nhấp vào biểu tượng Excel bên dưới "Tệp" ở trên cùng bên trái hoặc nhập Alt-F11, để quay lại chế độ xem bảng tính.
Điều này sẽ cho phép tự động làm mới. Đừng quên lưu tệp theo định dạng với hỗ trợ macro .xlsm.
Và Chris đã sử dụng mã này (mà tôi vừa làm năm 2010):
Private Sub Worksheet_Change(ByVal Target As Range)
ActiveSheet.AutoFilter.ApplyFilter
End Sub
Nếu bạn không mở rộng bài đăng, bạn chỉ thấy câu trả lời dài! ;)
Xin lỗi, không đủ đại diện để bình luận. (Quản trị viên, cảm thấy tự do để cắt giảm này thành một bình luận ở trên.) Tài khoản "danicotra" phản ứng bắt đầu với "Tôi sử dụng một VBA / Macro dựa trên sự kiện Worksheet_Change quá, nhưng cách tiếp cận của tôi ..." với
'bộ lọc loại bỏ đầu tiên
' sau đó áp dụng nó một lần nữa
là giải pháp chính xác khi sử dụng Excel 2007+. Tuy nhiên .AutoFilter.ApplyFilter không hợp lệ trong XL03 và trước đó vì vậy tôi chỉ ra cách bên dưới.
Tôi cầu xin các chuyên gia và bậc thầy thực sự đọc mã bởi vì tôi khá tự tin rằng đó là vật liệu hàng đầu. Có lẽ số lượng downvote không thể giải thích được cho câu trả lời này có thể được đảo ngược khi mọi người thấy những gì tốt được thực hiện dưới đây.
danicotra đã sử dụng một ví dụ đơn giản hóa. Trên thực tế, bạn có thể làm điều này nói chung hơn. Giả sử với ActiveSheet cho các mục sau (hoặc một số đối tượng trang tính khác):
Lưu phạm vi của bộ lọc tự động. Nó có các cột .AutoFilter.Filters.Count và (.AutoFilter.Range.Count / .AutoFilter.Filters.Count), được lưu vào rngAutofilter
Thu thập trong một mảng myAutofilters mỗi trong số 4 thuộc tính của mỗi .AutoFilter.Filters.Count các mục tự động lọc, lưu ý rằng bạn tránh "Lỗi do ứng dụng xác định" khi .On hoặc .Operator là sai. (myAutofilters sẽ được giới thiệu lại với số lượng hàng và cột trong bước 1)
Tắt bộ lọc nhưng duy trì danh sách thả xuống với .Show ALLData
Đối với mỗi bộ lọc Mục đó là .On theo mảng đã lưu của bạn, hãy đặt lại 3 trong số 4 thuộc tính của từng mục .AutoFilter.Filters.Count các mục tự động lọc. Một lần nữa lưu ý rằng bạn tránh "Lỗi do ứng dụng xác định" khi .Operator là sai, vì vậy đối với mỗi mục "i",
rngAutofilter.AutoFilter Field: = i, Criteria1: = myAutofilters (i, 2)
hoặc
rngAutofilter.AutoFilter i, Criteria1: = myAutofilters (i, 2), Toán tử: = myAutofilters (i, 3), Criteria2: = myAutofilters (i, 4)
Bây giờ bộ lọc tự động sẽ được khôi phục, trên cùng phạm vi như trước khi mã của bạn bắt đầu, nhưng với bộ lọc tự động được cập nhật để thay đổi dữ liệu.
Public myAutofilters As Variant, rngAutofilter As Range 'Public
Sub SaveAndRestoreAutofilters()
'This will update the autofilter display to recognize data changes by turning autofilter off and then on, preserving all characteristics
'Note, XL2007 and later have .autofilter.applyfilter, but not the invaluable XL03 and earlier
Dim i As Long, iNumAutofilters As Long, iNumActiveAutofilters As Long
iNumActiveAutofilters = SaveAutoFilterInfo(iNumAutofilters) 'NOTE! Use CALL or assignment to prevent parentheses from forcing ByVal !
If iNumActiveAutofilters < 1 Then
Application.StatusBar = "0 ACTIVE filters;" & iNumAutofilters & " autofilters"
Exit Sub
End If
ActiveSheet.ShowAllData
Rem Here optionally do stuff which can include changing data or toggling autofilter columns
For i = 1 To iNumAutofilters
If myAutofilters(i, 1) Then
If myAutofilters(i, 3) <> 0 Then 'then .Operator is something, so set it and Criteria2, else just Criteria1
rngAutofilter.AutoFilter Field:=i, Criteria1:=myAutofilters(i, 2), Operator:=myAutofilters(i, 3), Criteria2:=myAutofilters(i, 4) ', On:=true by rule
Else
rngAutofilter.AutoFilter Field:=i, Criteria1:=myAutofilters(i, 2) ', On:=true by rule (it's R/O anyway)
End If
Rem Selection.AutoFilter Field:=i 'How you'd "turn off" only a single column's autofiltering. FYI .On is R/O!
End If
'activesheet.autofiltermode=false 'just FYI, how you comprehensively turn off filtering on a sheet (erasing the dropdowns and criteria and filter range!)
Next i
End Sub
Function SaveAutoFilterInfo(iNumAutofilters As Long) As Long
Dim i As Long, iRowsAutofiltered As Long
SaveAutoFilterInfo = 0 'counts the number that are .On, and returns the total
iNumAutofilters = ActiveSheet.AutoFilter.Range.Columns.Count
If ActiveSheet.AutoFilter.Filters.Count <> iNumAutofilters Then MsgBox "I can't explain this. All bets are off. Aborting.": Exit function
ReDim myAutofilters(1 To iNumAutofilters, 4)
For i = 1 To iNumAutofilters
myAutofilters(i, 1) = ActiveSheet.AutoFilter.Filters(i).On
If myAutofilters(i, 1) Then
SaveAutoFilterInfo = SaveAutoFilterInfo + 1
myAutofilters(i, 2) = ActiveSheet.AutoFilter.Filters(i).Criteria1
myAutofilters(i, 3) = ActiveSheet.AutoFilter.Filters(i).Operator
If myAutofilters(i, 3) <> 0 Then 'then is either xlAnd, xlOr, etc., and there's a second criteria
myAutofilters(i, 4) = ActiveSheet.AutoFilter.Filters(i).Criteria2
End If
End If
Next i
iRowsAutofiltered = ActiveSheet.AutoFilter.Range.Count / ActiveSheet.AutoFilter.Range.Columns.Count
Set rngAutofilter = Cells(ActiveSheet.AutoFilter.Range.Row, ActiveSheet.AutoFilter.Range.Column).Resize(iRowsAutofiltered, iNumAutofilters)
End Function
sử dụng "dữ liệu, từ bảng" / truy vấn nguồn trong excel, cho phép chúng ta tùy chọn để làm mới dữ liệu khi mở tệp. (cũng tự động sắp xếp và cột chỉ mục (số hàng được lọc tự động)) Điều này sẽ tạo ra kết quả trong một tờ khác. -Chọn dữ liệu cần thiết bằng chuột (hàng và cột) -nhấp vào tab dữ liệu, từ bảng -Trong cột cuối cùng, loại trừ khoảng trống (tùy chọn, nếu bạn muốn chỉ hiển thị các ô đã điền) cột -add, cột chỉ mục (tùy chọn, nếu bạn muốn thêm số hàng vào kết quả được lọc) -đóng và tải đến để chỉnh sửa lại, nhấp vào tab truy vấn và sau đó chỉnh sửa nhấp vào tab thiết kế trong excel, vào mũi tên bên dưới làm mới, thuộc tính kết nối, làm mới dữ liệu khi mở tập tin được điều chỉnh từ: https://www.excelcampus.com/tips/sort-drop-down-lists-automatically/ phần: 3. Sắp xếp danh sách thả xuống bằng Power Query bạn cũng có thể sao chép dữ liệu từ sheet1 nếu không trống, ví dụ trường a1. sao chép này vào trường a1 trong sheet2: = IF (Trang tính 1! A1 ""; Trang tính 1! A1; "")