【问题标题】:VBA: Deleting Filtered Cells (Not the Entire Row)VBA:删除过滤的单元格(不是整行)
【发布时间】:2019-08-09 00:27:37
【问题描述】:

我正在尝试过滤单元格,然后删除那些可见的单元格。我通常可以这样做:

With Sheets("Sheet1")
    .Range("A3:I3").Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
    .Range("A3").Value = "2/12/2015"
    LR = .Range("A:A").Find(What:="*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
    .Range("A1:I" & LR).AutoFilter Field:=1, Criteria1:="<" & Evaluate("=TODAY() - 40")
    .UsedRange.Offset(1, 0).Resize(.UsedRange.Rows.Count - 1).Rows.Delete
    .Range("A1").AutoFilter
    .Calculate
End With

但是,这一次我在过滤范围旁边带有数据透视表的工作表上执行此操作,因此我收到“1004”错误,它无法进行更改,因为它会影响数据透视表。我不想删除 Pivot 的部分内容,只删除我要过滤的范围。

我该怎么做?

【问题讨论】:

  • 将数据透视表放在不同的工作表上。
  • 不幸的是,这需要大量的返工。我假设还有其他选项,因为我可以执行诸如删除引用范围和向上移动单元格之类的操作而不会出现任何问题。

标签: vba excel


【解决方案1】:

如果您不打算将计算完全移入 VBA,那么正确的方法是清除单元格然后排序。删除行有各种副作用,并且根据工作簿设置的不同,计算成本非常高。

【讨论】:

    【解决方案2】:

    您的数据范围应格式化为表格;我倾向于将工作表称为“数据”,将数据表上的表称为“tData”(工作簿中的所有表都类似)。表格的好处是不需要任何格式化代码,因为这会随着新行添加到表格中而向下传播,并且您不需要 range("A1:Z" & lastrow) 等!

    好的,所以过滤第 10 列并删除单元格值 = 2 的所有行

    Dim tbl as ListObject
    
    Set tbl = Sheets("Data").ListObjects("tData")                'create tbl ref
    With tbl
        .Range.AutoFilter Field:=10, Criteria1:="2"              'apply filter
        .DataBodyRange.SpecialCells(xlCellTypeVisible).Delete    'delete results
        .Range.AutoFilter Field:=10                              'remove filter
    End With
    set tbl = Nothing                                            'kill tbl ref
    

    【讨论】:

    • 如果 2 是表中的所有值,是否禁止显示警报?
    【解决方案3】:

    显然您想在这些单元格上使用Range.Delete Shift:=xlShiftUp,而不是整行。因此,只需像往常一样过滤目标范围,然后使用SpecialCells(xlCellTypeVisible)获取要删除的范围。

    请注意,由于 Excel 仅允许您在过滤模式下删除整行,因此请确保在删除过滤器后执行 Range.Delete

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多