Excel宏for循环不能按预期工作

时间:2016-06-06 08:34:05

标签: excel macros

我有一个excel工作表,其中包含A列中的示例数据 第1行有一个 第2行有b 第3行有c 第4行 第5行有d

使用我的宏我想在所选单元格中的数据上方添加一个新行。由于第1行单元格有数据" a"宏应该添加一行并转到下一个单元格。第4行没有数据,所以它应该跳过这一行检查下一个

我有下面的宏

FinalRow = Cells(Rows.Count, 1).End(xlUp).Row + 1
       FinalRow1 = FinalRow + FinalRow
       ActiveSheet.Range("A1").Select
   For i = 1 To FinalRow1
    If Cells(i, 1).Value = vbNullString Then
    ActiveCell.Offset(rowOffset:=1, columnOffset:=0).Activate
     Else
    Selection.EntireRow.Insert , CopyOrigin:=xlFormatFromLeftOrAbove
    ActiveCell.Offset(rowOffset:=2, columnOffset:=0).Activate
        'ActiveCell.Offset(rowOffset:=1, columnOffset:=0).Activate
    End If
Next i

它似乎有时会工作,有时候它根本不会添加预期的行。

有人可以帮忙吗

2 个答案:

答案 0 :(得分:0)

FASTEST和DIRTY答案是:

FinalRow = Cells(Rows.Count, 1).End(xlUp).Row + 1
FinalRow1 = FinalRow + FinalRow
ActiveSheet.Range("A1").Select
For i = 1 To FinalRow1
If Cells(i, 1).Value = vbNullString Then
  ActiveCell.Offset(rowOffset:=1, columnOffset:=0).Activate
Else
  Selection.EntireRow.Insert , CopyOrigin:=xlFormatFromLeftOrAbove
  ActiveCell.Offset(rowOffset:=2, columnOffset:=0).Activate
  I = I +1 ' BECAUSE you have increased the next row number by 2
End If
Next i

真正的问题:你有一个包含2个运行数据的循环:

  • 循环变量I
  • 和ActiveCell的实际位置

当您插入行时,它们将不再显示相同的数据。

会更好

  • 如果您忘记了For循环并仅依赖ActiveCell.Offset位置
  • 如果您忘记了ActiveCell.Offset并且仅依赖For循环I变量。

无论哪种方式都可以,但你混合了 - 在我的回答中我留下了这个混合,只关注那个循环varable我和ActiveCell.Offset应该在偏移..; - )

答案 1 :(得分:0)

对您的代码进行了一些更改。但是从最后一行循环到第一行总是更好。

Sub Demo()
    Dim flag As Boolean
    finalrow = Cells(Rows.count, 1).End(xlUp).Row + 1
    FinalRow1 = finalrow + finalrow
    ActiveSheet.Range("A1").Select
    flag = False
    For i = 1 To FinalRow1
        If ActiveCell.Value = vbNullString Then
            ActiveCell.Offset(rowOffset:=1, columnOffset:=0).Activate
            flag = True
        Else
            If flag = False Then
                Selection.EntireRow.Insert , CopyOrigin:=xlFormatFromLeftOrAbove
                ActiveCell.Offset(rowOffset:=2, columnOffset:=0).Activate
            Else
                flag = False
                ActiveCell.Offset(rowOffset:=1, columnOffset:=0).Activate
            End If
        End If
    Next i
End Sub

此代码的一个缺点是,在不需要的情况下,它会循环几次,会在某些时候对其进行处理。