【问题标题】:Copy a Filtered Table复制过滤表
【发布时间】:2019-10-21 11:30:35
【问题描述】:

尝试复制过滤后的表格并将结果粘贴到另一个表格的底部。

With RollupWeekSheet
   sh1Col = .Range("Table1").Cells(1).Column
   LastRollupWeekRow = .Cells(.Rows.Count, sh1Col).End(xlUp).Row
End With


Dim ComboWeekTable As ListObject
Set ComboWeekTable = ComboWeekSheet.ListObjects("Table1")

Dim RollupTimeStamp As Date
RollupTimeStamp = RollupWeekSheet.Range("B3").Value

With ComboWeekTable
.Range.AutoFilter Field:=16, Criteria1:=">" & RollupTimeStamp
.DataBodyRange.Copy
End With

With RollupWeekSheet
.Cells(LastRollupWeekRow + 1, sh1Col).PasteSpecial xlPasteValues
ComboWeekTable.Range.AutoFilter Field:=1

Application.CutCopyMode = False
Application.ScreenUpdating = True
End With`

With ComboWeekSheet
If .AutoFilterMode Then
.AutoFilterMode = False
End If
End With

它一直突出显示位于我的“With ComboWeekTable”行下的“.Autofilter”并说“无效使用属性”,但我不知道为什么。请帮忙。

【问题讨论】:

  • 尝试用你想要的动作录制宏,看看是否可能。然后生成VBA代码
  • 试试With ComboWeekTable.Range
  • 我改为 ComboWeekTable.Range。它现在突出显示其下方的整行(“.Autofilter.Rang.Copy”)并显示“未设置块变量的对象变量”。我不知道那是什么意思。
  • 此时是否有任何可见的行?

标签: excel vba copy autofilter listobject


【解决方案1】:

这是获取 ListObject 正确属性的情况

假设您只需要过滤后的数据行(而不是标题):

With ComboWeekTable
    .Range.AutoFilter Field:=4, Criteria1:=">" & RollupTimeStamp
    .DataBodyRange.Copy
End With

SpecialCells 不同,如果过滤器不返回任何行(没有错误,不粘贴任何内容),这仍然有效,因此不需要错误捕获

演示

Sub Demo()
    Dim ws1 As Worksheet, ws2 As Worksheet
    Dim lo As ListObject

    Set ws1 = ActiveSheet
    Set ws2 = ws1.Parent.Worksheets(ws1.Index + 1)
    Set lo = ws1.ListObjects(1)

    If lo.AutoFilter Is Nothing Then lo.Range.AutoFilter
    lo.ShowAutoFilterDropDown = True
    With lo
        .Range.AutoFilter Field:=1, Criteria1:="=2"
        If Application.Aggregate(3, 5, lo.ListColumns(1).DataBodyRange) > 0 Then 'Count All, ignoring hidden rows
            .DataBodyRange.Copy
            ws2.Range("D5").PasteSpecial xlPasteValues
        End If
        lo.AutoFilter.ShowAllData ' clear filter
    End With
End Sub

运行演示之前

运行Demo后

【讨论】:

  • 这消除了我的错误,但它正在复制整个表格主体范围,而不仅仅是表格主体范围的过滤行。
  • @Dave F 它对我有用。添加Demo来说明
  • @chrisneilsen Idk。只要有要复制的过滤行,它对我来说就很完美;它完美地复制和粘贴这些行,就像在您的演示中一样。但是当没有显示过滤行时,它会复制并粘贴整个表格。我对 VBA 很陌生,也许我没有正确地将某些东西应用到我的确切代码中。我已经更新了原始帖子,以显示我更新后的代码以及您的建议。
【解决方案2】:

已编辑以匹配您的设置。这在测试中对我有用:

Sub Tester()

    Dim rngPaste As Range, ComboWeekTable As ListObject
    Dim RollupTimeStamp As Date

    'find the paste position
    With RollupWeekSheet.ListObjects("Table2").DataBodyRange
       Set rngPaste = .Rows(.Rows.Count).Cells(1).Offset(1, 0)
    End With

    Set ComboWeekTable = ComboWeekSheet.ListObjects("Table1")

    RollupTimeStamp = RollupWeekSheet.Range("B3").Value

    With ComboWeekTable.DataBodyRange
        .AutoFilter Field:=16, Criteria1:=">" & RollupTimeStamp

        On Error Resume Next '<< ignore run-time error if no rows visible
        .SpecialCells(xlCellTypeVisible).Copy rngPaste
        On Error GoTo 0      '<< stop ignoring errors

        .AutoFilter
    End With

    ComboWeekTable.Range.AutoFilter Field:=1

End Sub

【讨论】:

  • 最上面的代码有效。谢谢!但是我是 VBA 的新手,不知道在哪里放置第二个代码,如果没有找到行就可以消除错误。你能告诉我这 3 行消除运行时错误的确切位置吗?
  • 我是新手,我自己的代码几乎不能正面或反面。我不明白如何将您的 Range("A15") 翻译成我在原始帖子中显示的实际代码。我正在从表 ComboWeekTable 复制并尝试粘贴到 RollupWeekTable 的底部。那里已经有一些我不完全理解的代码,让我跳到下一个可用的行 (LastRollupWeekRow = .Cells(.Rows.Count, sh1Col).End(xlUp).Row)。请帮助我了解如何将您的“A15”交叉引用到我的代码。
猜你喜欢
  • 1970-01-01
  • 2011-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-18
  • 1970-01-01
相关资源
最近更新 更多