ฉันจะรีเฟรชตัวกรองอัตโนมัติของ Excel อัตโนมัติได้อย่างไรเมื่อมีการเปลี่ยนแปลงข้อมูล
ใช้กรณี: ฉันเปลี่ยนค่าของเซลล์หนึ่งเป็นค่าที่ถูกกรอง ฉันต้องการเห็นแถวปัจจุบันหายไปโดยไม่ต้องทำอะไรอย่างอื่น
ฉันจะรีเฟรชตัวกรองอัตโนมัติของ Excel อัตโนมัติได้อย่างไรเมื่อมีการเปลี่ยนแปลงข้อมูล
ใช้กรณี: ฉันเปลี่ยนค่าของเซลล์หนึ่งเป็นค่าที่ถูกกรอง ฉันต้องการเห็นแถวปัจจุบันหายไปโดยไม่ต้องทำอะไรอย่างอื่น
คำตอบ:
การแลกเปลี่ยนโค้ดด้วยสิ่งนี้ดูเหมือนจะเป็นการหลอกลวงด้วย (อย่างน้อยใน Excel 2010):
Private Sub Worksheet_Change(ByVal Target As Range)
ActiveSheet.AutoFilter.ApplyFilter
End Sub
ฉันพบว่าเมื่อฉันทำงานกับตารางสิ่งนี้ไม่ทำงาน ตัวกรองไม่ได้อยู่บนแผ่น แต่อยู่บนโต๊ะ รหัสนี้ได้หลอกลวง
Private Sub Worksheet_Change(ByVal Target As Range)
With ActiveWorkbook.Worksheets("Sheet1").ListObjects("Table1")
.AutoFilter.ApplyFilter
End With
End Sub
ฉันพบข้อมูลที่นี่: http://www.jkp-ads.com/articles/Excel2007TablesVBA.asp
คลิกขวาที่ชื่อแผ่นงานของคุณเลือก "ดูรหัส" และวางรหัสด้านล่าง หลังจากวางให้คลิกไอคอน Excel ด้านล่าง "ไฟล์" ที่ด้านบนซ้ายหรือพิมพ์ Alt-F11 เพื่อกลับไปที่มุมมองสเปรดชีต
วิธีนี้จะเปิดใช้งานการรีเฟรชอัตโนมัติ .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
ฉันใช้ VBA / Macro ตามWorksheet_Change
เหตุการณ์เช่นกัน แต่วิธีการของฉันนั้นแตกต่างกันเล็กน้อย ... ตกลงรหัสแรกและคำอธิบาย:
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
(ใช้การรวมแป้นAlt+ F11เพื่อให้แผงการพัฒนาปรากฏขึ้นและวางรหัสลงในแผ่นงานที่มีตัวกรองที่คุณต้องการให้รีเฟรชอัตโนมัติ)
ในตัวอย่างของฉันฉันสมมติว่ามีตัวกรองแบบง่าย ๆ ในคอลัมน์เดียว (L ในกรณีของฉัน) และช่วงข้อมูลของฉันอยู่ในแถวจาก 1 (แม้ว่าอาจจะมีหัวเรื่อง) ถึง 126 (เลือกจำนวนที่มากพอที่จะ แน่นอน) การดำเนินการนั้นง่าย: เมื่อมีบางสิ่งเปลี่ยนแปลงบนชีตของฉันตัวกรองในช่วงที่ระบุจะถูกลบ / นำกลับมาใช้อีกครั้งเพื่อให้รีเฟรช สิ่งที่ต้องบิตของคำอธิบายที่นี่มีสนามและเกณฑ์
สนามเป็นจำนวนเต็มชดเชยช่วง ในกรณีของฉันฉันมีตัวกรองคอลัมน์เดียวเท่านั้นและช่วงนั้นสร้างโดยคอลัมน์เดียว (L) ซึ่งเป็นตัวแรกในช่วง (ดังนั้นฉันจึงใช้ 1 เป็นค่า)
เกณฑ์เป็นสตริงที่อธิบายตัวกรองเพื่อนำไปใช้ช่วงข้อมูล ในตัวอย่างของฉันฉันต้องการแสดงเฉพาะแถวที่คอลัมน์ L แตกต่างจาก 0 (ดังนั้นฉันจึงใช้ "<> 0")
นั่นคือทั้งหมดที่ สำหรับการอ้างอิงเพิ่มเติมเกี่ยวกับวิธี Range.AutoFilter ดู: https://msdn.microsoft.com/en-us/library/office/ff193884.aspx
เพียงเพื่อรวมคำตอบ:
โซรินพูดว่า:
คลิกขวาที่ชื่อแผ่นงานของคุณเลือก "ดูรหัส" และวางรหัสด้านล่าง หลังจากวางให้คลิกไอคอน Excel ด้านล่าง "ไฟล์" ที่ด้านบนซ้ายหรือพิมพ์ Alt-F11 เพื่อกลับไปที่มุมมองสเปรดชีต
วิธีนี้จะเปิดใช้งานการรีเฟรชอัตโนมัติ อย่าลืมที่จะบันทึกไฟล์ในรูปแบบที่มีการสนับสนุนแมโครโกหก. xlsm
และ Chris ใช้รหัสนี้ (ซึ่งฉันเพิ่งทำในปี 2010):
Private Sub Worksheet_Change(ByVal Target As Range)
ActiveSheet.AutoFilter.ApplyFilter
End Sub
หากคุณไม่ขยายโพสต์คุณจะเห็นคำตอบที่ยาว! ;)
ขออภัยมีตัวแทนไม่เพียงพอที่จะแสดงความคิดเห็น (ผู้ดูแลระบบรู้สึกอิสระที่จะตัดสิ่งนี้ลงในความคิดเห็นด้านบน) ผู้ใช้ "danicotra" การตอบกลับที่เริ่มต้นด้วย "ฉันใช้ VBA / มาโครตามเหตุการณ์ Worksheet_Change ด้วยเช่นกัน แต่แนวทางของฉัน ... " ด้วย
'ลบตัวกรองแรก
' จากนั้นใช้ อีกครั้ง
เป็นทางออกที่ถูกต้องเมื่อใช้ Excel 2007+ อย่างไรก็ตาม. AutoFilter.ApplyFilter ไม่ถูกต้องใน XL03 และรุ่นก่อนหน้าดังนั้นฉันจึงแสดงวิธีด้านล่าง
ฉันขอผู้เชี่ยวชาญที่แท้จริงและผู้เชี่ยวชาญด้านการอ่านรหัสเพราะฉันค่อนข้างมั่นใจว่ามันเป็นวัสดุชั้นบนสุด บางทีคำตอบที่ลงความเห็นไม่ได้นับบนคำตอบนี้อาจถูกย้อนกลับเมื่อผู้คนเห็นสิ่งที่ดีที่ทำไว้ด้านล่าง
danicotra ใช้ตัวอย่างง่าย ๆ จริงๆแล้วคุณสามารถทำได้มากกว่านี้ สมมติว่ามี ActiveSheet สำหรับสิ่งต่อไปนี้ (หรือวัตถุแผ่นงานอื่น)
บันทึกช่วงของตัวกรองอัตโนมัติ มีคอลัมน์. AutoFilter.Filters.Count และ (.AutoFilter.Range.Count / .AutoFilter.Filters.Filters.Count) แถวบันทึกไปยัง rngAutofilter
รวบรวมในอาร์เรย์ myAutofilters แต่ละคุณสมบัติ 4 ของแต่ละรายการ. AutoFilter.Filters.Count รายการตัวกรองอัตโนมัติดูแลว่าคุณหลีกเลี่ยง "ข้อผิดพลาดที่กำหนดโดยแอปพลิเคชัน" เมื่อ. On หรือ. Operator เป็นเท็จ (myAutofilters จะเปลี่ยนเป็นจำนวนแถวและคอลัมน์ในขั้นตอนที่ 1)
ปิดตัวกรอง แต่เก็บดร็อปดาวน์ด้วย .ShowAllData
สำหรับรายการตัวกรองแต่ละรายการที่เป็น. ตามอาร์เรย์ที่บันทึกไว้ของคุณให้รีเซ็ต 3 จาก 4 คุณสมบัติของแต่ละรายการ. AutoFilter.Filters.Count รายการตัวกรองอัตโนมัติ โปรดระมัดระวังอีกครั้งว่าคุณหลีกเลี่ยง "ข้อผิดพลาดที่กำหนดโดยแอปพลิเคชัน" เมื่อ. Operator เป็นเท็จดังนั้นสำหรับแต่ละรายการ "i",
rngAutofilter.AutoFilter Field: = i, Criteria1: = myAutofilters (i, 2)
หรือ
rngAutofilter.AutoFilter i, Criteria1: = myAutofilters (i, 2), Operator: = myAutofilters (i, 3), Criteria2: = myAutofilters (i, 4)
ตอนนี้ตัวกรองอัตโนมัติจะถูกสร้างขึ้นใหม่ในช่วงเดียวกับก่อนที่รหัสของคุณจะเริ่ม แต่ด้วยตัวกรองอัตโนมัติที่ได้รับการปรับปรุงสำหรับการเปลี่ยนแปลงข้อมูล
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
ใช้ "data, from table" / power query ใน excel ซึ่งทำให้เรามีตัวเลือกในการรีเฟรชข้อมูลเมื่อเปิดไฟล์ (เช่นการเรียงลำดับอัตโนมัติและคอลัมน์ดัชนี (จำนวนแถวที่ถูกกรองโดยอัตโนมัติ)) สิ่งนี้จะสร้างผลลัพธ์ในชีตอื่น - เลือกข้อมูลที่ต้องการโดยใช้เมาส์ (แถวและคอลัมน์) คลิกที่แท็บข้อมูลจากตาราง - ในคอลัมน์สุดท้ายยกเว้นช่องว่าง (ตัวเลือกถ้าคุณต้องการแสดงเฉพาะเซลล์ที่เต็มไป) - เพิ่มคอลัมน์, คอลัมน์ดัชนี (ตัวเลือก, ถ้าคุณต้องการเพิ่มหมายเลขแถวเพื่อกรองผลลัพธ์) - ปิดและโหลดไปที่ เพื่อแก้ไขอีกครั้งคลิกที่แท็บแบบสอบถามและจากนั้นในการแก้ไข คลิกที่แท็บออกแบบใน excel ที่ลูกศรด้านล่างรีเฟรชคุณสมบัติการเชื่อมต่อ รีเฟรชข้อมูลเมื่อเปิดไฟล์ ดัดแปลงมาจาก: https://www.excelcampus.com/tips/sort-drop-down-lists-automatically/ ส่วนหนึ่ง: 3. การเรียงลำดับรายการแบบหล่นลงโดยใช้ Power Query คุณสามารถคัดลอกข้อมูลจาก sheet1 หากไม่ว่างเปล่าเช่นฟิลด์ a1 คัดลอกข้อมูลนี้ไปยังฟิลด์ a1 ใน sheet2: = IF (Sheet1 A1 "!";! Sheet1 A1; "")