【发布时间】:2017-03-07 14:20:12
【问题描述】:
我正在尝试比较 2 张工作表(Sheet1 和 Sheet2)之间的单元格值以查看它们是否匹配,如果它们匹配,请将 Sheet1 中的匹配值移动到预先存在的列表(Sheet3)并删除 Sheet1 中的值之后。
我在 Excel VBA 中使用反向 For 循环,但在我开始使用 newrange1.EntireRow.Delete 删除行之前一切正常。
这会在 VBA 中引发“424”对象需要错误,我已经花了几个小时试图解决这个问题,我不确定为什么会出现这种情况。我是否错误地选择了行?对象?
如果有人能指出正确的方向,将不胜感激。
这是我的代码:
Sub Step2()
Sheets("Sheet1").Activate
Dim counter As Long, unsubListCount As Long, z As Long, x As Long, startRow As Long
counter = 0
startRow = 2
z = 0
x = 0
' Count Sheet3 Entries
unsubListCount = Worksheets("Sheet3").UsedRange.Rows.Count
Dim rng1 As Range, rng2 As Range, cell1 As Range, cell2 As Range, newrange1 As Range
' Select all emails in Sheet1 and Sheet2 (exclude first row)
Set rng1 = Worksheets("Sheet1").Range("D1:D" & Worksheets("Sheet1").UsedRange.Rows.Count)
Set rng2 = Worksheets("Sheet2").Range("D1:D" & Worksheets("Sheet2").UsedRange.Rows.Count)
' Brute Loop through each Sheet1 row to check with Sheet2
For z = rng1.Count To startRow Step -1
'Cells(z, 4)
Set cell1 = Worksheets("Sheet1").Cells(z, "D")
For x = rng2.Count To startRow Step -1
Set cell2 = Worksheets("Sheet2").Cells(x, "D")
If cell1.Value = cell2.Value Then ' If rng1 and rng2 emails match
counter = counter + 1
Set newrange1 = Worksheets("Sheet1").Rows(cell1.Row)
newrange1.Copy Destination:=Worksheets("Sheet3").Range("A" & unsubListCount + counter)
newrange1.EntireRow.Delete
End If
Next
Next
End Sub
这是我得到的错误:
【问题讨论】:
-
对我来说看起来不错。
newrange1在本地窗口中包含什么? -
a) 你的内部循环产生了很多不必要的工作。
Application.Match更好。 -
只是一个想法,因为我曾经遇到过一个有点相关的问题:插入新的代码行,例如
Set cell1 = Nothing和Set newrange1 = Nothing之前将它们重新分配给新的范围(可能在...下一个...之前的循环结束。 -
... 并在执行
.EntireRow.Delete之前在即时窗口中检查? newrange1.Address。 excelcampus.com/vba/vba-immediate-window-excel -
@GSerg @Ralph 看来@Ryan 可能已经解决了我的问题——我想差不多了——我需要将
newrange1设置为Nothing,然后将cell1重置为下一个单元格。谢谢大家!