我有一个快速脚本,它贯穿一列,并在另一行中找到对应的匹配列。然后,它将遍历第一个匹配值右侧的列,并将它们写入相应匹配列的右侧列。目前该代码适用于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
答案 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会告诉您您到底需要做什么。