【问题标题】:Filtering dropdown box to untick current month, then tick following months过滤下拉框以取消勾选当前月份,然后勾选接下来的月份
【发布时间】:2018-01-24 01:17:15
【问题描述】:

大家好。我对 VBA 还很陌生,手头有一些问题。 我目前正在自动化我的工作中的报告,其中大部分与过滤数据以显示当月、下个月和接下来的 2 个月有关。

我的问题是:

  1. 您如何过滤下拉框以取消勾选前几个月、勾选下个月(相对于当前月份)以及勾选接下来的几个月(无需硬编码它会必须在某个月份结束。只需将其编码为提前几个月可用)?例如,我的数据是 2017 年 11 月的数据。我必须取消前几个月的勾选,包括 11 月,然后勾选 2017 年 12 月和接下来的几个月

    来自录制的宏:

11 月为当前月份(手动过滤)

   ActiveSheet.Range("$A$1:$AY$18103").AutoFilter Field:=37, Operator:= _
        xlFilterValues, Criteria2:=Array(0, "10/18/2018", 1, "12/28/2017")

我在不同进程中使用的当前月份代码。我也可以加入这个吗?

 ActiveSheet.Range("$A$1:$AY$18103").AutoFilter Field:=36, Operator:=xlAnd, _
    Criteria1:=">" & Application.EoMonth(Now, -1), _
    Criteria2:="<=" & Application.EoMonth(Now, 0)
  1. 与第 1 项类似,取消勾选前几个月,勾选当前月份的第二个月,并勾选接下来的几个月? (例如,我的数据是 2017 年 11 月的数据。我必须取消勾选前几个月,包括 11 月,然后勾选 2018 年 1 月和接下来的几个月)

  2. 我必须做的一个过程是将公式从单元格复制到左侧,然后将其粘贴到当前单元格。我要做的是先复制左边的单元格,然后使用 Ctrl+Down 转到底行。然后单击右键(返回到原始列),然后再次 Ctrl+Shift+Up 粘贴到整个列。我使用的代码是:

    Range(Selection, Selection.End(xlUp)).Select
    

问题是原始列中的某些单元格已经填满了数据(来自我之前的过程),我必须至少编写 4 次代码才能使单元格到达最上面的单元格。我如何对其进行编码以使其到达顶部(减去带有单元格标题的行),同时注意这些行已被过滤?

【问题讨论】:

    标签: vba excel filter


    【解决方案1】:

    您在一个帖子中遇到了很多问题。但无论如何,对于您的 1 和 2,您可以尝试以下方法:

    Sub ject()
    
        Dim lr As Long
        Dim myRange As Range, selMonth As String
    
        '*/ Below selects 1 month ahead of current month
        'to select 2 months ahead, add 2 on Month(Date) */
        selMonth = Format(DateSerial(Year(Date), Month(Date) + 1, 1), _
                          "m/d/yyyy")
    
        With Sheet1 '/* change to your actual sheet */
            .AutoFilterMode = False '/* reset all filters */
            '/* reference last row to column A */
            lr = .Range("A" & .Rows.Count).End(xlUp).Row
            Set myRange = .Range("A1:AY" & lr)
            myRange.AutoFilter 36, ">=" & selMonth
        End With
    
    End Sub
    

    对于数字 3,您可以使用与上述相同的例程来查找 最后一行(和列),然后将数据粘贴到那里。您也可以check this out 了解有关查找目标范围(单元格)的更多信息。

    【讨论】:

    • 哇,谢谢!像魅力一样工作。你能简单解释一下代码是如何工作的吗?其中大部分对我来说都是新的。另外,如果你有时间,我如何使用上面的代码找到最后一行?
    • lr = .Range("A" &amp; .Rows.Count).End(xlUp).Row 这行代码实际上得到了最后一行(lr)。现在,哪一部分不清楚?已经提供了 cmets 来指导你如何使用它:)
    • 您好,先生。我采取了一种更加手动的方法来到达最后一行。 ActiveCell.Select ActiveCell.FormulaR1C1 = "=RC[-1]" ActiveCell.Select Selection.Copy ActiveCell.Offset(0, -1).Select Selection.End(xlDown).Select ActiveCell.Offset(0, 1).Select将继续我的下一条评论
    • 我的下一步是回到最上面一行(减去标题,即单元格 AV1)我如何使用代码来确保每一行都被覆盖,当有很多有数据的单元格/并且在上升过程中是空白的? (例如,第 555 行是空白的,第 450 行有数据,第 240 行是空白等)当我运行它时,什么也没有发生(而且我很确定我做错了什么)。尝试分析几个小时为什么会发生这种情况,但我就是不明白:/
    • @Vakovich 你可以在这里找到很多examples。当您偶然发现某个问题时,您可以尝试其中一个并发布另一个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-07
    • 1970-01-01
    • 2015-01-08
    • 1970-01-01
    • 1970-01-01
    • 2020-06-16
    • 1970-01-01
    相关资源
    最近更新 更多