Veriler değiştirildiğinde bir Excel otomatik filtresini otomatik olarak nasıl yenileyebilirim?


15

Veriler değiştirildiğinde Excel otomatik filtresini otomatik olarak nasıl yenileyebilirim?

Kullanım örneği: Bir hücrenin değerini, filtrelenmiş bir değere değiştiririm. Geçerli satırın başka bir şey yapmadan yok olduğunu görmek istiyorum.


3
Bu kodu Worksheet_Calculate () olayı yerine Worksheet_Change () olayına koyduğumda çalışabildim.
F106dart

1
başkalarına ne yaptığınızı ve sorunun çözüldüğünü bilmeleri için bunu bir cevap olarak kabul edin ve kabul edin.
jzd

Calculate bir parametre bekliyordu çünkü başka bir değişiklik yapmak zorunda kaldı. Şimdi çalışıyor!.
sorin

Yanıtlar:


7

Kodun bununla değiştirilmesi de işe yarıyor (en azından Excel 2010'da):

Private Sub Worksheet_Change(ByVal Target As Range)

    ActiveSheet.AutoFilter.ApplyFilter

End Sub

4

Tablolarla çalıştığımda bunun işe yaramadığını fark ettim. Filtre kağıt üzerinde değil, masadaydı. bu kod hile yaptı

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

Bilgileri burada buldum: http://www.jkp-ads.com/articles/Excel2007TablesVBA.asp


1

Sayfa adınızı sağ tıklayın, "Kodu Görüntüle" yi seçin ve aşağıdaki kodu yapıştırın. Yapıştırdıktan sonra, sol üst köşedeki "Dosya" nın altındaki Excel simgesini tıklayın veya e-tablo görünümüne dönmek için Alt-F11 yazın.

Bu otomatik yenilemeyi etkinleştirir. Dosyayı makro desteği ile bir biçimde kaydetmeyi unutmayın .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

Ben de Worksheet_Changeolaya dayalı bir VBA / Makro kullanın , ama benim yaklaşım biraz farklı ... Tamam, önce kod ve sonra açıklamalar:

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

( Geliştirme panelinin görünmesini sağlamak için Alt+ F11tuşları bileşimini kullanın ve kodu otomatik olarak yenilenmesini istediğiniz filtreyi içeren çalışma sayfasına yapıştırın.)

Örneğimde, tek bir sütunda (benim durumumda L) basit bir filtreye sahip olduğumu ve veri aralığımın (başlık içeriyor olsa bile) 1'den 126'ya kadar olan satırlarda olduğunu varsayıyorum ( Elbette). İşlem basit: sayfamda bir şey değiştiğinden, belirtilen aralıktaki filtre yenilenir / yenilenir. Açıklama biraz gerekenler burada Field ve Kriterleri .

Alan aralığının ofset bir tamsayıdır. Benim durumumda, sadece tek bir sütun filtresi var ve aralık, aralıktaki ilk olan tek bir sütun (L) tarafından yapılır (bu nedenle değer olarak 1 kullanıyorum).

Kriterler veri aralığına uygulamak filtreyi tanımlayan bir dizedir. Örneğimde, yalnızca L sütununun 0'dan farklı olduğu satırları göstermek istiyorum (bu nedenle "<> 0" kullanıyorum).

Bu kadar. Range.AutoFilter yöntemi hakkında daha fazla bilgi için bkz. Https://msdn.microsoft.com/en-us/library/office/ff193884.aspx


0

Sadece cevapları birleştirmek için:

Sorin diyor ki:

Sayfa adınızı sağ tıklayın, "Kodu Görüntüle" yi seçin ve aşağıdaki kodu yapıştırın. Yapıştırdıktan sonra, sol üst köşedeki "Dosya" nın altındaki Excel simgesini tıklayın veya e-tablo görünümüne dönmek için Alt-F11 yazın.

Bu otomatik yenilemeyi etkinleştirir. Dosyayı makro desteği yalan .xlsm olan bir biçimde kaydetmeyi unutmayın.

Ve Chris (2010'da yaptığım) bu kodu kullandı:

Private Sub Worksheet_Change(ByVal Target As Range)

    ActiveSheet.AutoFilter.ApplyFilter

End Sub

Yayını genişletmezseniz, yalnızca uzun cevabı görürsünüz! ;)


-1

Üzgünüz, yorum yapmak için yeterli temsilci yok. (Yöneticiler, bunu yukarıdaki bir yorumda kesmekten çekinmeyin.) Kullanıcı "danicotra" yanıtı ile başlayarak "Worksheet_Change olayını da temel alan bir VBA / Makro kullanıyorum, ama benim yaklaşımım ..." ile
'ilk filtreyi kaldır
' sonra uygula
Excel 2007+ kullanırken yine doğru çözümdür. Ancak .AutoFilter.ApplyFilter XL03 ve önceki sürümlerde geçersiz olduğundan aşağıdaki yolu göstereceğim.

Gerçek uzmanların ve guruların kodu okuması için yalvarıyorum çünkü üst raf malzemesi olduğundan oldukça eminim. Belki de insanlar aşağıdaki iyi şeyleri yaptığını gördüklerinde bu cevaba açıklanamayan iniş oranı tersine çevrilebilir.

danicotra basitleştirilmiş bir örnek kullandı. Aslında bunu daha genel yapabilirsiniz. ActiveSheet ile aşağıdakiler (veya başka bir sayfa nesnesi) için:

  1. Otomatik filtre aralığını kaydedin. RngAutofilter'a kaydedilen .AutoFilter.Filters.Count sütunlarına ve (.AutoFilter.Range.Count / .AutoFilter.Filters.Count) satırlarına sahiptir.

  2. .On veya .Operator yanlış olduğunda "Uygulama tanımlı hatalardan" kaçınmaya dikkat ederek, bir dizide. (myAutofilters, 1. adımdaki satır ve sütun sayısına döndürülecektir)

  3. Filtreyi kapatın ancak .ShowAllData ile açılır menüleri koruyun

  4. Kaydedilen dizinize göre .OutoFilter.Filters.Count otomatik filtre öğelerinin her birinin 4 özelliğinin 3'ünü sıfırlayın. Yine .Operator yanlış olduğunda "Uygulama tanımlı hatalardan" kaçınmaya dikkat edin, bu nedenle her "i" öğesi için
    rngAutofilter.AutoFilter Alanı: = i, Ölçüt1: = myAutofilters (i, 2)
    veya
    rngAutofilter.AutoFilter Alanı: = i, Ölçüt1: = myAutofilters (i, 2), Operatör: = myAutofilters (i, 3), Ölçüt2: = myAutofilters (i, 4)

Şimdi otomatik filtre, kodunuz başlamadan önceki aralıkla aynı şekilde, ancak verilerdeki değişiklikler için otomatik filtre güncellendiğinde yeniden yerleştirilecektir.

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

Neden DÜNYA'da bir kişi kendi başına bağımsız kodu (ve yoğun bir şekilde test edilmiş) içeren ve hatta kodun ayrıntılı bir açıklamasını veren bu yararlı cevabı küçümseyecekti? Cidden soruyorum. İnsanlar süper kullanıcılarda iyi bir profesyonel yardım istiyor mu yoksa rahatsız etmemeli miyim? Kendilerini göreceli olarak desteklemek için sadece aşağı oy kullanan troller var mı?
MicrosoftShouldBeKickedInNuts

2
En azından aşağı oy verirseniz yorum yapmak için b___s'ye sahip olun, böylece topluluğa daha iyi hizmet vermek için geri bildirimi kullanabilirim. Yöneticiler, yapmak istediğim bir teklif. Tüm downvotes açıklayıcı bir yorum gerektirir. Gerçekten süper kullanıcı bir salgın gibi görünüyor açıklanamayan çok açık çok büyük mesajlar gördüm - ve başka hiçbir yerde.
MicrosoftShouldBeKickedInNuts

+1 "Tüm downvotes açıklayıcı bir yorum gerektirir mi?"
Gravitate

-1
excel'de "tablodan veri" / güç sorgusu kullanarak bize dosya açarken verileri yenileme seçeneği sunar.
(ayrıca otomatik sıralama ve dizin sütunu (otomatik olarak filtrelenen satır sayısı)

Bu başka bir sayfada sonuç yaratacaktır.

-mouse kullanarak gereken verileri seçme (satırlar ve sütunlar)
-tablodan veri sekmesine tıklayın
- son sütunda boşlukları hariç tutun (isteğe bağlı, yalnızca doldurulmuş hücreleri görüntülemek istiyorsanız)
-ekleme sütunu, dizin sütunu (isteğe bağlı, filtrelenen sonuçlara satır numarası eklemek istiyorsanız)
- kapat ve yükle

tekrar düzenlemek için sorgu sekmesini tıklayın ve ardından düzenle

excel'de tasarım sekmesine tıklayın, yenilemenin altındaki oka, bağlantı özelliklerine,
dosyayı açarken verileri yenile.


uyarlandı: https://www.excelcampus.com/tips/sort-drop-down-lists-automatically/
bölüm: 3. Power Query Kullanarak Açılır Listeleri Sıralama


boş değilse, sayfa1'deki verileri de kopyalayabilirsiniz, örneğin a1 alanı.
bunu sayfa2'deki a1 alanına kopyala:
= EĞER (Sayfa1 A1 "!"; Sayfa1! A1; "")

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.