Excel VBA比较动态单元格范围中的两行

时间:2014-02-22 01:21:47

标签: excel-vba comparison row dynamic-data vba

好的,问候这一切是我的第一篇文章(当然不是我的最后一篇,因为我是这个项目的唯一工作人员)。我的VBA体验很小,所以你看到的有点像我的“你好世界”。

总而言之......我想比较动态范围表中的两行(在打开时从访问数据库中更新)并找到与前四列完全匹配的行(参见下面的代码)。

然后将第七列与两个比较行中的最高值进行比较。 (Full,Adequate和Basic是要从最高到最低比较的值)

然后,在满足所有这些标准后,丢掉最低值并保持最高值。 FOR ALL ROWS(换句话说是While循环)。

此代码用于我工作地点的培训数据库,当员工继续培训时,有许多相同的条目具有不同的理解水平。这段代码应该完成所有的培训,并保持最高价值(最好的代表性)和其他“obselete”条目。

这是我毫无价值的代码:

Sub RemoveDuplicates()
Dim Bottom As Integer
Dim FalseBottom As Integer
'remove lower leveled duplicate entries
Bottom = CInt(Cells(Rows.Count, "A").End(xlUp).Row) 'initializes the bottom of the    list (total number of entries)
Do Until Bottom = 0
 FalseBottom = 1
 If Not IsEmpty(Cells(Bottom, "A")) Then
  Do Until FalseBottom = Bottom
   If ((Cells(FalseBottom, "A").Text = Cells(Bottom, "A").Text) And (Cells  (FalseBottom, "B").Text = Cells(Bottom, "B").Text) And (Cells(FalseBottom, "C").Text = Cells(Bottom, "C").Text) And (Cells(FalseBottom, "D").Text = Cells(Bottom, "D").Text)) Then
  '(Cells(FalseBottom, "G").Text > Cells(Bottom, "G").Text)
    If (Cells(Bottom, "G").Text = "Full") Then
     Rows(FalseBottom).Delete Shift:=xlUp
     FalseBottom = FalseBottom - 1
    End If
    If ((Cells(Bottom, "G").Text = "Adequate") And (Cells(FalseBottom, "G").Text = "Basic")) Then
     Rows(FalseBottom).Delete Shift:=xlUp
     FalseBottom = FalseBottom - 1
    End If
    If (Cells(FalseBottom, "G").Text = "Full") Then
     Rows(Bottom).Delete Shift:=xlUp
    End If
    If ((Cells(FalseBottom, "G").Text = "Adequate") And (Cells(Bottom, "G").Text = "Basic")) Then
     Rows(Bottom).Delete Shift:=xlUp
    End If
  End If
  FalseBottom = FalseBottom + 1
  Loop
  End If
 Bottom = Bottom - 1
Loop
End Sub

为了更好地解释,在我的excel表中我有

A    |B    |C       |D      |E          |F          |G
---------------------------------------------------------------
First|Last |Category|Task   |Performance|Requirement|Understanding
---------------------------------------------------------------
Joe  |Smoe |Cleaning|Toilets|10         |10         |Basic
Joe  |Smoe |Cleaning|Toilets|10         |10         |Adequate
Joe  |Smoe |Cleaning|Toilets|10         |10         |Full
Joe  |Smoe |Cleaning|Showers|10         |10         |Basic
Jane |Plane|Cleaning|Toilets|10         |10         |Basic
...
...

基本上有一种方法可以找到(在所有行中)前4列匹配的位置,然后比较最后一列以查看哪个是最高级别并丢弃其他匹配?

1 个答案:

答案 0 :(得分:0)

固定问题!!

将.Text更改为.Value

拆分If语句

为了便于阅读,将值分配给自己的变量

并且像魅力一样工作......不知道为什么,但我会接受它。