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

时间:2016-09-28 00:51:03

标签: excel vba excel-vba macros

好的 - 已多次询问此问题,但又要求寻求最佳解决方案:

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

例如:
Master List with 200,000 records

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

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

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

  1. 循环使用200个项目并使用每个循环的员工ID
  2. 获取该员工ID并在master excel
  3. 的Employee id列中执行“查找”操作
  4. 如果找到,请替换“性别”列值
  5. 还有其他更好的解决方案吗?任何投入都很高兴

3 个答案:

答案 0 :(得分:1)

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

对于以下sub,我已将200表复制并粘贴到20000表的第5:7列中,您可以轻松地自动完成此部分,或者只为代码的每个部分输入正确的工作表参考。 / p>

我还放入了一个检查行,以确保小表中的当前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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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