【问题标题】:VBA Excel date filter, multiple filedsVBA Excel日期过滤器,多个字段
【发布时间】:2017-07-20 08:37:49
【问题描述】:

我对 VBA 还很陌生,但正在学习。 我的目标是加快一些日常总结。

  1. 我在清除过滤器时遇到问题(以防某些被放在另一个字段中)当没有过滤器时我会收到错误。

  2. 我无法根据单元格值得到正确的格式,没有错误,它只是选择空白

  3. 不知道如何选择过滤范围,我想出了一个,但一定有更好的方法。

如果有人知道一些很好的总结/教程如何选择没有对象表的范围,请给我一个链接。

它是更大宏的一部分,因此声明更早,它们在不同的部分工作,所以它们不是问题。

Sub aktualizacja_SKU()
    Set wbThis = ActiveWorkbook

    var1 = DATA.Value 

    With SKU_table
        lr1 = .Range.Rows.Count
    End With
    strPath = "C:\Users\###\Desktop\###\"
    strFile = "###.xlsm"
    Set wbTarget = Workbooks.Open(strPath & strFile)

    wbTarget.Activate

第一个问题:我试图用 ' 找到下面缺少过滤器行的错误解决方案,但它不起作用

    'Sheets("Zamówienie").Range("$A$3:$V$100000").AutoFilter Field:=11, 
    '    Criteria1:="SPM"
    'Sheets("Zamówienie").ShowAllData

第二个:它忽略日期上带有过滤器的行并选择一个空白

    Sheets("Zamówienie").Range("$A$3:$V$100000").AutoFilter Field:=4
    Sheets("Zamówienie").Range("$A$3:$V$100000").AutoFilter Field:=4, 
    Criteria1:=Format(var1, "yyyy-mm-dd") ', Operator:=xlOr
    Sheets("Zamówienie").Range("$A$3:$V$100000").AutoFilter Field:=11
    Sheets("Zamówienie").Range("$A$3:$V$100000").AutoFilter Field:=11, 
    Criteria1:="SPM" ', Operator:=xlOr
    Sheets("Zamówienie").Range("$A$3:$V$100000").AutoFilter Field:=14
    Sheets("Zamówienie").Range("$A$3:$V$100000").AutoFilter Field:=14, 
        Criteria1:="Lack of delivery"
    Sheets("Zamówienie").Select


    Range("C3:F3").Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.SpecialCells(xlCellTypeVisible).Copy

    wbThis.Activate

第三。我将所有范围与标题一起复制然后将其删除,通常我会将数据更改为表格,但我无法更改数据源。

    SKU_table.DataBodyRange(lr1, 1).PasteSpecial Paste:=xlPasteValues, 
        Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    SKU_table.ListRows(lr1).Delete

End Sub

您能否解释一下新行的作用或发送教程链接。 我宁愿理解,也不要只是复制粘贴。

【问题讨论】:

  • 也许更好地解决您的问题是使用高级过滤器 - 您可以在其他地方复制此方法中的结果..

标签: vba excel range filtering date-range


【解决方案1】:

第一个问题

为了安全地消除任何以前的过滤器,不要使用Worksheet.ShowAllData;改用Worksheet.AutoFilterMode = False。即

Sheets("Zamówienie").AutoFilterMode = False

第二个问题

要过滤日期,假设您的列已经格式化为日期,并且var1Date 或数字变量,只需使用变量,不要使用Format。此外,您不需要两个 Autofilter 语句,只需一个。当然,不需要使用Select(你不需要它,它是错误的来源)。

第三个问题

要复制没有标题,请使用.Offset(1).Copy,并且不需要使用SpecialCells(xlCellTypeVisible),因为Copy 方法会自动执行此操作。

Sub aktualizacja_SKU()
    Dim var1 As Date: var1 = Data.value
    Const strPath As String = "C:\Users\###\Desktop\###\"
    Const strFile As String = "###.xlsm"
    Dim wbTarget As Workbook: Set wbTarget = Workbooks.Open(strPath & strFile)
    With wbTarget.Sheets("Zamówienie").Range("$A$3:$V$100000")
      .AutoFilter 11, "SPM"
      .AutoFilter 4, var1
      .AutoFilter 14, "Lack of delivery"
      .Columns("C:F").Offset(1).Copy
      SKU_table.Range(SKU_table.ListRows.Count + 2, 1).PasteSpecial xlPasteValues
      .AutoFilter
    End With
End Sub

最后,您不能对不同的字段应用“ORed”过滤器。为此,您需要使用辅助列,如this answer. 中所示

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-29
    • 2010-12-15
    • 2020-03-25
    • 2015-11-09
    • 2023-02-02
    • 2017-04-10
    相关资源
    最近更新 更多