【问题标题】:Autofilter Run-time error '91' VBA自动筛选运行时错误“91”VBA
【发布时间】:2016-01-17 07:12:57
【问题描述】:

我需要你的帮助。

我想自动筛选具有以下值的表列:以 AF 开头。 然后将某些列复制并粘贴到另一张纸上。

我写了一段代码,但是当代码到达以下行时我总是出错:

.AutoFilter Field:=rng0.Column, Criteria1:=SearchFor

错误是:未设置对象变量或with块。

我不知道代码有什么问题。请帮我。

Sub AF_update()

Application.ScreenUpdating = False
Application.DisplayAlerts = False
Application.EnableEvents = False

SearchCol0 = "Prefix+short name"
SearchCol1 = "Site type"
SearchCol2 = "SLA Target"
SearchCol3 = "Mean Rtt (ms)"
SearchCol4 = "Max Rtt (ms)"
SearchCol5 = "Threshold 95%"
SearchCol6 = "Threshold 99%"
SearchFor = "=AF*"

Dim rng0, rng1, rng2, rng3, rng4, rng5, rng6 As Range
Dim lastrow As Long

Set rng0 = ActiveSheet.UsedRange.Find(SearchCol0, , xlValues, xlWhole)
Set rng1 = ActiveSheet.UsedRange.Find(SearchCol1, , xlValues, xlWhole)
Set rng2 = ActiveSheet.UsedRange.Find(SearchCol2, , xlValues, xlWhole)
Set rng3 = ActiveSheet.UsedRange.Find(SearchCol3, , xlValues, xlWhole)
Set rng4 = ActiveSheet.UsedRange.Find(SearchCol4, , xlValues, xlWhole)
Set rng5 = ActiveSheet.UsedRange.Find(SearchCol5, , xlValues, xlWhole)
Set rng6 = ActiveSheet.UsedRange.Find(SearchCol6, , xlValues, xlWhole)



Set Target = ThisWorkbook.Worksheets("AF")
Set Source = ThisWorkbook.Worksheets("RAW DATA")

Target.Select

Range("A2").Select
Range(ActiveCell, Cells(ActiveCell.End(xlDown).Row, ActiveCell.End(xlToRight).Column)).Select
Selection.ClearContents

    Source.Select

    If ActiveSheet.AutoFilterMode = True Then
        Range("a1").AutoFilter
    End If

    Range("A1").Select
    With Selection
    .AutoFilter Field:=rng0.Column, Criteria1:=SearchFor
    End With


    rng0.Offset(1, 0).Select
    Range(Selection, Selection.End(xlDown)).Copy
    Target.Select
    Range("A2").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False

    Source.Select
    rng1.Offset(1, 0).Select
    Range(Selection, Selection.End(xlDown)).Copy
    Target.Select
    Range("B2").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False

    Source.Select
    rng2.Offset(1, 0).Select
    Range(Selection, Selection.End(xlDown)).Copy
    Target.Select
    Range("C2").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False

    Source.Select
    rng3.Offset(1, 0).Select
    Range(Selection, Selection.End(xlDown)).Copy
    Target.Select
    Range("D2").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False

    Source.Select
    rng4.Offset(1, 0).Select
    Range(Selection, Selection.End(xlDown)).Copy
    Target.Select
    Range("E2").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False

    Source.Select
    rng5.Offset(1, 0).Select
    Range(Selection, Selection.End(xlDown)).Copy
    Target.Select
    Range("F2").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False

    Source.Select
    rng6.Offset(1, 0).Select
    Range(Selection, Selection.End(xlDown)).Copy
    Target.Select
    Range("G2").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False



    lastrow = Cells(Rows.Count, 5).End(xlUp).Row
    Range("A2:G" & lastrow).Sort key1:=Range("E2:E" & lastrow), order1:=xlDescending, Header:=xlNo

Source.Select
ActiveSheet.AutoFilterMode = False

Application.ScreenUpdating = True
Application.DisplayAlerts = True
Application.EnableEvents = True

MsgBox "Operation Completed!"
End Sub

【问题讨论】:

  • 程序开始时的“ActiveSheet”是什么?该工作表的第 1 行中是否有“SearchCol”标签?

