当值以加号('+')结束时删除Excel记录

时间:2013-08-05 15:50:32

标签: excel vba

我们有一个空白的工作簿,我希望用户能够将参考编号列表粘贴到A列中。其中一些参考编号最后会有一个“+”。

Sub texter1()
    With Sheets("texter")
    ll = .UsedRange.SpecialCells(xlCellTypeLastCell).Row
    For i = 1 To ll
      If InStr(1, .Range("a" & i).Value, "+", 1) Then
        .Range("b" & i).Formula = "=LEFT(A" & i & ", LEN(A" & i & ")-1)"
        .Range("c" & i).Value = Sheets("texter").Range("b" & i).Value
        .Range("d" & i).Formula = "=VLOOKUP($c" & i & ", _
            [Current_Master.xlsm]Master!$A$3:$BB$20000,14,FALSE)"
        .Range("e" & i).Formula = "=VLOOKUP($c" & i & ", _
            [Current_Master.xlsm]Master!$A$3:$BB$20000,15,FALSE)"
      Else
        Cells(i, "a").EntireRow.Delete
      End If
    Next i
    End With
End Sub

我想引用没有“+”的数字来删除整行。带有“+”的参考号可以正常工作。

这似乎有效,但必须多次运行才能删除没有“+”的所有行,我无法弄清楚原因。请帮忙

谢谢

1 个答案:

答案 0 :(得分:1)

只要影响迭代,就不能删除循环内的行。想象一下:你有4行;第二行符合条件并被删除;在下一次迭代中,计数器为3,但行号3现在是第四行(当你删除一行时,下面的所有行都上升到一个位置);因此,不会分析第3行。因此解决方案很简单:

Cells(i, "a").EntireRow.Clear()

如果要实际删除整行,则必须在主循环外执行。例如:将要删除的所有行存储在数组中,并在完成主循环后立即遍历此数组。

另一个替代方案是以相反的顺序(从最大行到最小行)在主循环中执行迭代,尽管此选项并不总是适用(不确定是否在您的情况下)并且可能引发进一步的问题。上面两个选项都足够好了,我已经提到过这个最后的选择,就像值得知道的那样。

---更新

要删除主循环后的行,您可以在这些行上使用某些内容:

'Declaration of variables
ReDim allRows(ll + 1) As Long
Dim allRowsCount As Long: allRowsCount = 0

在主循环中存储给定的行(现在您有Cells(i, "a").EntireRow.Delete):

For i = 1 To ll
'etc.

else
    allRowsCount = allRowsCount + 1
    allRows(allRowsCount) = i

循环完成后,您将浏览所有存储的行(按相反顺序)并删除它们:

If (allRowsCount > 0) Then

    Dim curRow As Long: curRow = allRowsCount + 1

    Do
        curRow = curRow - 1
        .Rows(allRows(curRow)).Delete
    Loop While (curRow > 1)

End If
End With
End Sub