【发布时间】:2014-12-08 14:53:20
【问题描述】:
我用这个工作代码回答了question:
此 vba 代码将从下向上循环遍历所有 ID,如果传真号码已存在,它将将该 ID 添加到 C、D、E 等列中的该行(始终选择下一个空白),然后删除线。最后,它交换 A 列和 B 列,因此您在 A 列中留下一个传真号码,B、C、D、E 列等都是与该号码关联的所有 ID。
测试工作:
Sub RemoveDups()
Dim CurRow As Long, LastRow As Long, DestLast As Long, DestRng As Range
LastRow = Range("A" & Rows.Count).End(xlUp).Row
On Error Resume Next
For CurRow = LastRow To 3 Step -1
Set DestRng = Range("B2:B" & CurRow - 1).Find(Range("B" & CurRow).Value, LookIn:=xlValues, LookAt:=xlWhole, SearchDirection:=xlNext)
DestRng = DestRng
If Err > 0 Then
Err.Clear
Else
DestLast = Cells(DestRng.Row, Columns.Count).End(xlToLeft).Column + 1
Cells(DestRng.Row, DestLast).Value = Cells(CurRow, 1).Value
Cells(CurRow, 1).EntireRow.Delete xlShiftUp
End If
Next CurRow
Columns("B:B").Cut
Columns("A:A").Insert Shift:=xlToRight
Application.CutCopyMode = False
MsgBox "Done"
End Sub
我的问题是这样的: 为什么我需要额外的行 DestRng = DestRng?我添加它的原因是因为代码不起作用,所以我添加了一个检查以将DestRng 转储到Cells.Value。突然之间,代码起作用了,所以我做了一个简单的DestRng = DestRng 行,以确保仍有可能出错的代码。如果我注释掉该行,它会返回到无法运行的代码。试图找出Range.Find() 不会激活错误处理程序,但DestRng = DestRng 会激活错误处理程序的原因。
编辑:截图:
- 之前的数据:
- 带有
DestRng = DestRng和EntireRow.Delete的数据已注释掉: - 我的完整代码的数据:
【问题讨论】:
-
我无法重现该问题。据我所知,删除
DestRng = DestRng并不会改变行为。无论哪种方式,它都是有效的。可以用来重现问题的电子表格中最简单的数据集是什么? -
添加了屏幕截图@JackieChiles
-
Find如果未找到搜索值不会出错,它会返回Nothing这就是您应该测试的内容:If Not DestRng Is Nothing Then -
@Rory 我的问题更多是使用一些带有变量类型的旧代码无法使用
Nothing,因此它触发了定义行上的错误。 -
@Chrismas007 我很困惑。您不能将
Find的结果分配给无法设置为Nothing的变量类型。