标签: excel vba autofilter


【解决方案1】:

我已经清理了你的代码;主要消除对.Select¹ 和.Activate¹ 的依赖,但还可以获取变量组并为每个组创建数组。这允许循环大大缩短代码,同时允许完整的功能。

Sub AF_update()
    Dim v As Long, vSearchCols As Variant, vCols As Variant, FilterFor As String
    Dim Source As Worksheet, Target As Worksheet

    'Application.ScreenUpdating = False
    'Application.DisplayAlerts = False
    'Application.EnableEvents = False

    FilterFor = "AF*"

    Set Source = ThisWorkbook.Worksheets("RAW DATA")
    With Source
        'array of 'SearchCol' values on a zero-based index
        vSearchCols = Array("Prefix+short name", "Site type", "SLA Target", "Mean Rtt (ms)", _
                           "Max Rtt (ms)", "Threshold 95%", "Threshold 99%")
        ReDim vCols(0 To UBound(vSearchCols))  'make them the same size
        For v = LBound(vSearchCols) To UBound(vSearchCols)
            vCols(v) = .Rows(1).Cells.Find(What:=vSearchCols(v), LookIn:=xlFormulas, LookAt:=xlWhole).Column
        Next v
    End With

    Set Target = Worksheets("AF")
    With Target
        If .AutoFilterMode Then .AutoFilterMode = False
        With .Cells(1, 1).CurrentRegion
            Debug.Print .Cells(.Rows.Count - 1, .Columns.Count).Address(0, 0, external:=True)
            .Cells.Resize(.Rows.Count - 1, .Columns.Count).Offset(1, 0).ClearContents
        End With
    End With

    With Source
        If .AutoFilterMode Then .AutoFilterMode = False
        With .Cells(1, 1).CurrentRegion
            .AutoFilter Field:=vCols(0), Criteria1:=FilterFor

            'check to see if there is anything to copy across
            With .Cells.Resize(.Rows.Count - 1, .Columns.Count).Offset(1, 0)
                If CBool(Application.Subtotal(103, .Cells)) Then
                    'there is something to transfer; loop through the ranges
                    For v = LBound(vCols) To UBound(vCols)
                        .Columns(vCols(v)).Copy
                        Target.Cells(2, v + 1).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, _
                                                            SkipBlanks:=False, Transpose:=False
                    Next v
                End If
            End With
        End With
    End With

    With Target
        With .Cells(1, 1).CurrentRegion
            With .Resize(.Rows.Count, 7)
                .Cells.Sort Key1:=.Columns(5), Order1:=xlDescending, _
                            Orientation:=xlTopToBottom, Header:=xlYes
            End With
        End With
    End With

    Application.ScreenUpdating = True
    Application.DisplayAlerts = True
    Application.EnableEvents = True

    MsgBox "Operation Completed!"
End Sub

您可能希望通过重复 F8 点按单步执行代码。我暂时注释掉了您的应用程序环境更改。

在处理源自 A1 的数据块或“孤岛”数据时,Range.CurrentRegion property 是一种快速有效的隔离数据的方法,当引用 With ... End With statement 时。

我不得不猜测您的宏代码是从哪个工作表开始的。我选择了 RAW DATA 工作表。


¹ 请参阅How to avoid using Select in Excel VBA macros,了解更多摆脱依赖选择和激活来实现目标的方法。

【讨论】:

  • 感谢您的时间和精力@Jeeped。
  • 请问我有什么问题。这些线代表什么? If CBool(Application.Subtotal(103, .Cells)) ThenWith .Resize(.Rows.Count, 7) IsS 可以修改此行 .Columns(vCols(v)).Copy 以从第二行而不是整个列(没有标题)复制。谢谢
  • ① 请参阅SUBTOTAL function,了解它如何仅计算可见单元格的详细信息。 ② 您的代码只查看了 A:G,所以我调整了 7 列宽。 ③ 你是说它实际上复制了所有东西?调整为 .Rows.Count-1 的大小以及向下的 .Offset 1 行应该已经解决了这个问题。
  • 谢谢@Jeeped。至于最后一个问题,是我的错。代码运行良好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多