Bagaimana cara me-refresh ulang filter otomatis Excel saat data diubah?

15

Bagaimana cara saya me-refresh ulang filter otomatis Excel saat data diubah?

Use case: Saya mengubah nilai satu sel ke nilai yang difilter. Saya ingin melihat baris saat ini menghilang tanpa harus melakukan hal lain.

Sorin
sumber
3
Saya bisa membuatnya berfungsi ketika saya meletakkan kode itu di acara Worksheet_Change () alih-alih acara Worksheet_Calculate ().
F106dart
1
letakkan ini sebagai jawaban dan terimalah, sehingga orang lain tahu apa yang Anda lakukan dan bahwa pertanyaan itu telah diselesaikan.
jzd
Saya harus membuat modifikasi lain karena Calculate mengharapkan parameter. Sekarang berhasil !.
sorin

Jawaban:

7

Saling menukar kode dengan ini sepertinya melakukan trik juga (setidaknya di Excel 2010):

Private Sub Worksheet_Change(ByVal Target As Range)

    ActiveSheet.AutoFilter.ApplyFilter

End Sub
Chris
sumber
4

Saya menemukan bahwa ketika saya bekerja dengan tabel, ini tidak berhasil. Filter tidak ada di lembar tetapi di meja. kode ini berhasil

Private Sub Worksheet_Change(ByVal Target As Range)
    With ActiveWorkbook.Worksheets("Sheet1").ListObjects("Table1")
         .AutoFilter.ApplyFilter
    End With
End Sub

Saya menemukan informasi di sini: http://www.jkp-ads.com/articles/Excel2007TablesVBA.asp

Tidak Ada Lagi Hacks
sumber
1

Klik kanan pada nama sheet Anda, pilih "Lihat Kode" dan tempel kode di bawah ini. Setelah menempel, klik ikon Excel di bawah "File" di kiri atas, atau ketik Alt-F11, untuk kembali ke tampilan spreadsheet.

Ini akan memungkinkan penyegaran otomatis. Jangan lupa untuk menyimpan file dalam format dengan kebohongan dukungan makro .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
Sorin
sumber
1

Saya menggunakan VBA / Makro berdasarkan Worksheet_Changeacara juga, tetapi pendekatan saya sedikit berbeda ... Ok, pertama kode dan kemudian penjelasannya:

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

(Gunakan kombinasi tombol Alt+ F11untuk membuat panel pengembangan muncul dan tempel kode ke lembar kerja yang berisi filter yang ingin Anda segarkan secara otomatis.)

Dalam contoh saya, saya mengasumsikan memiliki filter sederhana pada satu kolom (L dalam kasus saya) dan bahwa rentang data saya ada di baris dari 1 (bahkan jika mungkin berisi tajuk) ke 126 (pilih nomor yang cukup hebat untuk dijadikan Tentu). Operasi ini sederhana: karena ada sesuatu yang berubah pada lembar saya, filter pada rentang yang ditentukan akan dihapus / diterapkan kembali sehingga untuk membuatnya segar. Yang perlu sedikit penjelasan di sini adalah Field dan Kriteria .

The Lapangan adalah bilangan bulat offset jangkauan. Dalam kasus saya, saya hanya memiliki satu filter kolom dan rentang dibuat oleh satu kolom (L) yang merupakan yang pertama dalam rentang (karena itu saya menggunakan 1 sebagai nilai).

The Kriteria adalah string yang menjelaskan filter untuk diterapkan ke berbagai data. Dalam contoh saya, saya ingin menunjukkan hanya baris di mana kolom L berbeda dari 0 (karenanya saya menggunakan "<> 0").

Itu saja. Untuk referensi lebih lanjut tentang metode Range.AutoFilter, lihat: https://msdn.microsoft.com/en-us/library/office/ff193884.aspx

danicotra
sumber
0

Hanya untuk mengkonsolidasikan jawaban:

Sorin mengatakan:

Klik kanan pada nama sheet Anda, pilih "Lihat Kode" dan tempel kode di bawah ini. Setelah menempel, klik ikon Excel di bawah "File" di kiri atas, atau ketik Alt-F11, untuk kembali ke tampilan spreadsheet.

Ini akan memungkinkan penyegaran otomatis. Jangan lupa untuk menyimpan file dalam format dengan dukungan makro .xlsm.

Dan Chris menggunakan kode ini (yang baru saja saya lakukan pada 2010):

Private Sub Worksheet_Change(ByVal Target As Range)

    ActiveSheet.AutoFilter.ApplyFilter

End Sub

Jika Anda tidak memperluas posting, Anda hanya akan melihat jawaban yang panjang! ;)

Cowok acak
sumber
-1

