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.
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.
Yanıtlar:
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
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
Ben de Worksheet_Change
olaya 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
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! ;)
Ü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:
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.
.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)
Filtreyi kapatın ancak .ShowAllData ile açılır menüleri koruyun
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
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; "")