从员工数据库中提取Excel:删除由笛卡尔联接创建的重复员工数据?

时间:2018-02-05 18:17:24

标签: excel-vba vba excel

RawData is an excel report drawn from an employee database.(试图附上工作簿,但没看到如何做到这一点)。 RawData包含一些员工的多个不需要的重复项。我被告知这是因为员工数据库中的笛卡尔联接创建了RawData报告。无论是否是这种情况,我无法控制RawData报告的生成方式。就是这样。

我需要清理RawData报告,以便最终产品看起来像CorrectedView tab,我手动更正了。 RawData有时可能有几千行,因此自动清理将是一个巨大的帮助。

RawData的结构分为五组:Employee Basic Info(cols A-E),Education(cols F-H),Awards(cols I-L),Certifications(cols M-Q)和Accomplishments(cols R-T)。在CorrectedView中,我所做的是:

  1. 删除了五个栏目中每个员工的重复项
  2. 向上移动每位员工的剩余数据,以便每位员工的信息从他/她的第一行开始
  3. 执行上述#2后,删除了员工之间创建的所有空白行。
  4. 我正在寻找一种自动化流程的方法。我有一些代码(如下所示)完成了基本信息部分的#1,但这是我能得到的。谢谢你的帮助。

    Sub DelSame()
    Dim LastRow As Long, i As Long
    LastRow = Cells(Rows.Count, 1).End(xlUp).Row
      For i = LastRow To 3 Step -1
        If Cells(i, 1).Value = Cells(i - 1, 1).Value Then Rows(i).Range("a1:e1").ClearContents
      Next i
    End Sub
    

1 个答案:

答案 0 :(得分:1)

你几乎拥有它......使用AND作为多个标准:

Dim LastRow As Long, i As Long
LastRow = Cells(Rows.Count, 1).End(xlUp).Row
For i = LastRow To 3 Step -1
    If Cells(i, 1).Value = Cells(i - 1, 1).Value AND Cells(i, 2).Value = Cells(i - 1, 2).Value AND Cells(i, 3).Value = Cells(i - 1, 3).Value Then 
        Rows(i).Delete
    End If
Next i

EDIT1:

所以,上面的内容适合第一组列...现在是困难的部分。

您可以对所有列使用AND部分,这样您就不会在行之间得到任何重复项(实际上应该适合该帐单,以免意外删除任何项目。)

为了更多地参与,在删除任何行之前,您需要开始存储值以更适当地处理每个列组,以便您使用行a到b(未经测试的代码)。

Dim a as Long, b as Long, i as Long, lr as Long
lr = cells(rows.count,1).end(xlup).row
For i = lr to 3 step -1
    If cells(i,1).value = cells(i+1,1).value then
         If a = 0 then
             a = i + 1
         End If
    Else
         If a > 0 AND b = 0 then
             b = i + 1
         End If             
    End If
    If b > 0 AND a > 0 Then
        'perform narrowed actions on range(cells(a,1),cells(b,1))
        a = 0 'resets for next grouping
        b = 0 'resets for next grouping
    End If
Next i