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?


15

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.


3
Tôi đã có thể làm cho nó hoạt động khi tôi đặt mã đó vào sự kiện Worksheet_Change () thay vì sự kiện Worksheet_Calculate ().
F106dart

1
đặt câu hỏi này như một câu trả lời và chấp nhận nó, để người khác biết bạn đã làm gì và câu hỏi đã được giải quyết.
jzd

Tôi đã phải thực hiện một sửa đổi khác bởi vì Tính toán đang mong đợi một tham số. Bây giờ nó hoạt động!.
sorin

Câu trả lời:


7

Trao đổi mã với điều này dường như cũng thực hiện thủ thuật (ít nhất là trong Excel 2010):

Private Sub Worksheet_Change(ByVal Target As Range)

    ActiveSheet.AutoFilter.ApplyFilter

End Sub

4

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


1

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

1

Tôi cũng sử dụng VBA / Macro dựa trên Worksheet_Changesự 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ườngTiê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


0

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! ;)


-1

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):

  1. 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

  2. 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)

  3. Tắt bộ lọc nhưng duy trì danh sách thả xuống với .Show ALLData

  4. Đố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

Tại sao trong THẾ GIỚI, ai đó sẽ đánh giá thấp câu trả lời hữu ích này, thậm chí bao gồm mã tự đứng hoàn chỉnh (và được kiểm tra nhiều), và thậm chí đưa ra lời giải thích chi tiết về mã? Tôi đang hỏi, nghiêm túc đấy. Mọi người có muốn giúp đỡ chuyên nghiệp tốt trong siêu người dùng hay tôi thậm chí không nên bận tâm? Có troll mà chỉ đi xuống, để tương đối tự chống đỡ ??
MicrosoftShouldBeKickyInNuts

1
Ít nhất có b___s để bình luận nếu bạn downvote, vì vậy tôi có thể sử dụng phản hồi để phục vụ cộng đồng tốt hơn. Quản trị viên, đó là một đề xuất tôi muốn thực hiện. Có tất cả các downvote yêu cầu một nhận xét giải thích. Tôi đã thấy nhiều bài viết rõ ràng tuyệt vời không thể giải thích được, nó thực sự là một dịch bệnh trong siêu người dùng - và không nơi nào khác.
MicrosoftShouldBeKickyInNuts

-1
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; "")

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.