Maaf, rep komentar tidak mencukupi. (Admin, silakan memotong ini menjadi komentar di atas.) Respons pengguna "danicotra" dimulai dengan "Saya menggunakan VBA / Makro berdasarkan pada worksheet_Change event juga, tapi pendekatan saya ..." dengan
'filter hapus pertama
' kemudian terapkan lagi
adalah solusi yang tepat ketika menggunakan Excel 2007+. Namun .AutoFilter.ApplyFilter tidak valid di XL03 dan sebelumnya jadi saya menunjukkan cara di bawah ini.

Saya mohon agar para ahli dan guru yang benar membaca kode karena saya cukup yakin bahwa itu adalah bahan rak paling atas. Mungkin hitungan downvote yang tidak dapat dijelaskan pada jawaban ini dapat dibalik ketika orang melihat hal baik apa yang dilakukan di bawah.

danicotra menggunakan contoh sederhana. Sebenarnya, Anda dapat melakukan ini secara lebih umum. Asumsikan Dengan ActiveSheet untuk yang berikut (atau objek lembar lainnya):

  1. Simpan rentang autofilter. Ini memiliki .AutoFilter.Filters.Count kolom, dan (.AutoFilter.Range.Count / .AutoFilter.Filters.Count) baris, disimpan ke rngAutofilter

  2. Kumpulkan dalam array myAutofilters masing-masing dari 4 properti masing-masing .AutoFilter.Filters.Count Item autofilter, berhati-hatilah agar Anda menghindari "Kesalahan yang ditentukan aplikasi" ketika .Pada atau .Operator salah. (myAutofilters akan direDim ke jumlah baris dan kolom pada langkah 1)

  3. Matikan filter tetapi pertahankan dropdown dengan .ShowAllData

  4. Untuk setiap Item filter yang. Pada menurut array yang disimpan, atur ulang 3 dari 4 properti masing-masing .AutoFilter.Filters.Count Item autofilter. Sekali lagi berhati-hatilah agar Anda menghindari "Kesalahan yang ditentukan aplikasi" ketika .Operator salah, jadi untuk setiap item "i",
    rngAutofilter. Bidang AutoFilter: = i, Kriteria1: = myAutofilters (i, 2)
    atau
    rngAutofilter.AutoFilter Field: = i, Kriteria1: = myAutofilters (i, 2), Operator: = myAutofilters (i, 3), Kriteria2: = myAutofilters (i, 4)

Sekarang autofilter akan diaktifkan kembali, dalam kisaran yang sama seperti sebelum kode Anda dimulai, tetapi dengan autofilter diperbarui untuk perubahan data.

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
MicrosoftShouldBeKickedInNuts
sumber
Mengapa di DUNIA seseorang akan menurunkan jawaban yang bermanfaat ini, yang bahkan mencakup kode mandiri lengkap (dan sangat teruji), dan bahkan memberikan penjelasan rinci tentang kode tersebut? Aku bertanya, serius. Apakah orang menginginkan bantuan profesional yang baik dalam superuser atau haruskah saya tidak repot-repot? Apakah ada troll yang hanya downvoting, dalam rangka untuk relatif menopang diri mereka sendiri ??
MicrosoftShouldBeKickedInNuts
1
Setidaknya minta b___s untuk berkomentar jika Anda downvote, jadi saya bisa menggunakan umpan balik untuk melayani komunitas dengan lebih baik. Admin, itu proposal yang ingin saya buat. Apakah semua downvotes memerlukan komentar penjelasan. Saya telah melihat banyak posting besar yang jelas-jelas diturunkan, yang tampaknya benar-benar menjadi epidemi superuser - dan tidak ada tempat lain.
MicrosoftShouldBeKickedInNuts
-1
menggunakan "data, dari tabel" / kueri daya di excel, yang memberi kita opsi untuk menyegarkan data saat membuka file.
(juga pengurutan otomatis, dan kolom indeks (nomor baris yang difilter secara otomatis))

Ini akan menghasilkan hasil di lembar lain.

-Pilih data yang diperlukan menggunakan mouse (baris dan kolom)
-Klik tab data, dari tabel
-di kolom terakhir, kecualikan yang kosong (opsional, jika Anda ingin hanya menampilkan sel yang diisi)
-menambahkan kolom, kolom indeks (opsional, jika Anda ingin menambahkan nomor baris ke hasil yang difilter)
-Dekat dan memuat ke

untuk mengedit lagi, klik pada tab permintaan, dan kemudian edit

klik pada tab desain di excel, pada panah di bawah refresh, properti koneksi,
menyegarkan data saat membuka file.


diadaptasi dari: https://www.excelcampus.com/tips/sort-drop-down-lists-automatically/
bagian: 3. Menyortir Daftar Drop Down Menggunakan Power Query


Anda juga dapat menyalin data dari sheet1 jika tidak kosong, misalnya bidang a1.
salin ini ke bidang a1 di sheet2:
= JIKA (Sheet1! A1 ""; Sheet1! A1; "")

Bojan Djuric
sumber