【发布时间】:2019-11-07 09:48:41
【问题描述】:
我对在 excel 中使用 VBA 进行编程非常陌生,我的代码可以正常工作,但它太慢了。
你们能帮我加快我的任务吗?
Sheet2 有大约 42.000 个项目,而 sheet1 从 100 到 1000 不等
基本上,当有匹配项时,我会在 2 张纸中查找一个值,我将信息从 sheet2 复制到 sheet1。
在下面查看我的代码。
Sub CheckAML()
Dim i As Long
Dim j As Long
Sheet1LastRow = Worksheets("Sheet1").Range("A" & Rows.Count).End(xlUp).Row
Sheet2LastRow = Worksheets("Sheet2").Range("A" & Rows.Count).End(xlUp).Row
Application.ScreenUpdating = False
For j = 1 To Sheet1LastRow
For i = 1 To Sheet2LastRow
If Worksheets("Sheet1").Cells(j, 1).Value = Worksheets("Sheet2").Cells(i, 1).Value Then
Worksheets("Sheet1").Cells(j, 3).Value = Worksheets("Sheet2").Cells(i, 2).Value
Worksheets("Sheet1").Cells(j, 4).Value = Worksheets("Sheet2").Cells(i, 3).Value
Worksheets("Sheet1").Cells(j, 5).Value = Worksheets("Sheet2").Cells(i, 4).Value
Else
End If
Next i
Next j
Application.ScreenUpdating = True
End Sub
如果 Sheet2 可以是一个单独的工作簿,那就太好了。
【问题讨论】:
-
考虑摆脱内部的
For循环,改用Range.Find()Like。foundCell = Range("A1:A" & Sheet2LastRow").Find(Worksheets("Sheet1").Cells(j, 1).Value)然后你可以做foundCell.Offset(, 2).Value = Worksheets("Sheet2").Cells(i, 2).Value等等。这应该会显着提高性能。 -
给定的 sheet1 值是否可以有多个匹配项?如果只有一个匹配,那么
Application.Match()可能是最快的方法。 -
感谢您的快速回复,sheet1和sheet2之间只能匹配1个,sheet2基本上是主数据库,A列有42000个唯一编号。实现应用程序的最佳方法是什么?在单独的工作簿而不是 sheet2 中查找是否容易?
-
"如果 Sheet2 可以是一个单独的工作簿,那就太好了" 简单。
Dim wb As Workbook Set wb = Workbooks.Add然后只需声明您的新工作表,在您的代码中替换它,然后中提琴