Excel比较两张纸并更新纸张1

好的 - 已多次询问此问题,但再次询问最佳解决方案:

我有两个excel文件(不是表) . 第一张excel表非常庞大,有近200,000条记录 . 其中一个列(性别)已损坏,我必须修复它 .
我有第二个excel文件,它只有大约200条记录 - 这些记录对于那些搞砸了的记录具有正确的值 .

例如:

Master List with 200,000 records

这是具有正确值的文件,只有大约200条记录(只有损坏的记录) .
enter image description here

现在我需要一个宏,我需要在200,000条记录中找到这200条记录(按员工ID),并用正确的值替换Gender值 .
我找到了类似的东西here . 但我不想200次循环200,000条记录 . 感觉就像性能开销 . 有更好的选择吗?

我在想一个理想的解决方案

  • 循环200个项目并使用每个循环的员工ID

  • 获取该员工ID并在主Excel的Employee id列中执行"Find"操作

  • 如果找到,请替换“性别”列值

还有其他更好的解决方案吗?任何意见都很高兴

回答(3)

2 years ago

通过VBA执行此操作的一种方法是循环执行200次更正,将ID与MATCH函数进行比较以找到它所属的行,而不是第二次循环(第二次循环到20000会花费很长时间,就像你说的那样) .

对于下面的sub我已经将200表复制并粘贴到20000表的第5:7列中,您可以很容易地自动化这个部分,或者只是为代码的每个部分输入正确的工作表引用 .

我还放入了一个检查行,以确保小表中的当前ID匹配,否则会引发错误 . 您可以在此错误捕获中将ELSE放在END IF之前,以突出显示实际未找到的任何ID . 这是代码,希望这个方法有帮助!

Sub replace_things()
With ActiveSheet
For x = 2 To 200 'Change this to however many is in the small table
    cur = .Cells(x, 5) 'Defined cur as ID from small table
    aMatch = Application.WorksheetFunction.CountIf(.Range("A:A"), cur) 'Check to see there's a match in large table
    If aMatch > 0 Then ' if there's a match then...
        theRow = Application.WorksheetFunction.Match(cur, .Range("A:A"), 0) 'get the row number the match is actually on
        .Cells(theRow, 3) = .Cells(x, 7) 'when row is found, replace with the relevant value from col7 (col3 of small table)
    End If
Next x
End With
End Sub

2 years ago

以超快的方式,复制您的CORRECT员工ID列表并粘贴到CORRUPT员工ID列表下方...突出显示重复项并更正突出显示的内容 .

否则VLOOKUP可以标记哪些是腐败的?基本上从正确的列表中获取一个唯一的字段,并将其与您的损坏列表进行比较,然后修复~200错误 .

2 years ago

我假设员工ID是一个唯一的记录,因此您可以在正确的记录下粘贴正确的记录,按empID排序并突出显示重复记录以便轻松找到它们 .