【问题标题】:Excel 2010: how to auto-refresh auto-filter based on checkbox cell linkExcel 2010:如何根据复选框单元格链接自动刷新自动过滤器
【发布时间】:2016-06-02 14:33:39
【问题描述】:

在 Excel2010 中,我在行上创建了一个 X 项目表,并在 Y 列上创建了这些项目的特征。其中一项功能是应用程序区域,我想根据应用程序区域类型过滤项目。难点是桌子上的物品有multiple application areas,所以我不能用excel的简单过滤功能。

我想出了一个想法,即拥有 n 个复选框(此示例为 3 个)并将每个复选框的输出分配给不同的单元格,例如A10、B10、C10。我为额外列中的每个项目的 OR 函数分配相关值,例如F列。例如,当我检查应用程序区域A时,项目1和3在F列中有TRUE,我可以通过在自动过滤功能中选择 TRUE 使用此列过滤表格。请参阅picture 以获得更好的理解。

问题是我更改复选框的状态后,自动过滤功能不会自动刷新。每次我必须在 data 功能区中重新应用过滤器。在网上我发现这段VBA代码在活动表中有自动刷新功能。

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 8 Then
    ActiveSheet.AutoFilter.ApplyFilter
End If
End Sub

现在,如果我主动转到 F 列中的一个单元格并将该单元格编辑为 TRUE

,此代码确实可以工作并重新应用过滤器em>FALSE 手动。如果我使用复选框更改 F 中的单元格值,则自动刷新不起作用。

通过键入值并按ENTER和使用复选框来更改单元格值有什么区别?

顺便说一句,复选框是 FORM CONTROLS 类型,而不是 ACTIVEX。

任何帮助将不胜感激。 谢谢!

【问题讨论】:

    标签: vba excel


    【解决方案1】:

    Worksheet_Change 会像您手动更改任何工作表单元格一样做出反应

    假设:

    • 您的 Form 复选框名称为“A”、“B”和“C”

    • 为它们分配了宏,分别命名为“A_Click”、“B_Click”、“C_Click”

    • 它们与第一张表在同一张纸上

    • 表名为“Features”

    然后将以下代码放在任何模块中:

    Option Explicit
    
    Sub A_Click()
        SetOrs
    End Sub
    
    Sub B_Click()
        SetOrs
    End Sub
    
    Sub C_Click()
        SetOrs
    End Sub
    
    
    Sub SetOrs()
        Dim i As Long
        Dim A As Boolean, B As Boolean, C As Boolean
        Dim appAreaStrng As String
    
        With ActiveSheet        
            A = .Shapes("A").ControlFormat.Value = xlOn '<~~ get CheckBox "A" value
            B = .Shapes("B").ControlFormat.Value = xlOn '<~~ get CheckBox "B" value
            C = .Shapes("C").ControlFormat.Value = xlOn '<~~ get CheckBox "C" value        
    
            With .ListObjects("Features")
                For i = 1 To .ListRows.Count
                    appAreaStrng = .DataBodyRange.Cells(i, .ListColumns("App Area").Index) '<~~ get current row "App Area" value
                    .DataBodyRange.Cells(i, .ListColumns("OR").Index) = (A And InStr(appAreaStrng, "A") > 0) Or (B And InStr(appAreaStrng, "B") > 0) Or (C And InStr(appAreaStrng, "C") > 0)
                Next i
            End With            
        End With
    End Sub
    

    【讨论】:

    • @cayt:你通过了吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-18
    • 2013-05-17
    • 1970-01-01
    • 2012-01-20
    • 2013-06-11
    相关资源
    最近更新 更多