Excel VBA - 需要循环删除行上方的整行3行,其中单元格值<> 0

时间:2016-06-10 19:19:11

标签: excel vba excel-vba

好的,所以我有一张excel表,格式很差,我的目的是每天拉。默认情况下,数据以下列格式列出(在Excel工作表中查看):

x1,y1,z1,i1
  ,  ,z2,i2
  ,  ,z3,i3
****Blank row****
****Blank row****
****Blank row****
x2,y2,z4,i4,
  ,  ,z5,i5,
  ,  ,z6,i6,

^above would represent the last row for demontration purposes, but the real
sheet extends up 1000s of rows

为了以更友好的格式获取数据,我需要一个循环,从最后一行(erow)开始一直到第3行(数据开始的地方)。当它在第2列中找到一行<>时到“”,我希望它删除该单元格上方的整个3行,因此最终目标是将数据格式化为(如在Excel工作表上查看):

x1,y1,z1,i1
  ,  ,z2,i2
  ,  ,z3,i3
x2,y2,z4,i4
  ,  ,z5,i5
  ,  ,z6,i6

以下是我到目前为止的情况。当然,它根本不起作用,否则我不会在这里。它将我的所有数据删除到第3行,我无法弄清楚原因。任何想法将不胜感激。

Sub test()

Dim currentSht As Worksheet
Dim erow
Dim i As Integer

Set currentSht = ActiveWorkbook.Sheets(1)
erow = currentSht.Cells(Rows.Count, 3).End(xlUp).Row

For i = erow To 3 Step -3
If currentSht.Cells(i, 1).Value <> " " Then
    currentSht.Range(Cells(i, 1).Offset(-1), Cells(i, 1).Offset(-3)).EntireRow.Delete
End If
Next i

End Sub

2 个答案:

答案 0 :(得分:2)

这是因为你继续测试同一行并删除上面的3行。

让我们说i是30并且它解析为true,就像第2列中的数据一样。我们删除它上面的三行,使当前行,第27行,然后i迭代 - 3和i为27并且它测试相同的数据,并且对于相同的数据它再次解析为真。

所以我们需要强制i更改行号:

Sub test()

Dim currentSht As Worksheet
Dim erow
Dim i As Integer

Set currentSht = ActiveWorkbook.Sheets(1)
erow = currentSht.Cells(Rows.Count, 3).End(xlUp).Row

For i = erow To 3 Step -1
If Trim(currentSht.Cells(i, 1).Value) <> "" Then
    currentSht.Range(Cells(i, 1).Offset(-1), Cells(i, 1).Offset(-3)).EntireRow.Delete
    i = i - 3
End If
Next i

答案 1 :(得分:0)

尝试撤消IF

Sub test()

    Dim currentSht As Worksheet
    Dim erow
    Dim i As Integer

    Set currentSht = ActiveWorkbook.Sheets(1)
    erow = currentSht.Cells(Rows.Count, 3).End(xlUp).Row

    For i = erow To 3 Step -3
        If currentSht.Cells(i, 1).Value = "" Then
            currentSht.Range(Cells(i, 1).Offset(-1), Cells(i, 1).Offset(-3)).EntireRow.Delete
        End If
    Next i

End Sub