以更有效的方式复制并粘贴到表格

时间:2013-08-30 01:50:39

标签: excel vba excel-vba copy-paste

我有一张包含2张的excel文件:

1.INFO(huuuge表,约10,000行)
2.ADD INFO

第二个是我的问题所在。基本上它有2个功能,要么过滤(基于2个不同的标准),要在表格中搜索信息并在表格上显示或向表格添加新行。我做的宏工作正常,但对我来说似乎很奇怪,1分钟太长了,无法完成任务:

Sub Search_in_table()

Dim header As Range


Sheets("ADD INFO").Select
Range("A13").Select
Range(Selection, Selection.End(xlToRight)).Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Delete Shift:=xlUp

If Worksheets("ADD INFO").[Item_to_search] = "Cust_ID" Then
    Sheets("INFO").Select
    Set header = [A1:Y1]
    With header
        .AutoFilter Field:=6, Criteria1:=Worksheets("INFO").[What_I_Want]
    End With

ElseIf Worksheets("ADD INFO").[Item_to_search] = "ASIN" Then
    Sheets("INFO").Select
    Set header = [A1:Y1]
    With header
        .AutoFilter Field:=4, Criteria1:=Worksheets("INFO").[What_I_Want]
    End With

End If

ActiveSheet.AutoFilter.Range.Copy
Sheets("ADD INFO").Select
Worksheets("ADD INFO").[A13].PasteSpecial

Sheets("INFO").Select
header.Select
Selection.AutoFilter

Sheets("ADD INFO").Select

End Sub

这是添加新行的那个:

Sub add_esc()

Sheets("ADD INFO").Select
Range("Y9:A9").Select
Selection.Copy

Sheets("INFO").Select
Range("A1").Select
Selection.End(xlDown).Select
ActiveCell.Offset(1, 0).Select

Selection.PasteSpecial

Sheets("ADD INFO").Select
Range("A9:Y9").Select
Selection.ClearContents

有没有办法让它们更有效率?我错过了什么? BTW,What_I_Want和Item_To_Search只是带名字的单元格。一个有趣的事实是,在编写代码期间,我在“selection.paste”之类的内容中遇到了非常奇怪的错误,这就是为什么我使用了一个不常见的符号,如“工作表(”ADD INFO“)。[A13] .PasteSpecial“

非常感谢任何想法!提前谢谢!

1 个答案:

答案 0 :(得分:0)

我建议尽可能地摆脱“选择”和“激活”,应该加快速度并最终避免错误。您是否能够清除工作表上的所有单元格(“添加信息”)? sheet(“add info”)。cells.clear

至于代码的其余部分:不记得做任何类似的事情,但理论听起来不错......但是,除了所有这些“选择”,它们只会减慢速度。你在哪里:

ActiveSheet.AutoFilter.Range.Copy
Sheets("ADD INFO").Select
Worksheets("ADD INFO").[A13].PasteSpecial

而只是使用这个(并且为了额外的功劳,而不是使用Sheets()直接引用代码表:

wsInfo.autofilter.range.copy wsAddInfo.cells(13,1) ' i.e. row 13, column 1 (col A)

不确定你的问题的其余部分:添加行等,但使用上面的方法可能你只需要递增该目标行?或者使用application.worksheetfunction.counta(range)查找最后使用过的单元格而不是“select”等...

有可能你的方法实际上可能比只是手动遍历每一行并复制条件满足的条件慢?也许值得尝试一下。类似的东西:

for each rgCell in rgList
    if rgCell.offset(0,4) = stCrit1 _
        and rgcell.offset(0,8) = stCrit2  then
        rgcell.entirerow.copy wsAddInfo.cells(intDrawRow, intDrawCol)
        intDrawRow = intDrawRow + 1

    end if
next

如果所有其他方法都失败了,我强烈建议您在执行此操作之前删除代码中的所有“选择”,在代码的开头使用application.screenupdating = false,并在应用程序中使用application.screenupdating = true你的代码结束了。强烈建议您进行错误处理,以便在错误时将screenupdating设置为true。

干杯,Si