如何在我的代码中正确使用AutoFilter循环?

时间:2019-01-04 10:36:32

标签: excel vba excel-vba

我是VBA的新手。我正在编写使用自动过滤器的宏,将带有结果的列复制到其他工作表并删除重复项。我正在为9个仓库x 3个商品组= 27次这样做。现在,我复制了如下的27次代码,它可以正常工作(但速度很慢)。我知道,我应该使用循环,但是我不确定该怎么做。

仓库:“ XXX”

Sheets("Apex").Activate
    Lastrow = Range("A1").CurrentRegion.Rows.Count
        Range("A1:J" & Lastrow).Select
            Selection.AutoFilter Field:=6, Criteria1:="NIO"
                Selection.AutoFilter Field:=8, Criteria1:="XXX"
                    Range("A2:A" & Lastrow).Copy
                    Sheets("Sheet2").Range("A1").PasteSpecial xlPasteValues
                    Selection.AutoFilter
                            Sheets("Sheet2").Activate
ActiveSheet.Range("$A$1:$A$500").RemoveDuplicates Columns:=1, Header:=xlNo

谢谢您的帮助:)

1 个答案:

答案 0 :(得分:0)

我认为您必须提供有关您的问题的更多详细信息。首先,我看不到商品组列索引,但我会尽我所能回答您的问题。

我从您的问题中了解到的是,您使用的自动过滤器过多,因此每次运行代码时都会触发工作簿的计算,如果您有较大的公式(例如数组公式),则确实会减慢文件速度。

最好的解决方案是使用数组,但是对于我来说,共享的详细信息是不可能的,所以我为您的需求编写了一个循环。

请在您的文件中添加一个名为Warehouses的新工作表,并将您的仓库名称一个接一个地写入A列,然后将以下代码复制到模块中并运行

Sub LoopWareHouses

Dim ws As Worksheet
Dim ws2 As Worksheet
Dim ws3 As Worksheet

Set ws = ThisWorkbook.Sheets("Apex")
Set ws2 = ThisWorkbook.Sheets("Sheet2")
Set ws3 = ThisWorkbook.Sheets("Warehouses")

Lastrow = ws.Range("A1").CurrentRegion.Rows.Count
lrwarehouses = ws3.Cells(Rows.Count, 1).End(xlUp).Row

With Application
    .DisplayAlerts = False
    .ScreenUpdating = False
    .EnableEvents = False
    .Calculation = xlCalculationManual
End With

y = 2
For i = 1 To lrwarehouses
    For j = 2 To Lastrow
        If ws.Cells(j, 6) = "NIO" Then
            If ws.Cells(j, 8) = ws3.Cells(i, 1) Then
                ws2.Cells(y, 1) = ws.Cells(j, 1)
                y = y + 1
            End If
        End If
    Next
Next

lr2 = ws2.Cells(Rows.Count, 1).End(xlUp).Row

Application.Calculate
Do Until Application.CalculationState <> xlDone
    DoEvents
Loop

ws2.Range("A1:A" & lr2).RemoveDuplicates Columns:=1, Header:=xlNo

With Application
    .DisplayAlerts = True
    .ScreenUpdating = True
    .EnableEvents = True
    .Calculation = xlCalculationAutomatic
End With

End Sub