我使用此宏将内容从一个Excel工作表复制到另一个工作表,方法是比较两列并找到匹配的单元格 . 问题是这个宏需要很长时间(接近三天)才能完成 . 两张纸都有近4,00,000条记录可供比较 .
有人可以帮助我加快速度吗?
Option Explicit
Sub MatchAndCopy()
Dim sheet01 As Worksheet, sheet02 As Worksheet
Dim count As Range, matchingCell As Long
Dim RangeInSheet1 As Variant
Dim RangeInSheet2 As Variant
Application.ScreenUpdating = False
Application.DisplayStatusBar = True
Set sheet01 = Worksheets("Sheet1")
Set sheet02 = Worksheets("Sheet2")
Set RangeInSheet1 = sheet01.Columns(1)
Set RangeInSheet2 = sheet02.Range("A2", sheet02.Range("A" & Rows.count).End(xlUp))
For Each count In RangeInSheet2
matchingCell = 0
On Error Resume Next
matchingCell = Application.Match(count, RangeInSheet1, 0)
On Error GoTo 0
If matchingCell <> 0 Then
Application.StatusBar = "Please wait while data is being copied, Processing count : " & count
sheet01.Range("F" & matchingCell).Value = count.Offset(, 1)
sheet01.Range("G" & matchingCell).Value = count.Offset(, 2)
sheet01.Range("H" & matchingCell).Value = count.Offset(, 3)
sheet01.Range("I" & matchingCell).Value = count.Offset(, 4)
sheet01.Range("J" & matchingCell).Value = count.Offset(, 5)
End If
Next count
Application.StatusBar = False
Application.ScreenUpdating = True
End Sub
3 回答
应该更快:
对于两张纸之间的400万条记录,请使用数据库 . Excel不是数据库 .
如果您坚持将Excel视为数据库,我建议使用ADODB . 有关类似问题和解决方案,请参阅this answer .
通过将名称放在每列的第一行中,将Sheet1上的每个列命名为要写入的列 . 例如,我们称之为
F1
,_ _ 27606048,F3
,F4
和F5
. 另外,使用Sheet1和Sheet2之间的共享数据命名列;例如,我们称之为F0
.然后,如果您的Office版本允许,您可以发出以下声明:
如果没有,您可以将CopyFromRecordset方法与从以下SQL语句生成的记录集一起使用:
立即获取整张纸
并在本地比较值
EDIT-1
Google Apps脚本文档https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet为getDataRange()提供了以下示例
不应使用大量范围,而应在一次调用中获取数据并在本地处理