Vba ID代码匹配脚本非常慢

Vba ID代码匹配脚本非常慢,vba,excel,Vba,Excel,我有一个快速脚本,它在一列中运行,并在另一行中找到相应的匹配列。然后,它将列带到第一个匹配值的右侧,并将它们写入相应匹配列的右侧列中。目前代码可以工作,但是对于我需要搜索的87000行,它的速度非常慢。有没有人对我如何提高脚本运行速度、抛出大量行和数据有什么建议 Sub s() Dim i As Long Dim pointer As Long pointer = 1 Do While ThisWorkbook.Sheets("MPACSCodesedited"

我有一个快速脚本,它在一列中运行,并在另一行中找到相应的匹配列。然后,它将列带到第一个匹配值的右侧,并将它们写入相应匹配列的右侧列中。目前代码可以工作,但是对于我需要搜索的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
在Do While循环中,此工作表对象在每次迭代中被解引用一次,然后在If条件中被解引用两次,如果该条件的计算结果为True,则每次将再解引用6次

如果在编译时存在已编辑的工作表MPacCodes,请在项目资源管理器Ctrl+R中选择它,然后访问其属性F4,并为其指定一个有意义的名称属性值-例如,MPacCodesSheet

祝贺您,您刚刚消除了取消引用该对象的需要—VBA接受该名称属性值并创建一个全局/项目范围对象变量,您可以在任何地方使用该变量引用该工作表:

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

但首先要做的是

首先要解决的是,您正在一个单元格一个单元格地访问工作表,无论是读还是写:这本身就是低效的

您可以把头埋在沙子里,关闭自动计算和工作表事件等等,但如果您将内容转储到二维数组中,迭代该数组,写入该数组,然后将该数组作为单个操作转储到工作表中,则不需要这些


从上一个问题可以准确地告诉您需要做什么。

可能不需要执行太多的单元格查找-将工作表引用移动到单独的变量,可能首先获取对行的引用并执行列查找,而不是始终查找特定的单元格。还有,你所说的非常慢是什么意思?10秒?10分钟?@Cory说的极慢,我是说24小时你有没有试过上一个问题中我的变体阵列版本:24小时?那太疯狂了。你的工作表有很多公式吗?可能从代码开头禁用自动重新计算开始,然后再打开:Application.Calculation=xlManual,然后运行代码,然后Application.Calculation=xlAutomatic@Cᴏ那简直是把头埋在沙子里了。使用内存中的2D数组将更加高效,并且不需要对全局应用程序状态进行任何调整。斯科特已经回答了这个问题,OP只是忽略了它。
Do While MPACSCodesSheet.Cells(pointer, 13) <> ""