【问题标题】:VBA Remove duplicates from rowsVBA 从行中删除重复项
【发布时间】:2015-08-12 06:32:23
【问题描述】:

问题很简单,但我找不到解决方案。 我想在相当长的 excel 表中删除每行的重复项

我的代码看起来像这样,但不起作用:

Sub delete()

Dim i As Long, j As Integer
i = 1
j = 2
While Sheets("Test").Cells(i, 1).Value <> "end"
    While Sheets("Test").Cells(i, j).Value <> ""
        If Sheets("Test").Cells(i, j) <> Sheets("Test").Cells(i, j).offset(, 1) Then
            j = j + 1
        Else
            Sheets("Test").Cells(i, j).offset(, 1).Clear
            j = j + 1
        End If
    Wend
i = i + 1
Wend

结束子

A列底部是词尾,待排序的数据在B到QC列。有些行有重复,有些没有。 在下一步中,我需要收集 B 列中用逗号分隔的非重复值。有人可以帮我吗?

图片:

Current datastructure

After deletion of the Duplicates

【问题讨论】:

  • 到底是什么问题?您的代码抛出错误,没有按预期工作? ...
  • 它什么都不做
  • 您没有为removeduplicates 提供足够的参数(根据msdn)尝试:ActiveSheet.Range("B" &amp; i, "QC" &amp; i).RemoveDuplicates Columns:=Array(2,3), Header:=xlYes 我不知道您是否有标题。但是,如果这会删除列 B 和 C 的重复项或您知道重复项的任何位置,请尝试
  • Sub delete() Dim i As Long i = 1 While Sheets("Test").Cells(i, 1).Value "end" Sheets("Test").Range(" B" & i, "QC" & i).RemoveDuplicates Columns:=Array(2, 3), Header:=xlNo i = i + 1 Wend End Sub Now,它仍然什么都不做。
  • 让我确认一下,您要删除什么,重复行还是重复单元格?

标签: vba excel


【解决方案1】:
Sub DeleteRows()

Dim LastRow As Long
Dim LastCol As Long
Dim i As Long
Dim wsTemp As Worksheet
Dim v As Variant

Set wsTemp = ActiveWorkbook.Worksheets.Add

With Sheets("Test")
    LastRow = .Range("A:A").Find(what:="end", after:=.Cells(.Rows.Count, 1), LookIn:=xlValues, lookat:=xlWhole).Row

    For i = 1 To LastRow
        LastCol = .Cells(i, .Columns.Count).End(xlToLeft).Column
        If LastCol > 1 Then
            v = .Cells(i, 1).Resize(1, LastCol).Value
            .Cells(i, 1).Resize(1, LastCol).ClearContents
            wsTemp.Range("A:A").Clear
            wsTemp.Range("A1").Resize(UBound(v, 2), 1).Value = Application.Transpose(v)
            wsTemp.Range("A1").Resize(UBound(v, 2), 1).RemoveDuplicates Columns:=1, Header:=xlNo
            v = wsTemp.Range("A:A").SpecialCells(xlCellTypeConstants).Value
            .Cells(i, 1).Resize(1, UBound(v, 1)).Value = Application.Transpose(v)
        End If
    Next
End With

Application.DisplayAlerts = False
wsTemp.Delete
Application.DisplayAlerts = True

End Sub

【讨论】:

  • 虽然看起来很棒,但我在这一行遇到错误:wsTemp.Range("A1").Resize(UBound(v, 2), 1).Value = Application.Transpose(v ) 类型不匹配
  • 出现错误时 UBound(v,2) 的值是多少?
  • 它可能在一行中,只有 1 个条目,即 A 列中的一个值,其右侧没有任何内容。也许只是添加一个条件来检查 LastCol = 1 然后跳过该行。
  • Ubound(v,2) 的值是。老实说:我什至不理解 LastCol=.Cells(i, .Columns.Count).End(xlToLeft).Column 下面的代码。你会把这个 If 条件放在哪里?
  • 我自己想通了,由于未知原因,我仍然每隔几行就会出错。我只是重新启动宏,稍后会弹出错误。它主要是空行,似乎会引起麻烦,而且大多数时候是 .Cells(i, 1).Resize(1, UBound(v, 1)).Value = Application.Transpose(v) 有时会引起麻烦查看值,根本没有任何错误的证据
猜你喜欢
  • 1970-01-01
  • 2016-02-21
  • 2021-06-19
  • 2015-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-05
相关资源
最近更新 更多