【问题标题】:How to filter an excel column by Month name?如何按月份名称过滤excel列?
【发布时间】:2021-01-26 10:23:24
【问题描述】:

在excel中给出这个列表:

当用户选择月份名称时,如何过滤行(基于出生日期列)?这是我到目前为止所做的,但我不知道如何操作DOB 列:

Private Sub ComboBox2_Change()
    On Error Resume Next
    If Me.ComboBox2.Value = "<<All>>" Or Me.ComboBox2.Value = "" Then
        If ActiveSheet.AutoFilterMode Then ActiveSheet.AutoFilterMode = False
    Else
        Sheet1.Range("D4").AutoFilter field:=4, Criteria1:=Me.ComboBox2.Value
    End If
End Sub

我不知道应该在 Criteria1 上放什么。

【问题讨论】:

    标签: excel vba filter autofilter


    【解决方案1】:

    对月份使用自动筛选

    • 使用宏记录器,我得出结论,Criteria12132 之间的组合和Operator 设置为xlFilterDynamic 将按月过滤。
    • 假设ComboBox1在工作表上,代码在工作表的模块中。

    按月份过滤

    Option Explicit
    
    Private Sub ComboBox1_Change()
        
        Me.AutoFilterMode = False
        
        If ComboBox1.Value <> "<<All>>" And ComboBox1.Value <> "" Then
            With Me.Range("A3").CurrentRegion
                .AutoFilter 4, ComboBox1.ListIndex + 20, xlFilterDynamic
            End With
        End If
        
    End Sub
    

    填充组合框

    Sub populateComboBox()
        Const cList As String = "<<All>>,January,February,March,April,May,June," _
            & "July,August,September,October,November,December"
        Dim cData() As String: cData = Split(cList, ",")
        ComboBox1.List = cData
    End Sub
    

    【讨论】:

    • 非常感谢先生。这比我做的更干净、更高效。
    • 如果您不介意先生,为什么ListIndex 上有一个+ 20?我的意思是,它在组合框上扮演什么角色?
    • ListIndex 表示组合框中当前选中项的索引。由于您已将&lt;&lt;All&gt;&gt; 作为第一项,因此它具有索引0,而月份方便地具有索引1121 用于January2 用于February。 ..)。正如我(有点含蓄地)在答案中写的那样,Criteria1 必须是 21 代表 January22 代表二月......因此 20 + 1 = 21 代表 January20 + 2 = 22 代表 February ...
    • 非常有趣!投票赞成。您是否在某处发现这种方式记录在案?我无法想象要应用什么逻辑机制,而不是 Microsoft 约定。但是,我认为应该记录在案......
    • @FaneDuru:谢谢。如果我早点找到那个链接,我肯定不会需要这么长时间。我只是使用宏记录器。大部分时间都在聪明并认为11xlFilterValues 时丢失了,还能是什么。但在代码中将xlFilterValues 替换为11(从宏记录器中读取)然后最后检查Microsoft Docs 时,我发现了xlFilterDynamic。工作簿也崩溃了,冻结了……我以为我的Excel 终于死了,但事实并非如此。我从没想过只要一个错误的参数就会发生这种情况。
    【解决方案2】:

    首先,您在代码中将所选月份转换为一个值(例如 2 月代表 2 月)。然后,您可能应该使用这样的 for 循环从 DOB colmun 中提取月份(其中选择的月份是组合框中选择的相应月份的编号):

       Dim current_month
        For i=4 To 13 
            current_month = Month(Range("D"&i).value)
            If current_month <> selected_month Then 'The month don't correspond to the selected
                Range("D"&i).EntireRow.Hidden = True 'Hide the row
        next i
    
    

    如果有帮助,请告诉我。

    【讨论】:

    • 在某些时候,它可以工作,但如果我选择另一个月份,列表不会返回任何内容(它会隐藏所有列表)。
    • 您可能应该在过滤之前取消隐藏所有行。
    猜你喜欢
    • 2015-12-11
    • 2021-10-08
    • 1970-01-01
    • 2021-11-25
    • 1970-01-01
    • 2019-04-14
    • 1970-01-01
    • 2011-11-15
    • 2015-05-31
    相关资源
    最近更新 更多