วิธีรีเฟรชตัวกรองอัตโนมัติของ Excel อัตโนมัติเมื่อมีการเปลี่ยนแปลงข้อมูลอย่างไร


15

ฉันจะรีเฟรชตัวกรองอัตโนมัติของ Excel อัตโนมัติได้อย่างไรเมื่อมีการเปลี่ยนแปลงข้อมูล

ใช้กรณี: ฉันเปลี่ยนค่าของเซลล์หนึ่งเป็นค่าที่ถูกกรอง ฉันต้องการเห็นแถวปัจจุบันหายไปโดยไม่ต้องทำอะไรอย่างอื่น


3
ฉันสามารถทำให้มันทำงานเมื่อฉันใส่รหัสนั้นในเหตุการณ์ Worksheet_Change () แทนที่จะเป็นเหตุการณ์ Worksheet_Calculate ()
F106dart

1
ใส่นี่เป็นคำตอบและยอมรับเพื่อให้คนอื่นรู้ว่าคุณทำอะไรและคำถามนั้นได้รับการแก้ไขแล้ว
jzd

ฉันต้องทำการปรับเปลี่ยนอื่นเพราะการคำนวณกำลังคาดหวังว่าพารามิเตอร์ ตอนนี้มันใช้งานได้!
sorin

คำตอบ:


7

การแลกเปลี่ยนโค้ดด้วยสิ่งนี้ดูเหมือนจะเป็นการหลอกลวงด้วย (อย่างน้อยใน Excel 2010):

Private Sub Worksheet_Change(ByVal Target As Range)

    ActiveSheet.AutoFilter.ApplyFilter

End Sub

4

ฉันพบว่าเมื่อฉันทำงานกับตารางสิ่งนี้ไม่ทำงาน ตัวกรองไม่ได้อยู่บนแผ่น แต่อยู่บนโต๊ะ รหัสนี้ได้หลอกลวง

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


1

คลิกขวาที่ชื่อแผ่นงานของคุณเลือก "ดูรหัส" และวางรหัสด้านล่าง หลังจากวางให้คลิกไอคอน 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

1

ฉันใช้ 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


0

เพียงเพื่อรวมคำตอบ:

โซรินพูดว่า:

คลิกขวาที่ชื่อแผ่นงานของคุณเลือก "ดูรหัส" และวางรหัสด้านล่าง หลังจากวางให้คลิกไอคอน Excel ด้านล่าง "ไฟล์" ที่ด้านบนซ้ายหรือพิมพ์ Alt-F11 เพื่อกลับไปที่มุมมองสเปรดชีต

วิธีนี้จะเปิดใช้งานการรีเฟรชอัตโนมัติ อย่าลืมที่จะบันทึกไฟล์ในรูปแบบที่มีการสนับสนุนแมโครโกหก. xlsm

และ Chris ใช้รหัสนี้ (ซึ่งฉันเพิ่งทำในปี 2010):

Private Sub Worksheet_Change(ByVal Target As Range)

    ActiveSheet.AutoFilter.ApplyFilter

End Sub

หากคุณไม่ขยายโพสต์คุณจะเห็นคำตอบที่ยาว! ;)


-1

ขออภัยมีตัวแทนไม่เพียงพอที่จะแสดงความคิดเห็น (ผู้ดูแลระบบรู้สึกอิสระที่จะตัดสิ่งนี้ลงในความคิดเห็นด้านบน) ผู้ใช้ "danicotra" การตอบกลับที่เริ่มต้นด้วย "ฉันใช้ VBA / มาโครตามเหตุการณ์ Worksheet_Change ด้วยเช่นกัน แต่แนวทางของฉัน ... " ด้วย
'ลบตัวกรองแรก
' จากนั้นใช้ อีกครั้ง
เป็นทางออกที่ถูกต้องเมื่อใช้ Excel 2007+ อย่างไรก็ตาม. AutoFilter.ApplyFilter ไม่ถูกต้องใน XL03 และรุ่นก่อนหน้าดังนั้นฉันจึงแสดงวิธีด้านล่าง

ฉันขอผู้เชี่ยวชาญที่แท้จริงและผู้เชี่ยวชาญด้านการอ่านรหัสเพราะฉันค่อนข้างมั่นใจว่ามันเป็นวัสดุชั้นบนสุด บางทีคำตอบที่ลงความเห็นไม่ได้นับบนคำตอบนี้อาจถูกย้อนกลับเมื่อผู้คนเห็นสิ่งที่ดีที่ทำไว้ด้านล่าง

danicotra ใช้ตัวอย่างง่าย ๆ จริงๆแล้วคุณสามารถทำได้มากกว่านี้ สมมติว่ามี ActiveSheet สำหรับสิ่งต่อไปนี้ (หรือวัตถุแผ่นงานอื่น)

  1. บันทึกช่วงของตัวกรองอัตโนมัติ มีคอลัมน์. AutoFilter.Filters.Count และ (.AutoFilter.Range.Count / .AutoFilter.Filters.Filters.Count) แถวบันทึกไปยัง rngAutofilter

  2. รวบรวมในอาร์เรย์ myAutofilters แต่ละคุณสมบัติ 4 ของแต่ละรายการ. AutoFilter.Filters.Count รายการตัวกรองอัตโนมัติดูแลว่าคุณหลีกเลี่ยง "ข้อผิดพลาดที่กำหนดโดยแอปพลิเคชัน" เมื่อ. On หรือ. Operator เป็นเท็จ (myAutofilters จะเปลี่ยนเป็นจำนวนแถวและคอลัมน์ในขั้นตอนที่ 1)

  3. ปิดตัวกรอง แต่เก็บดร็อปดาวน์ด้วย .ShowAllData

  4. สำหรับรายการตัวกรองแต่ละรายการที่เป็น. ตามอาร์เรย์ที่บันทึกไว้ของคุณให้รีเซ็ต 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

เหตุใดในโลกที่ใครบางคนจะลงคะแนนคำตอบที่มีประโยชน์นี้ซึ่งรวมถึงรหัสการยืนด้วยตนเอง (และทดสอบอย่างหนัก) และยังให้คำอธิบายโดยละเอียดเกี่ยวกับรหัส ฉันถามอย่างจริงจัง คนต้องการความช่วยเหลือระดับมืออาชีพที่ดีใน superuser หรือฉันไม่ควรจะรำคาญ มีโทรลล์ที่เพิ่งลงคะแนนเพื่อที่จะประคองตัวเองให้สูงขึ้นหรือไม่?
MicrosoftShouldBeKickedInNuts

2
อย่างน้อยมี b___s เพื่อแสดงความคิดเห็นถ้าคุณลงคะแนนดังนั้นฉันสามารถใช้ความคิดเห็นเพื่อให้บริการชุมชนได้ดีขึ้น ผู้ดูแลระบบนั่นเป็นข้อเสนอที่ฉันต้องการทำ มี downvotes ทั้งหมดต้องการความคิดเห็นอธิบาย ฉันได้เห็นโพสต์ที่ยอดเยี่ยมมากมายอย่างชัดเจน downvoted ลึกลับซึ่งดูเหมือนว่าจะเป็นโรคระบาดใน superuser - และไม่มีที่อื่น
MicrosoftShouldBeKickedInNuts

+1 สำหรับ "การลงคะแนนทั้งหมดต้องมีความคิดเห็นที่อธิบายไว้"
Gravitate

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.