0

我有一个带有 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

有没有办法让他们更有效率?我错过了什么?顺便说一句,What_I_Want 和 Item_To_Search 只是带有名称的单元格。一个有趣的事实是,在编写代码期间,我在“selection.paste”之类的东西中遇到了非常奇怪的错误,这就是为什么我使用了一个不常见的符号,比如“Worksheets(“ADD INFO”)。[A13] 。特殊黏贴”

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

4

1 回答 1

0

我建议尽可能摆脱“选择”和“激活”,应该加快速度并最终避免错误。例如,您是否能够清除工作表上的所有单元格(“添加信息”)?表格(“添加信息”).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) 查找最后使用的单元格,而不是“选择”等...

您的方法实际上可能比手动迭代每一行并复制满足条件的位置要慢吗?也许值得尝试一下。就像是:

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。

干杯,西

于 2013-08-30T04:01:02.450 回答