VBA - 使用If命令为活动单元集创建循环

时间:2016-12-22 13:58:48

标签: excel-vba loops if-statement range vba

我在应用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”,我无法理解为什么。

有人可以帮忙吗?

谢谢!

1 个答案:

答案 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