【问题标题】:Excel VBA Remove Duplicates AutomaticallyExcel VBA 自动删除重复项
【发布时间】:2016-10-19 22:10:11
【问题描述】:

我正在尝试从表格中复制一列并将其粘贴,这样做时会删除重复的单元格。我正在使用此代码:

Sub Median()

    Application.Calculation = xlManual
    Application.ScreenUpdating = False

    Worksheets("Distance to Default").Activate

With ActiveSheet

    .Range("C:C").Copy Destination:=.Range("T:T")
    .Range("T:T").RemoveDuplicates , Header:=xlNo

End With

    Application.Calculation = xlAutomatic
    Application.ScreenUpdating = True

End Sub

msgbox

如果不是因为出现一个 msgbox 要求我选择要删除重复项的列(上图),它会正常工作。由于我只粘贴一列,所以这个问题没有意义。

如何更改我的代码以使该框不再出现?

Obs.:我曾尝试在 RemoveDuplicates 之后使用 Columns:=1,但它不起作用

【问题讨论】:

  • 当我使用您的示例时,我没有收到一个框询问我的任何输入
  • 这是您正在运行的完整代码吗?如果没有,你能多发点吗?
  • 我发布了完整的子。
  • 下次如果您清楚地解释您正在使用 Excel for mac,它将对人们非常有帮助。将使您免于获得许多有用的答案。

标签: vba excel


【解决方案1】:

如果您使用Application.DisplayAlerts = False,则不应出现 msgbox。

正如我在上面的评论中提到的,当我使用您的示例时,我没有收到警告,但此代码通常会抑制显示警报。

【讨论】:

  • 感谢您的回答。 msgbox 仍然出现,现在它提供了删除 Q 列的选项。
【解决方案2】:

将“Columns:=1”添加到您的代码中。这样做会自动选择范围的第一列:

With ActiveSheet

.Range("C:C").Copy Destination:=.Range("T:T")
.Range("T:T").RemoveDuplicates, Columns:=1, Header:=xlNo

End With

【讨论】:

  • 也许这个(和其他解决方案)不适用于 Mac。也许只使用非常基本的编码而不使用特定的 vba 元素是个好主意。例如,您可以循环遍历这些值,将它们写入一个数组,比较它们并删除那些两次提到的值。这需要更多的努力,但它只使用循环和数组,据我所知,Excel for Mac 支持这些。
【解决方案3】:

更新:这将在 Mac OS 上运行

Sub MacRemoveDuplicates()
    Dim Data, UniqueData, v
    Dim x As Long

    Dim c As Collection
    Set c = New Collection

    With ActiveSheet

        Data = Intersect(.Range("C:C"), .UsedRange)
        ReDim UniqueData(1 To UBound(Data, 1), 1 To 1)

        For Each v In Data
            If v <> vbNullString Then
                On Error Resume Next
                c.Add vbNullString, v

                If Err.Number = 0 Then
                    x = x + 1
                    UniqueData(x, 1) = v
                End If
                On Error GoTo 0
            End If
        Next

        .Range("T1").Resize(x) = UniqueData
    End With
End Sub

以下是使用 Windows 操作系统删除重复项的两种方法。

Sub Method1()

    With ActiveSheet
        .Range("C:C").Copy Destination:=.Range("T:T")
        .Range("T:T").RemoveDuplicates Columns:=1, Header:=xlNo
    End With

End Sub


Sub Method2()
    Dim Data, v
    Dim dict As Object
    Set dict = CreateObject("Scripting.Dictionary")

    With ActiveSheet

        Data = Intersect(.Range("C:C"), .UsedRange)

        For Each v In Data
            If v <> vbNullString Then dict(v) = vbNullString
        Next

        .Range("T1").Resize(dict.Count) = Application.Transpose(dict.Keys)
    End With
End Sub

【讨论】:

  • 谢谢托马斯。我试过这个,但没有用。我的代码是:
  • 第二个,我收到“ActiveX 组件无法创建对象”错误消息
  • 您在 2 日收到错误消息,因为您使用的是没有 Scripting.Dictionary 对象的 Mac。
  • @ScottHoltzman 谢谢。我刚刚更新了我的答案以使用Collection 而不是Dictionary
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-27
  • 1970-01-01
  • 1970-01-01
  • 2020-03-02
  • 2016-06-25
  • 1970-01-01
  • 2022-12-15
相关资源
最近更新 更多