ID代码匹配脚本非常慢

时间:2018-07-09 18:06:26

标签: excel vba excel-vba

我有一个快速脚本,它贯穿一列,并在另一行中找到对应的匹配列。然后,它将遍历第一个匹配值右侧的列,并将它们写入相应匹配列的右侧列。目前该代码适用于87000行,但我需要搜索的速度非常慢。有人对我可以提高此脚本运行速度的方式有任何建议吗?

Sub s()
    Dim i As Long
    Dim pointer As Long

    pointer = 1
    Do While ThisWorkbook.Sheets("MPACSCodesedited").Cells(pointer, 13) <> ""
        For i = 1 To 305
            If ThisWorkbook.Sheets("MPACSCodesedited").Cells(i, 1).Value = ThisWorkbook.Sheets("MPACSCodesedited").Cells(pointer, 13).Value Then
                ThisWorkbook.Sheets("MPACSCodesedited").Cells(pointer, 14).Value = ThisWorkbook.Sheets("MPACSCodesedited").Cells(i, 2).Value
                ThisWorkbook.Sheets("MPACSCodesedited").Cells(pointer, 15).Value = ThisWorkbook.Sheets("MPACSCodesedited").Cells(i, 3).Value
                 ThisWorkbook.Sheets("MPACSCodesedited").Cells(pointer, 16).Value = ThisWorkbook.Sheets("MPACSCodesedited").Cells(i, 4).Value
            End If
        Next i
        pointer = pointer + 1
    Loop
End Sub

1 个答案:

答案 0 :(得分:2)

ThisWorkbook.Sheets("MPACSCodesedited")

Worksheet对象在Do While循环中每次迭代都被取消引用一次,然后在If条件中被取消引用两次,如果该条件的值为True,则将其取消引用6每次都有更多次。

如果工作表MPACSCodesedited在编译时存在,请在 Project Explorer (Ctrl + R)中将其选中,然后访问其属性(F4),并为其赋予一个有意义的{{1 }}属性值-例如(Name)

恭喜,您甚至无需取消对该对象的引用,甚至只需 -VBA就会获得MPACSCodesSheet属性值,并创建一个可以使用的全局/项目范围对象变量可以参考该工作表的任何地方:

(Name)

如果该单元格包含错误值(例如Do While MPACSCodesSheet.Cells(pointer, 13) <> "" ),则说明您正在发生类型不匹配错误。在将单元格值与任何值进行比较之前,需要使用#N/A函数确保没有出现错误。

但首先要注意

首先要解决的事实是,您正在逐个单元地访问该工作表,包括读写操作:这本质上效率低下。

您可以全神贯注,关闭自动计算和工作表事件,然后执行其他操作,但是如果将内容转储到2D数组中,对该数组进行迭代,然后写入该数组,然后再执行此操作,则不需要任何操作将数组作为单个操作转储到工作表上。

您上一个问题中的

This answer会告诉您您到底需要做什么。