我们有一个空白的工作簿,我希望用户能够将参考编号列表粘贴到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
我想引用没有“+”的数字来删除整行。带有“+”的参考号可以正常工作。
这似乎有效,但必须多次运行才能删除没有“+”的所有行,我无法弄清楚原因。请帮忙
谢谢
答案 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