1

我们有一个空白工作簿,我希望用户能够将参考编号列表粘贴到 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

我希望没有“+”的参考号删除整行。带有“+”的参考编号可以正常工作。

这似乎有效,但必须运行多次才能删除所有没有“+”的行,我不知道为什么。请帮忙

谢谢

4

1 回答 1

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
于 2013-08-05T16:14:00.053 回答