我是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
谢谢您的帮助:)
答案 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