2017-10-04 88 views
1

我是VBA的新手,希望在下面提供一些建议,我目前正在尝试过滤某些日期,然后将它们复制并粘贴到单独的表格然后= SUBTOTAL等。 VBA的工作,但确实需要比预期的稍长。任何人都可以提供给我一个解决方案,我GOOGLE了这一点,并不能让它缩短工作。缩短复制和粘贴VBA以将过滤后的单元格从一个表格粘贴到另一个表格

Sheets("Paster").Select 
ActiveSheet.Range("$A$1:$AK$801").AutoFilter Field:=10, Criteria1:= _ 
    xlFilterLastYear, Operator:=xlFilterDynamic 
Cells.Select 
Selection.Copy 
Sheets("Hidden").Select 
Cells.Select 
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ 
    :=False, Transpose:=False 
Sheets("Overall").Select 

回答

0

每当你使用.Copy.Paste.Select它显著放慢你失望。通过关闭屏幕更新和计算,您可以稍快一点。然后使用范围本身总是会更快看到如何摆脱使用.Select你可以阅读更多关于它here。通常当你想跳过使用.copy最好对This Range = That Range说,那么你可以完全跳过剪贴板,但过滤的数据是一个噩梦。

Sub CopyAndPaste() 

    Dim wbk As Workbook 
    Dim Paste As Worksheet, Hidden As Worksheet, Overall As Worksheet 

    Set wbk = ActiveWorkbook 
    Set Paste = wbk.Worksheets("Paster") 
    Set Hidden = wbk.Worksheets("Hidden") 
    Set Overall = wbk.Worksheets("Overall") 

    Application.ScreenUpdating = False 
    Application.Calculation = xlCalculationManual 

     Paste.Range("$A$1:$AK$801").AutoFilter Field:=10, Criteria1:=xlFilterLastYear, Operator:=xlFilterDynamic 
     Paste.Cells.Copy 

     Hidden.Cells.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False 

    Application.ScreenUpdating = True 
    Application.Calculation = xlCalculationAutomatic 
End Sub 
+0

工作完美,我认为VBA今年,本季度的工作方式会一样。 – Fordy

+0

@Fordy据我所知是的。你可以在这里找到所有的选项(https://msdn.microsoft.com/en-us/library/microsoft.office.interop.excel.xldynamicfiltercriteria.aspx)。 – BerticusMaximus

1

使用select非常慢,一般情况下可以避免,如果你可以帮助它。我建议使用with语句来完成给定工作表上的所有操作。像这样的东西应该有所帮助。不要使用select,请尝试激活。

With Sheets("Paster").Range("$A$1:$AK$801") 
    .AutoFilter Field:=10, Criteria1:= _ 
    xlFilterLastYear, Operator:=xlFilterDynamic 
    .Copy 
End With 

With Sheets("Hidden") 
    .Range("A1").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, _ 
     SkipBlanks:=False, Transpose:=False 'I just pasted into cell A1 
End With 
Sheets("Overall").Activate 

我希望这样的事情会有所帮助!我不知道您使用的是什么类型的数据,但它将一堆随机生成的数据复制到隐藏工作表中。

为避免屏幕闪烁/闪烁,您可以做的另一件事是在宏开始时关闭屏幕更新,然后在最后将其重新打开。

Application.ScreenUpdating = False ' This should be the first line of a sub 
Application.ScreenUpdating = True ' This should be the last line of the sub 
相关问题