我在应用If命令时遇到一些困难,我想对所选范围的所有行执行。到目前为止,我有这个:
Dim x As Integer
NumRows = Range("J2", Range("J2").End(xlDown)).Rows.Count
Range("J2").Select
For x = 1 To NumRows
If ActiveCell.Value = "9995" Then
ActiveCell.Offset(0, 7).Value = ActiveCell.Offset(0, 3).Value
Else: ActiveCell.EntireRow.Delete
End If
ActiveCell.Offset(1, 0).Select
Next
从J2到数据列表末尾选择一系列单元格似乎没有问题。 找到包含“9995”的此范围内的单元格并执行命令将数据3单元格复制到“9995”单元格的右侧并将其粘贴到“9995”单元格右侧的7个单元格也没有问题。 它甚至删除活动单元格值不是“9995”的整行(这正是我想要的),但仅在某些情况下。它会留下一些行,其中活动单元格值不“9995”,我无法理解为什么。
有人可以帮忙吗?
谢谢!
答案 0 :(得分:1)
这里有一个主要问题和一些小问题。
主要问题是,无论何时循环和删除行,您都应该向后循环以避免下一行不再存在的问题......
小问题包括尽可能避免选择(或ActiveCell
),使用Range
而不是Long
指定任何Integer
引用的工作表,并使用{{ 1}}(总是一个好主意)。
把所有这些放在一起,试试这个:
Option Explicit
还值得指出的是,此代码假定数据从第2行开始,并且在第J列中没有间隙。如果其中任何一个不正确,它将无法正常工作,因此您可能需要重新考虑如何定义Option Explicit
Sub test()
Dim x As Long
Dim firstRow As Long
firstRow = 2
Dim lastRow As Long
With ActiveSheet
lastRow = .Range("J2").End(xlDown).Row
For x = lastRow To firstRow Step -1
If .Range("J" & x).Value = "9995" Then
.Range("J" & x).Offset(0, 7).Value = .Range("J" & x).Offset(0, 3).Value
Else
.Range("J" & x).EntireRow.Delete
End If
Next
End With
End Sub
。