问题描述
我正在尝试为不匹配的对应值编写高效且更快的 VBA 代码,这将:
- 对照 A1:A9000 检查 C 列的每个值
- 如果找到:复制 B 列和 C 列的值并将它们粘贴到找到的单元格值(在 B 列和 C 列中),同时删除旧的不匹配条目。
运行 for 循环最终会进行 9000*9000 计算,制作速度非常慢。我是初学者,不知道更快的方法。我知道 .Find 比使用 for 循环快得多。
以下是不匹配的样本数据:
请注意,B 列和 C 列中的值将始终相互匹配并正确对应。 A AND B & C 之间的不匹配。
这是想要的结果:
请注意,不能更改或更改 A 列。
这是我到目前为止所拥有的,但处理代码所需的时间太长了:
Sub Realign()
For i = 2 To 9000
Set Found = Sheets("Sheet1").Range("A:A").Find(What:=Worksheets("Sheet1").Cells(i,3).Value,_
LookIn:=xlValues,_
LookAt:=xlWhole,_
SearchOrder:=xlByRows,_
SearchDirection:=xlNext,_
MatchCase:=False)
If Found Is nothing Then
Worksheets("Sheet1").Cells(i,2).Value = ""
Worksheets("Sheet1").Cells(i,3).Value = ""
Else
Found.Offset(0,1).Value = Worksheets("Sheet1").Cells(i,2).Value
Found.Offset(0,2).Value = Worksheets("Sheet1").Cells(i,3).Value
End If
Next
Call Delete1
End Sub
Sub Delete1()
For i = 2 To 9000
If Not Worksheets("Sheet1").Cells(i,3).Value = Worksheets("Sheet1").Cells(i,1).Value Then
Worksheets("Sheet1").Cells(i,2).Value = ""
Worksheets("Sheet1").Cells(i,3).Value = ""
End If
Next
End Sub
解决方法
Match()
比 find 快:
编辑:重新设计以避免覆盖的机会(假设不存在重复项)
Sub Realign2()
Dim ws As Worksheet,m,v,r As Long,arr,arr2
Set ws = ThisWorkbook.Worksheets("Sheet2")
arr = ws.Range("A1:C9000").Value 'get data as array
arr2 = arr 'make a copy
'clear columns 2 and 3 in arr
For r = 2 To UBound(arr,1)
arr(r,2) = ""
arr(r,3) = ""
Next r
For r = 2 To UBound(arr2,1)
v = arr2(r,3)
If Len(v) > 0 Then
m = Application.Match(v,ws.Range("A:A"),0)
If Not IsError(m) Then
arr(m,2) = arr2(r,2)
arr(m,3) = arr2(r,3)
End If
End If
Next r
ws.Range("A1:C9000").Value = arr
End Sub