【问题标题】:VBA's .removeDuplicates does not appear to work... Why?VBA .remove Duplicates 似乎不起作用...为什么?
【发布时间】:2018-06-09 11:17:45
【问题描述】:

假设我有一个列向量

1 2 1 2 1 1 1 1 1

我需要以编程方式删除重复项。所以删除重复后的输出应该是:

1 2

但是,VBA 的 .removeDuplicates 方法失败,触发错误 1004(应用程序定义错误)。
我的设置如下: 我有一本包含实际数据的工作簿。第二个工作簿包含在第一个工作簿上运行的 vba 代码。

观察#1:

当我从包含数据的工作簿和包含数据的工作表中执行 .removeDuplicates 方法时,代码就像一个魅力。

sub test  
 ActiveSheet.Range("$a$2:$a$20").RemoveDuplicates Columns:=1, Header:=xlYes
end sub

观察 #2:

但是,当我尝试从另一个工作簿运行相同的代码时(稍作修改以解决代码在第一个工作簿之外的事实),.removeDuplicates 失败:

Sub test()
    Dim wb As Workbook
    Dim sh As Worksheet

    'get a handle to data containing workbook and sheet
    Set wb = Workbooks(1) 'change wb index as needed
    Set sh = wb.Sheets("s2") ' change sheet name  as needed
    sh.Range("$a$2:$a$20").RemoveDuplicates Columns:=Array(1), Header:=xlYes
End Sub

以前有人处理过这个吗?我不能使用另一个工作簿中的 .removeDuplicates 吗?我查看了 MSDN 的 API,没有提及限制...

【问题讨论】:

  • 您是否使用 Workbooks(2) 而非 Workbooks(1) 进行测试。
  • 代码成功地为我工作,即使是从不同的工作簿运行。您是否有任何未向我们展示的On Error 声明? (我想我应该问一个明显的问题......“s2”是Worksheet 还是Chart 或其他什么?例如,如果它是一个宏表,它会给出1004错误。)
  • 忽略我之前评论的最后一部分 - 如果它是宏表而不是工作表,即使代码从同一个工作簿运行,您也会收到 1004 错误。
  • s2 只是工作表的名称。因此,为了确保我正确理解您,您可以在工作簿 #2 之外运行 .removeDuplicates 方法并在工作簿 #1 中成功应用该方法?
  • 是的。我可以让它失败的唯一方法是如果“s2”不是工作表,例如如果它实际上是一个宏工作表(看起来与工作表非常相似)。我没有测试它,但我认为如果工作表受到保护,或者某些单元格被合并或类似的东西,它也会失败。但是,当您在实际工作簿中运行宏时,这些原因都不允许它工作 - 即仅从不同的工作簿运行宏不会导致错误。

标签: vba excel duplicates


【解决方案1】:

删除重复行为很奇怪,有时有效但有时无效,基本上当单元格在选定范围内为空白时它不起作用。为避免删除重复的运行时错误,您可以使用以下程序

Call remove_duplicate(ThisWorkbook.Name, "Mysheets", 14, 400) 

上面的调用在 SUB 之后启动,并且与删除删除重复的工作相同 在哪里

ThisWorkbook.Name 是工作簿名称,对于您的情况,它是“1”。 Mysheets 是工作表名称,因此您的案例将是“s2”。 14 = 列号,对于您的情况,它是 1。 400 = 最后一行编号,对于您的情况,它是 20。

Sub remove_duplicate(ByVal WorkBookName As String, ByVal worksht As String, ByVal col_Number As Integer, ByVal LastRow As Integer)
'WorkBook must be open withwise won't work
'col_Number = the column u want to test duplicate value

Dim i As Long
Dim CalcMode, ViewMode As Variant

Workbooks(WorkBookName).Worksheets(worksht).Activate

If LastRow <= 1 Then  'if Rows on column is empty or only contains header then exit the sub
    Exit Sub
End If

With Application
    CalcMode = .Calculation
    .Calculation = xlCalculationManual
    .ScreenUpdating = False
End With

ColChr = Split(Cells(1, col_Number).Address, "$")(1)
With ActiveSheet
    If ActiveSheet.AutoFilterMode = True Then ActiveSheet.AutoFilterMode = False
    ViewMode = ActiveWindow.View
    ActiveWindow.View = xlNormalView
    Range("A1").Select
    For i = LastRow To 2 Step -1
        CheckVal = Range(ColChr & i).Value
        CountVal = Application.CountIf(Range(ColChr & ":" & ColChr), CheckVal)
        If CountVal > 1 Then
            Rows(i).EntireRow.Delete
        End If
    Next i
End With

ActiveWindow.View = ViewMode
With Application
   .ScreenUpdating = True
   .Calculation = CalcMode
   .ScreenUpdating = True
End With

End Sub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-14
    • 2010-10-14
    • 2022-11-13
    • 2014-12-07
    • 2012-10-19
    • 1970-01-01
    相关资源
    最近更新 更多