【问题标题】:Excel VBA AutoFilter adds empty rowsExcel VBA 自动筛选添加空行
【发布时间】:2015-09-04 01:21:07
【问题描述】:

我已经修改了我的 Excel 宏,之前它是逐行进行的,现在它会批量过滤结果和副本。效率更高。

我现在遇到的问题是,自动过滤器将数百万个空行添加到工作表中,我无法确定它为什么这样做。

CountryCodes 是一个包含过滤器值的字典。 Criteria 正在查找包含字典中的条目的行。

这是代码:

    For Each vall In CountryCodes
    thisWB.Activate
    thisWB.Sheets("Overall Numbers").Activate

    lookfor = CountryCodes.Item(vall)
    rep = Replace(thisWBName, "EMEA", lookfor)

    Set rng = ActiveSheet.Range("A1:Z1")

    FilterField = WorksheetFunction.Match("Host", rng.Rows(1), 0)

    If ActiveSheet.AutoFilterMode = False Then rng.AutoFilter

    rng.AutoFilter Field:=FilterField, Criteria1:="=*" & lookfor & "*", Operator:=xlFilterValues

    Set rng2 = ThisWorkbook.Worksheets("Overall Numbers").Cells.SpecialCells(xlCellTypeVisible)

    rng2.Copy Workbooks(rep).Worksheets("Overall Numbers").Range("A1")

    Workbooks(rep).Save

    thisWB.Activate
    thisWB.Sheets("Overall Numbers").Activate

    Cells.AutoFilter
Next

【问题讨论】:

  • 我也尝试使用 Excel 过滤器添加过滤器,我得到了相同的结果 - 最后添加了空行。这让我抓狂!
  • +1 用于将循环转换为自动筛选。您应该打开初始文件并删除所有空行,您会发现文件大小显着减小,更新数据时性能更快。选择第一个空行(不仅仅是单个单元格)并按 Shift+Ctrl+向下箭头,然后不要按 Delete 键,而是右键单击其中一个选定行并从弹出窗口

标签: vba excel


【解决方案1】:

测试:

Dim ur As Range
Set ur = ThisWorkbook.Sheets("Overall Numbers").UsedRange

Application.ScreenUpdating = False
filterField = Application.Match("Host", ur.Rows(1), 0)
If Not IsError(filterField) Then

    For Each vall In countryCodes
       rep = Replace(thisWBName, "EMEA", vall)

       ur.AutoFilter Field:=filterField, Criteria1:="=*" & vall & "*"

       'copy visible rows with data only
       ur.SpecialCells(xlCellTypeVisible).Copy

       'paste visible rows with data only
       Workbooks(rep).Worksheets("Overall Numbers").Range("A1").PasteSpecial xlPasteAll
       Workbooks(rep).Save

       ur.AutoFilter
    Next
End If
Application.ScreenUpdating = True

【讨论】:

  • 不得不做一些小改动,但现在可以了! :D - 谢谢
  • 感谢您的反馈 - 我很高兴它有所帮助
【解决方案2】:

我已经重新组织了您的代码并删除了 .Activate 依赖并使用 Range.CurrentRegion property 隔离了过滤后的数据。

With thisWB
    With .Worksheets("Overall Numbers")
        If .AutoFilterMode Then .AutoFilterMode = False

        lookfor = CountryCodes.Item(vall)
        rep = Replace(thisWBName, "EMEA", lookfor)

        With .Cells(1, 1).CurrentRegion
            FilterField = WorksheetFunction.Match("Host", .Rows(1), 0)
            For Each vall In CountryCodes
                .AutoFilter Field:=FilterField, Criteria1:="=*" & lookfor & "*", Operator:=xlFilterValues
                If CBool(Application.Subtotal(103, .Resize(.Rows.Count - 1, .Columns.Count).Offset(1, 0))) Then
                    .Copy Workbooks(rep).Worksheets("Overall Numbers").Range("A1")
                    Workbooks(rep).Save
                End If
                .AutoFilter Field:=FilterField
            Next vall
        End With
    End With
    .AutoFilter
End With

除非rep 以某种方式递增,否则每次迭代都会粘贴到相同的工作簿/工作表/范围。

【讨论】:

  • 也可以! - 谢谢! :D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多