我想比较(500)并在2张纸内找到重复的每日记录,并将不匹配的行复制到另一张纸,将匹配从另一张复制到第三张,然后从原始纸张中删除匹配的记录 .
我有3个工作表(结果,主列表,跟随Ups)“结果”每天更新500条记录,并添加到“主列表”,重复行添加到“跟进”
所有类似的列都 Headers 为A到O.
我想比较B列(唯一)和工作表“结果”的A列到“主列表”流程 - 将“结果”B列中的第一个单元格值与“主列表”的B列单元格值匹配如果匹配找到 - 将“结果”的列A与“主列表”的列A单元格值进行比较如果匹配,则将匹配行从“A列的主列表”复制到“下一个可用行”的“FOllow Ups”并标记匹配在搜索循环结束时最后删除“结果”中的行
否则,如果未找到匹配,则检查“结果”的B列中的下一个值,直到最后一个记录
当整个搜索结束时删除“结果”中找到的匹配标记记录,并将所有剩余记录复制到“主列表”中的下一个可用表行
我有点卡住,不想长时间运行,寻找最短,最快的代码的专家帮助 . 这里有一些已经编写和工作的代码,但效果不佳 . 在此先感谢您的帮助 .
Set sht1 = xlwb.Worksheets("results")
Set sht4 = xlwb.Worksheets("Master List")
Set sht5 = xlwb.Worksheets("Follow Ups")
For i = 2 To sht1.Range("A1").SpecialCells(xlCellTypeLastCell).Row
For j = 2 To sht4.Range("A1").SpecialCells(xlCellTypeLastCell).Row
If sht1.Cells(i, 2) = sht4.Cells(j, 2) And sht1.Cells(i, 1) = sht4.Cells(j, 1) Then
'sht4.Rows(j).Copy
' sht5.Activate
'sht5.Cells(1, sht5.Range("A1").SpecialCells(xlCellTypeLastCell).Row).Select
sht4.Rows(j).Copy _
Destination:=sht5.Cells(sht5.Range("A1").SpecialCells(xlCellTypeLastCell).Row + 1, 1)
'sht1.Rows(i).Delete
'i = i - 1
End If
Next j
Next i
sht1.Range("A2:O" & sht1.Range("A1").SpecialCells(xlCellTypeLastCell).Row).Copy _
Destination:=sht4.Cells(sht4.Range("A1").SpecialCells(xlCellTypeLastCell).Row, 1)
2 回答
如果您有"a lot"数据,那么在此处执行操作会产生严重的性能问题 . 问题是,每次将数据从Excel移动到VBA都是一种开销 . 你应该在这里做的是将所有数据一次复制到数组(参见http://www.cpearson.com/excel/ArraysAndRanges.aspx)并在VBA中完成所有逻辑而不触及Excel工作表 .
如果你仍然需要提升性能,你应该查看字典(参见Does VBA have Dictionary Structure?) .
阅读这篇文章:https://msdn.microsoft.com/en-us/library/office/ff726673.aspx特别是段"Read and Write Large Blocks of Data in a Single Operation"
考虑一个SQL解决方案(假设您使用Excel for PC),因为Excel可以使用Jet / ACE SQL引擎(Windows .dll文件)在工作簿上运行ODBC连接 . 此处不使用循环或if / then逻辑跨单元格来实现可扩展,高效的解决方案 . 基本上你会运行两个查询:
VBA 脚本(驱动程序/提供程序版本包含两个连接)
Demo
这是一个使用Shakespearan字符的Dropbox xlsm file演示,其中MasterList包含流行的女性角色,结果是一小批女性/男性角色 . 按SQL按钮运行宏 . 处理完查询后,女性(匹配)输出到Follow-Ups,男性(不匹配)附加到MasterList . 请务必在字符串ODBC连接中调整工作簿路径 .