【发布时间】:2021-01-30 22:19:43
【问题描述】:
我遇到了从单行中删除重复项的问题。我想遍历一个范围内的所有行并从单行中删除重复项,而不影响工作表中的其余数据。这是示例数据:
+---------------+------+------+------+---------------+---------------+
| name | num1 | num2 | mun3 | emial1 | email2 |
+---------------+------+------+------+---------------+---------------+
| ali zubair | 1 | 2 | 1 | az@az.com | az@az.com |
+---------------+------+------+------+---------------+---------------+
| tosif | 1 | 2 | 2 | t@zb.com | t@gb.com |
+---------------+------+------+------+---------------+---------------+
| qadeer satter | 3 | 2 | 3 | qs@mtm.com | star@mtn.com |
+---------------+------+------+------+---------------+---------------+
| asif | 4 | 3 | 2 | | |
+---------------+------+------+------+---------------+---------------+
| hamid | 1 | 5 | 2 | hamid@beta.ds | hamid@beta.ds |
+---------------+------+------+------+---------------+---------------+
以下代码根据第 2 列删除重复行,不适用于我的情况。
ActiveSheet.Range("A1:f100").RemoveDuplicates Columns:=Array(2), Header:=xlYes
我不知道如何从选定的行范围中删除重复项。到目前为止,我的代码将遍历我的数据中的所有行。
Sub removeRowDubs()
Dim nextRang As Range
Dim sCellStr As String, eCellStr As String
Dim dRow As Long
dRow = Cells(Rows.Count, 1).End(xlUp).Row
For dRow = 2 To dRow
sCellStr = Range("A" & dRow).Offset(0, 1).Address
eCellStr = Cells(dRow, Columns.Count).End(xlToLeft).Address
Set nextRang = Range(sCellStr, eCellStr)
Debug.Print nextRang.Address
Next
End Sub
所以我需要一些代码来做我需要在下面的代码之后插入的代码。
Set nextRang = Range(sCellStr, eCellStr)
如果有像“.RemoveDuplicates”这样的简单解决方案,请告诉我。到目前为止,我正在考虑通过循环执行此操作,但它似乎很复杂,因为我认为我需要至少 3 个“for each”循环和 3 个“if 条件”,另外 2 个行范围,当我开始这样做时可能还有其他内容。
我希望我的问题已经明确,并且非常感谢您的帮助。我是 Excel VBA 编码的新手,需要您的耐心..
因此,我还编写了删除行重复项的代码。下面是我的代码,它为我工作。它很复杂,而且 stackoverflow 上的人提供了更好的代码。
Sub removeRowDublicates()
Dim nextRang As Range ' Variables for
Dim sCellStr As String, eCellStr As String ' Going through all rows
Dim dRow As Long ' And selecting row range
dRow = Cells(Rows.Count, 1).End(xlUp).Row ' This code selects the
For dRow = 2 To dRow ' next row in the data
sCellStr = Range("A" & dRow).Offset(0, 1).Address
eCellStr = Cells(dRow, Columns.Count).End(xlToLeft).Address
Set nextRang = Range(sCellStr, eCellStr)
Dim aRange As Range, aCell As Range ' Variables for
Dim dubCheckCell As Range, dubCheckRange As Range ' Loops to remove
Dim dubCheckCell1 As Range ' Dublicates from
Dim columnNum As Integer ' Current row
Set aRange = nextRang
columnNum = Range("b2:f2").Columns.Count + 1
aRange.Select
For Each aCell In aRange 'Loop for selecting 1 cell, if not blank from range to check its value against all other cell values
If aCell.Value <> "" Then
Set dubCheckCell = aCell
Else
GoTo nextaCell 'If current cell is blank then go to next cell in range
End If
If dubCheckCell.Offset(0, 2).Value <> "" Then 'Selects range by offsetting 1 cell to right from current cell being checked for dublicate value
Set dubCheckRange = Range(dubCheckCell.Offset(, 1), dubCheckCell.Offset(, 1).End(xlToRight))
Else
Set dubCheckRange = Range(dubCheckCell.Offset(0, 1).Address)
End If
For Each dubCheckCell1 In dubCheckRange 'Loop that goes through all cells in range selected by above if-statement
Do While dubCheckCell1.Column <= columnNum
If dubCheckCell = dubCheckCell1 Then
dubCheckCell1.ClearContents
Else
End If
GoTo nextdubCheckCell1
Loop 'For do while
nextdubCheckCell1:
Next dubCheckCell1 'Next for dubCheckRange
nextaCell:
Next aCell 'Next for aRange
Next 'For drow
End Sub
【问题讨论】:
-
搜索将基于哪些列? A-D、B-E 或所有列,例如甲乙?列的左侧或右侧是否有必须保留的数据?
-
从数据中可以看出,重复项遍布行,因此不能基于一列。例如。请参阅第 2 行 - Num1 和 Num3 是重复的,电子邮件 1 和电子邮件 2 也是如此。我的想法是从行中选择 1 个单元格,然后将其与同一行中的所有其他单元格进行检查,如果单元格值等于行中的任何其他单元格,则删除该单元格值。如果不为空,则从行中选择第二个单元格并重复
-
例如在 Row2 中,命名 ali zubair 选择具有“1”作为值的 cell1,并检查所有剩余的单元格 num2、num3、email1 和 email2。因此,在第 1 步中,从 Num3 列中删除了 1。但这会很复杂,我可以尝试这样做,但想知道是否有任何简单的解决方案。谢谢